EXPERTCAD Macro file "3lcube.mac"

99/10/13
modoru





/* 頂点と他の3つの角度を入力して立体を作図 */ /* その第2段階 */ /* */ /* 199* ** ** Fri a-shino */ /* */ Begin; #ANG=0; #Llong=100; /*   ↑ここの寸法を変えると立体の大きさが変わります*/ /*  100で1辺の長さが100mmの立体ができます。*/ Call (inpoint4); /* 4つのポイントを入力する */ /* 変数の置き換え 描画 */ !P1=!PQ2; !P2=!PQ3; !P3=!PQ1; Call (inpoint); IF (#ANG==0) THEN CALL (KEISAN); ENDIF; Call (ELIPS) ; !P1=!PQ3; !P2=!PQ4; !P3=!PQ1; Call (inpoint); IF (#ANG==0) THEN CALL (KEISAN); ENDIF; Call (ELIPS) ; !P1=!PQ4; !P2=!PQ2; !P3=!PQ1; Call (inpoint); IF (#ANG==0) THEN CALL (KEISAN); ENDIF; Call (ELIPS) ; End; BEGIN inpoint4;/* 4つのポイントを入力する */ CMD(^S); #Ss=sqrt(3/2); /* 等角図による作図なので! */ /* / \ */ /* / \ */ /* PQ4/ P \PQ3 */ /* |\ /| */ /* | \ / | */ /* | \ / | */ /* | R |PQ1 | */ /* \ | Q / */ /* \ | / */ /* U \|/ V */ /* PQ2 */ /* ――――――――― */ /* 各点を入力順序は一応上の図のとうり */ *INPUT1: !PQ1=^$(P,"頂点位置を指定してください"); !PQ2=^$(P,"縦軸線上の点を指定してください"); !PQ3=^$(P,"右辺線上の点を指定してください"); !PQ4=^$(P,"左辺線上の点を指定してください"); #AAA=ANG2P(!PQ1,!PQ2); /* PQ1,QP2 の角度を求める 90度を基準とする*/ #AAW=#AAA-90; /* PQ1,PQ2 の90度からの傾きを求めておく */ #AAV=ANG2P(!PQ1,!PQ3); /* 角度Vを求める */ #AAU=ANG2P(!PQ1,!PQ4); /* 角度Uを求める */ #V=tan(#AAV-#AAW); /* PQ1,PQ2を90度としたときの角 U Vのtan()値*/ #U=tan(180-#AAU+#AAW); #p=asin(sqrt(#U*#V)); /* 理論上の傾斜角を求める */ #a=atan(sqrt(#V/#U)); /* 理論上の回転角を求める */ #Ps=cos(#p); /* PQ1-PQ2 方向の縮み率 */ #Qs=cos(asin(cos(#a)*cos(#p))); /* PQ1-PQ4 方向の縮み率 */ #Rs=cos(asin(sin(#a)*cos(#p))); /* PQ1-PQ3 方向の縮み率 */ !PQ2=DIRP(!PQ1,#Llong*#Ss*#Ps,#AAA); /* cmd(line !PQ1 !PQ2 ^S); */ /* PQ1-PQ2 の軸線 */ !PQ4=DIRP(!PQ1,#Llong*#Ss*#Qs,#AAU); /* cmd(line !PQ1 !PQ4 ^S); */ /* PQ1-PQ4 の軸線 */ !PQ3=dirp(!PQ1,#Llong*#Ss*#Rs,#AAV); /* cmd(line !PQ1 !PQ3 ^S); */ /* PQ1-PQ3 の軸線 */ END; /* ----------------------------------------------------------------- */ BEGIN INPOINT ; /* 3つのポイントを入力する */ CMD(^S); #AA=ANG2P(!P1,!P3); /* 図面のX軸と頂点1と頂点3のなす角*/ !P0= MIDP(!P1,!P2); /* 楕円の中心になるべき点 */ #L1=DISPP(!P1,!P3); /* 共役直径1 */ #L2=DISPP(!P2,!P3); /* 共役直径2 */ !P4=!P2.X-(!P3.X-!P1.X), !P2.Y-(!P3.Y-!P1.Y) ; #A1=ANG3P(!P1,!P3,!P4); /* 平行四辺形が長方形の場合の処理 */ IF (DISPP(!P1,!P2)-DISPP(!P3,!P4)==0) THEN #ANG=90; /* 90度の場合の判定用変数 */ #As=ANG3P(!P1,!P3,!P4); /* 軸1傾き(図形に対する相対角度) */ #Al=ANG3P(!P1,!P3,!P4)+90; /* 軸2傾き(図形に対する相対角度) */ #Ls=0.5*DISPP(!P1,!P4); /* 軸1半径   */ #Ll=0.5*DISPP(!P1,!P3); /* 軸2半径   */ ENDIF; /*   P4____PA_____P2 */ /*   / .P0 / */ /* / /    */ /*P1  ̄ ̄ ̄ ̄ ̄P3 として */ /* */ /* 各ポイントの点を結んで平行四辺形を描く */ GLINE(!P1,!P4); GLINE(!P4,!P2); /* GLINE(!P1,!P3); GLINE(!P3,!P2); */ END; /* ------------------------------------------------ */ BEGIN KEISAN ; /* 以後の座標の計算は底辺の傾き0度点P0を0,0として計算 */ /* KEISAN の中のP1,P2,P3,P4 は INPOINT の点と異なる */ /*    ____PA_____ */ /*   / .P0 / */ /* / /     */ /*  ̄ ̄ ̄ ̄ ̄ */ #L1=0.5*#L1; /* L1を共役半径1とする */ #L2=0.5*#L2; /* L2を共役半径2とする */ !PA.X=#L2*COS(#A1); !PA.Y=#L2*SIN(#A1); /* 角度2を求める */ #A2=ATAN( (#L2*SIN(#A1)+#L1) / (#L2*COS(#A1)) ); /* r1 を求める */ #r1=0.5*SQRt(#L2*#L2 + #L1*#L1 - 2*#L1*#L2*SIN(#A1)); /* P3 を求める */ !P3.X=0.5* #L2*COS(#A1)-#r1*COS(#A2); !P3.Y=0.5*(#L2*SIN(#A1)-#L1)-#r1*SIN(#A2); /* P4 を求める */ !P4.X=0.5* #L2*COS(#A1)+#r1*COS(#A2); !P4.Y=0.5*(#L2*SIN(#A1)-#L1)+#r1*SIN(#A2); /* 短軸、長軸の傾きを求める */ #As=ANG2P((0,0),!P3); /*短軸傾き*/ #Al=ANG2P((0,0),!P3)+90; /*長軸傾き*/ #Ls=DISPP(!PA,!P4); /* 短軸長 */ #Ll=DISPP(!PA,!P3); /* 長軸長 */ END; /* ----------------------------------------------------------------- */ BEGIN ELIPS ; /* 短軸、長軸 を求める */ #As=#As+#AA; /* 短軸傾きに元の平行四辺形の傾きを追加*/ #Al=#Al+#AA; /* 長軸傾きに元の平行四辺形の傾きを追加*/ GLINE(!P0,DIRP(!P0,#Ls,#As)); /* 短軸  */ GOTO *KAKE; GLINE(!P0,DIRP(!P0,#Ll,#Al)); /* 長軸  */ *KAKE: GELPCP(!P0, #Ls, #Ll, #As); /* 目的楕円 */ END;


↑以上ここまで 前の部屋にもどります。