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;
↑以上ここまで
前の部屋にもどります。