/* #TITLE# ベルトの長さを測定するマクロ */ /* TENSION.MAC 2002.12.2 by kita*/ clear(); /* 入力と基本座標の取得 */ echo "円(1)を指示してください"; VER [getpnt(1)] /*中心をシステムレジスターに保存*/ xc1 = #VERXC; yc1 = #VERYC; rr1 = #VERRAD; r1 = pdg(xc1,yc1); echo "円(2)を指示してください"; VER [getpnt(1)] /*中心をシステムレジスターに保存*/ xc2 = #VERXC; yc2 = #VERYC; rr2 = #VERRAD; r2 = pdg(xc2,yc2); echo "円(3)を指示してください"; VER [getpnt(1)] /*中心をシステムレジスターに保存*/ xc3 = #VERXC; yc3 = #VERYC; rr3 = #VERRAD; r3 = pdg(xc3,yc3); if (xc1 == xc3 && yc1 == yc3){ /* テンション無しの場合 */ goto label; } r12 = r2 - r1; r12_r = +r12; r12_th = atan2(yc2-yc1,xc2-xc1); r23 = r3 - r2; r23_r = +r23; r23_th = atan2(yc3-yc2,xc3-xc2); r31 = r1 - r3; r31_r = +r31; r31_th = atan2(yc1-yc3,xc1-xc3); /* 外積の z 座標で右回り(-) or 左回り(+)判定 */ pm = r31[0]*r12[1]-r31[1]*r12[0]; pm = (+pm)/pm; /* 円1と円2の接線 ra12 */ rb12_r = rr1 - rr2; rb12_th = r12_th - pm*acos(rb12_r / r12_r); rb12 = pdg(rb12_r*cos(rb12_th),rb12_r*sin(rb12_th)); rbb12 = pdg(rr1*cos(rb12_th),rr1*sin(rb12_th)); ra12 = r12 - rb12; ra12_th = atan2(ra12[1],ra12[0]); /* 円2と円3の接線 ra23 */ rb23_r = rr2 - rr3; rb23_th = r23_th - pm*acos(rb23_r / r23_r); rb23 = pdg(rb23_r*cos(rb23_th),rb23_r*sin(rb23_th)); rbb23 = pdg(rr2*cos(rb23_th),rr2*sin(rb23_th)); ra23 = r23 - rb23; ra23_th = atan2(ra23[1],ra23[0]); /* 円3と円1の接線 ra31 */ rb31_r = rr3 - rr1; rb31_th = r31_th - pm*acos(rb31_r / r31_r); rb31 = pdg(rb31_r*cos(rb31_th),rb31_r*sin(rb31_th)); rbb31 = pdg(rr3*cos(rb31_th),rr3*sin(rb31_th)); ra31 = r31 - rb31; ra31_th = atan2(ra31[1],ra31[0]); /* 作画 */ LBP [r1+rbb12] [r1+rbb12+ra12] LBP [r2+rbb23] [r2+rbb23+ra23] LBP [r3+rbb31] [r3+rbb31+ra31] /* 長さの計算 */ rbb12_th = atan2(rbb12[1],rbb12[0]); rbb23_th = atan2(rbb23[1],rbb23[0]); rbb31_th = atan2(rbb31[1],rbb31[0]); rc12 = rot(rbb12,-rbb31_th); rc23 = rot(rbb23,-rbb12_th); rc31 = rot(rbb31,-rbb23_th); rc12_th = atan2(rc12[1],rc12[0]); rc23_th = atan2(rc23[1],rc23[0]); rc31_th = atan2(rc31[1],rc31[0]); if (pm == 1){ /* 左回転 */ if(rc12_th < 0){ ko1_th = rc12_th + 360; }else{ ko1_th = rc12_th; } if(rc23_th < 0){ ko2_th = rc23_th + 360; }else{ ko2_th = rc23_th; } if(rc31_th < 0){ ko3_th = rc31_th + 360; }else{ ko3_th = rc31_th; } } if (pm == -1){ /* 右回転 */ if(rc12_th > 0){ ko1_th = 360 - rc12_th; }else{ ko1_th = -rc12_th; } if(rc23_th > 0){ ko2_th = 360 - rc23_th; }else{ ko2_th = -rc23_th; } if(rc31_th > 0){ ko3_th = 360 - rc31_th; }else{ ko3_th = -rc31_th; } } ko1 = pi*rr1*(ko1_th)/180; ko2 = pi*rr2*(ko2_th)/180; ko3 = pi*rr3*(ko3_th)/180; l_ttl = ko1 + ko2 + ko3 + (+ra12) + (+ra23) + (+ra31); ss = sprint("全長 = %8.3f",l_ttl); GNT [ss] /* echo "ra12_x=" (ra12[0]) " ra12_y=" (ra12[1]); echo "ra23_x=" (ra23[0]) " ra23_y=" (ra23[1]); echo "ra31_x=" (ra31[0]) " ra31_y=" (ra31[1]); GNT [pm] <0,-20> GNT [ko1_th] <0,0> GNT [ko2_th] <0,10> GNT [ko3_th] <0,20> GNT [+ra12] <0,30> GNT [+ra23] <0,40> GNT [+ra31] <0,50> GNT [l_ttl] < 0, 60 > */ exit; label: /* テンション無しの場合 */ /* 円1と円2の接線 ra12 */ r12 = r2 - r1; r12_th = atan2(yc2-yc1,xc2-xc1); rb12_r = rr1 - rr2; rb12_th = r12_th + acos(rb12_r / (+r12)); rb12 = pdg(rb12_r*cos(rb12_th),rb12_r*sin(rb12_th)); rbb12 = pdg(rr1*cos(rb12_th),rr1*sin(rb12_th)); ra12 = r12 - rb12; ra12_th = atan2(ra12[1],ra12[0]); /* 円2と円1の接線 ra21 */ r21 = r1 - r2; rb21_r = rr2 - rr1; r21_th = atan2(yc1-yc2,xc1-xc2); rb21_th = r21_th + acos(rb21_r / (+r21)); rb21 = pdg(rb21_r*cos(rb21_th),rb21_r*sin(rb21_th)); rbb21 = pdg(rr2*cos(rb21_th),rr2*sin(rb21_th)); ra21 = r21 - rb21; ra21_th = atan2(ra21[1],ra21[0]); /* 長さ計算 */ pm = rbb12[0]*ra12[1]-rbb12[1]*ra12[0]; /* 回転方向 右(-) 左(+) */ pm = (+pm)/pm; rbb21_th = atan2(rbb21[1],rbb21[0]); rc12 = rot(rbb12,pm*rbb21_th); rc12_th = atan2(rc12[1],rc12[0]); if (pm == 1){ /* 左回転 */ if(rc12_th < 0){ ko1_th = rc12_th + 360; }else{ ko1_th = rc12_th; } } if (pm == -1){ /* 右回転 */ if(rc12_th > 0){ ko1_th = 360 - rc12_th; }else{ ko1_th = -rc12_th; } } ko2_th = 360 - ko1_th; ko1 = pi*rr1*(ko1_th)/180; ko2 = pi*rr2*(ko2_th)/180; /* 作画 */ LBP [r1+rbb12] [r1+rbb12+ra12] LBP [r2+rbb21] [r2+rbb21+ra21] /* GNT [ko1_th] <0,0> GNT [ko2_th] <0,10> GNT [+ra12] < 0, 20 > GNT [pm] < 0, 60 > */ l_ttl = ko1 + ko2 + (+ra12) + (+ra21); ss = sprint("全長 = %8.3f",l_ttl); GNT [ss] exit;