おこちゃんの測量プログラム

測量に役立つかもしれないBASICプログラムを公開

9.クロソイド曲線との交点計算 (F-BASIC)

lprint type"dc"
'-----------クロソイドの交点計算-------------
defdbl A,C,D,K-Z:defstr H,N:defint B,I,J
PI=3.141592653589793#:EE=0.0000000001#
RA=206264.806471#:RAA=180#/PI:RRA=PI/180#
dim N1$(10),N$(10),TTT(10),TT(10),TTR(10),TS(10),TR(10),X(10),Y(10),T1(10),XP(10),YP(10),L(10),H$(10),S4(10),RR(10)
def fnRAN(T)=(fix(T)+fix*1*100#)/60#+(T*100#-fix(T*100#))/36#)/RAA:'---度分秒からラジアン
def fnDEG(T)=fix(T)+fix(((T)-fix(T))*100#)/60#+*2/0.36#:'-----度分秒から度へ------
def fnDMS(T)=fix(T)+fix*3*60#)/100#+*4*60#-fix*5*60#))*0.006#:'-----度から度分秒へ------
def fnX(L,R)=L*(1#-*6+PI/2#)*RAA:'-----------ア-クコサイン
HH$="          ------------------------------"
'-----------------
*SENTAKU1
cls:locate 25,3:print"計算の項目を選択して下さい。"
locate 20,6:print"クロソイド曲線への垂線(出尺)・・・・・・1"
locate 20,8:print"クロソイド曲線と直線との交点計算・・・・・2"
locate 20,10:print"クロソイド曲線と円曲線との交点計算・・・・3"
locate 20,12:print"クロソイド曲線どおしの交点計算・・・・・・4"
locate 20,14:print"クロソイド曲線の要素の計算・・・・・・・・5"
locate 20,16:print"クロソイド曲線の中間点の座標計算・・・・・6"
locate 20,18:print"作 業 終 了・・・・・・・・・・・・・・7"
locate 25,21:input"番号を選択して下さい。  ";JO
if JO<1 or JO>7 then *SENTAKU1
on JO goto *SUISEN,*CYOKUSEN,*KUROEN,*KUROKURO,*YOUSO,*ZAHYOU,*ENDD1
'
goto *SENTAKU1
'
*SUISEN:'-----クロソイド曲線への垂線(出尺)-----
'-----作業メニュ------
cls:locate 15,2:print "-----クロソイド曲線への垂線(出尺)-----"
gosub *MENU1
on JJA goto *DATRIN1,*SYUSEI1,*KEISAN1,*SENTAKU1
'
*DATRIN1:'-------デ-タ 入力-------
cls:locate 15,1:print "-----------デ-タの入力-----------"
locate 20,4:input "KAの点名     ";N1$
locate 20,5:input "   座標  X= ";X1
locate 20,6:input "   座標  Y= ";Y1
locate 20,8:input "   方向角  T= ";T0
locate 20,9:input "パラメ-タ    A= ";A0
locate 20,10:input "半 径        R= ";R0:J=0
*41
cls:J=J+1:B=J
locate 20,10:input "P点の点名     ";N$(J)
locate 20,12:input "   座標  X= ";X(J)
locate 20,14:input "   座標  Y= ";Y(J)
locate 20,16:input "   交点名  = ";N1$(J)
locate 30,19:print"次の点------1"
locate 30,20:print"終 了------2"
*50:locate 30,22:input "番号指定  ";I
if I<1 or I>2 then *50
locate 35,10:print"                        "
locate 35,12:print"                        "
locate 35,14:print"                        "
locate 35,16:print"                        "
on I goto *41,*SUISEN
'
*SYUSEI1:'--------デ-タ-の修正-----------
cls:locate 20,6:print "--------デ-タ-の修正-----------"
locate 20,9:print "KAの点名・・・・・・1"
locate 20,10:print "   座標  X=・・2"
locate 20,11:print "   座標  Y=・・3"
locate 20,13:print "   方向角  T=・・4"
locate 20,14:print "パラメ-タ    A=・・5"
locate 20,15:print "半 径        R=・・6"
locate 20,17:print "P点の修正 ・・・・・7"
locate 20,19:print "終 了・・・・・・・8"
'
*40:locate 35,21:input "番号を指定して下さい。";JJ
if JJ<1 or JJ>8 then *40
on JJ goto *63,*64,*65,*66,*67,*68,*69,*SUISEN
'
*63:cls:locate 20,12:input "KAの点名     ";N1$:goto *SYUSEI1
*64:cls:locate 20,12:input "   座標  X= ";X1:goto *SYUSEI1
*65:cls:locate 20,12:input "   座標  Y= ";Y1:goto *SYUSEI1
*66:CLS:locate 20,12:input "   方向角  T= ";T0:goto *SYUSEI1
*67:cls:locate 20,12:input "パラメ-タ    A= ";A0:goto *SYUSEI1
*68:cls:locate 20,12:input "半 径        R= ";R0:goto *SYUSEI1
*69:cls:locate 20,8:input "何番目の点か番号指定   ";J
locate 20,10:input "P点の点名     ";N$(J)
locate 20,12:input "   座標  X= ";X(J)
locate 20,14:input "   座標  Y= ";Y(J)
locate 20,16:input "   交点名  = ";N1$(J):goto *SYUSEI1
'
*KEISAN1:'------計 算 中---------
'------------計算書作成------------
cls:locate 30,12:print "印 刷 中"
lprint:lprint:lprint:lprint:lprint:lprint:lprint:lprint tab(30)"クロソイド曲線への垂線計算書":lprint:lprint:lprint:lprint
lprint using "             &    &  X1=#######.#####    Y1=#######.#####";N1$,X1,Y1:lprint
AN=T0:gosub *DOFUNBYO1
lprint using "                 T0=#### ## ##.##    A =#######        R =#######";V1,V2,V3,A0,R0:lprint
lprint HH$:lprint
TR0=fnRAN(T0)
AA=A0:RR=R0:gosub *YOUSOSUB:S01=S0
T1=tan(TR0+SGM*sgn(R0)):T2=tan(TR0+TAU*sgn(R0)+PI/2#):gosub *KOUTENSUB:LL=SS1
for J=1 to B
X2=X(J):Y2=Y(J)
*90:RR=A0*A0/LL:gosub *YOUSOSUB:T1=tan(TR0+SGM*sgn(R0)):T2=tan(TR0+TAU*sgn(R0)+PI/2#)
gosub *KOUTENSUB:DS=SS1-S0:LL=LL+DS
if abs(DS)>abs(0.00004) then *90
TZ=TR0+SGM*sgn(R0):S4(J)=SS2:TAA=fnDEG(T0)+TAU*RAA*sgn(R0)
XP(J)=X1+cos(TZ)*S0:YP(J)=Y1+sin(TZ)*S0
if TAA>=360# then TAA=TAA-360#
if TAA<0 then TAA=TAA+360#
TT(J)=fnDMS(TAA):L(J)=LL:R(J)=RR:S0(J)=S0
TN=SGM*RAA:SGM(J)=fnDMS(TN):TN=TAU*RAA:TAU(J)=fnDMS(TN)
'
lprint using "                &   &X =#######.#####    Y=#######.##### ";N$(J),X(J),Y(J):lprint
lprint using "           交点 &   &XP=#######.#####   YP=#######.#####    L=######.#####";N1$(J),XP(J),YP(J),L(J):lprint
AN=TT(J):gosub *DOFUNBYO1
lprint using "               離れ   S=  #####.#####    T=#### ## ##.###   R=######.#####";S4(J),V1,V2,V3,R(J):lprint
AN=TAU(J):gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3
AN=SGM(J):gosub *DOFUNBYO1
lprint using "                    S0=  #####.#####   τ=#### ## ##.###  σ=#### ## ##.###";S0(J),V4,V5,V6,V1,V2,V3:lprint
lprint HH$:lprint
next J
lprint chr$(12);
'
goto *SUISEN
'
*CYOKUSEN:'-----------クロソイド曲線と直線との交点計算------------
locate 20,5:print "***作業メニュ- ***"
gosub *MENU1
on JJA goto *DATRIN2,*SYUSEI2,*KEISAN2,*SENTAKU1
'
*DATRIN2:'-------デ-タ 入力-------
cls:locate 20,1:print "-----------デ-タの入力-----------"
locate 20,4:input "KAの点名      ";N0$
locate 20,5:input "   座標   X= ";X0
locate 20,6:input "   座標   Y= ";Y0
locate 20,8:input "   方向角   T= ";T0
locate 20,9:input "パラメ-タ     A= ";A0
locate 20,10:input "半 径         R= ";R0
locate 20,12:input "P1の点名      ";N1$
locate 20,13:input "   座標  X1= ";X(1)
locate 20,14:input "   座標  Y1= ";Y(1)
locate 20,16:input "P2の点名         ";N2$
locate 20,17:input "   座標  X2= ";X(2)
locate 20,18:input "   座標  Y2= ";Y(2)
locate 20,20:input "   交点名   = ";N3$
'
goto *CYOKUSEN
'
*SYUSEI2:'--------デ-タ-の修正-----------
cls:locate 20,1:print "--------デ-タ-の修正-----------"
locate 20,3:print "KAの点名  ・・・・・・1"
locate 20,4:print "   座標  X=・・・・2"
locate 20,5:print "   座標  Y=・・・・3"
locate 20,7:print "   方向角  T=・・・・4"
locate 20,8:print "パラメ-タ      A=・・5"
locate 20,9:print "半 径          R=・・6"
locate 20,11:print " P1の点名  ・・・・・・7"
locate 20,12:print "    座標  X=・・・・8"
locate 20,13:print "    座標  Y=・・・・9"
locate 20,15:print " P2の点名  ・・・・・10"
locate 20,16:print "    座標  X=・・・11"
locate 20,17:print "    座標  Y=・・・12"
locate 20,18:print "交点名    ・・・・・・13"
locate 20,20:print "終 了   ・・・・・・14"
'
*146:locate 25,22:input "番号を指定して下さい。  ";JJ
if JJ<1 or JJ>14 then *146
on JJ goto *150,*151,*152,*153,*154,*155,*156,*157,*158,*159,*160,*161,*162,*CYOKUSEN
'
*150:cls:locate 20,12:input "KAの点名       ";N0$:goto *SYUSEI2
*151:cls:locate 20,12:input "座標    X= ";X0:goto *SYUSEI2
*152:cls:locate 20,12:input "座標    Y= ";Y0:goto *SYUSEI2
*153:cls:locate 20,12:input "方向角     T= ";T0:goto *SYUSEI2
*154:cls:locate 20,12:input "パラメ-タ A= ";A0:goto *SYUSEI2
*155:cls:locate 20,12:input "半 径     R= ";R0:goto *SYUSEI2
*156:cls:locate 20,12:input "P1の点名    ";N1$:goto *SYUSEI2
*157:cls:locate 20,12:input "座標    X1= ";X(1):goto *SYUSEI2
*158:cls:locate 20,12:input "座標    Y1= ";Y(1):goto *SYUSEI2
*159:cls:locate 20,12:input "P2の点名       ";N2$:goto *SYUSEI2
*160:cls:locate 20,12:input "座標    X2= ";X(2):goto *SYUSEI2
*161:cls:locate 20,12:input "座標    Y2= ";Y(2):goto *SYUSEI2
*162:cls:locate 20,12:input "交点名  =    ";N3$:goto *SYUSEI2
'
*KEISAN2:'---------計 算 中---------
DX=X(2)-X(1):DY=Y(2)-Y(1):gosub *STSUB:T2=tan(TD):S0=SS:TN=TD*RAA:TA0=fnDMS(TN)
X1=X0:Y1=Y0:X2=X(1):Y2=Y(1):TR0=FNRAN(T0):T1=TAN(TN):gosub *KOUTENSUB:LL=SS:AA=A0
*168:RR=A0*A0/LL:gosub *YOUSOSUB:T1=tan(TR0+SGM*sgn(R0))
gosub *KOUTENSUB:DS=SS1-S0:LL=LL+DS
if abs(DS)>0.00002 then *168
S4(J)=SS2:TT(J)=TT2:L(J)=LL:R(J)=RR:S0(J)=S0
TN=SGM*RAA:SGM1=fnDMS(TN):TN=TAU*RAA:TAU1=fnDMS(TN)
gosub *KOUTENSUB
'
'------------計算書作成------------
cls:locate 30,12:print "印 刷 中"
lprint:lprint:lprint:lprint:lprint:lprint:lprint:lprint tab(30)"クロソイド曲線と直線の交点計算書":lprint:lprint:lprint:lprint
lprint using "             &    &  X0=#######.#####    Y0=#######.#####";N0$,X0,Y0:lprint
AN=T0:gosub *DOFUNBYO1
lprint using "                 T0=#### ## ##.###   A =#######        R =#######";V1,V2,V3,A0,R0:lprint
lprint using "             &    &  X1=#######.#####    Y1=#######.##### ";N1$,X(1),Y(1):lprint
lprint using "             &    &  X2=#######.#####    Y2=#######.##### ";N2$,X(2),Y(2):lprint
lprint HH$:lprint
lprint using "           交点 &   &XP=#######.#####    YP=#######.#####    L=######.#####";N3$(J),XP,YP,LL:lprint
AN=TT2:gosub *DOFUNBYO1
lprint using "               離れ   S=  #####.#####    T=#### ## ##.###    R=######.#####";SS2,V1,V2,V3,RR*sgn(R0):lprint
AN=TAU1:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=SGM1:gosub *DOFUNBYO1
lprint using "                    S0=#######.#####   τ=#### ## ##.###   σ=#### ## ##.###";S0,V4,V5,V6,V1,V2,V3:lprint
lprint HH$:lprint
lprint chr$(12);
'
goto *CYOKUSEN
'
*KUROEN:'-----------クロソイド曲線と円曲線との交点計算------------
cls:locate 15,1:print "*** クロソイド曲線と円曲線との交点計算 ***"
'----------- 作業メニュ- -----------
gosub *MENU1
on JJA goto *DATRIN3,*SYUSEI3,*KEISAN3,*SENTAKU1
'
*DATRIN3:'-------デ-タ 入力-------
cls:locate 20,2:print "-----------デ-タの入力-----------"
locate 20,4:input "KAの点名      ";N0$
locate 20,5:input "   座標   X= ";X0
locate 20,6:input "   座標   Y= ";Y0
locate 20,8:input "   方向角   T= ";T0
locate 20,9:input "パラメ-タ     A= ";A0
locate 20,10:input "半 径         R= ";R0
locate 20,12:input "BCの点名      ";N1$
locate 20,13:input "   座標  X1= ";X(1)
locate 20,14:input "   座標  Y1= ";Y(1)
locate 20,15:input "   方向角  T1= ";TB
locate 20,16:input "      半 径   R= ";R1
locate 20,18:input "   交点名   = ";N2$:goto *KUROEN
'
*SYUSEI3:'--------デ-タ-の修正-----------
cls:locate 20,1:print "--------デ-タ-の修正-----------"
locate 20,3:print "KAの点名  ・・・・・・1"
locate 20,4:print "   座標  X=・・・・2"
locate 20,5:print "   座標  Y=・・・・3"
locate 20,7:print "   方向角  T=・・・・4"
locate 20,8:print "パラメ-タ  A=・・・・5"
locate 20,9:print "半 径      R=・・・・6"
locate 20,11:print "P1の点名   ・・・・・7"
locate 20,12:print "   座標   X=・・・8"
locate 20,13:print "   座標   Y=・・・9"
locate 20,15:print "      方向角   T1=・・10"
locate 20,16:print "      半 径    R=・・11"
locate 20,17:print "      交点名 ・・・・12"
locate 20,19:print "終 了   ・・・・・13"
'
*225:locate 35,21:input "番号を指定して下さい。";JJ
if JJ<1 or JJ>13 then *225
on JJ goto *229,*230,*231,*232,*233,*234,*235,*236,*237,*238,*239,*240,*KUROEN
'
*229:cls:locate 20,6:input "KAの点名     ";N0$:goto *SYUSEI3
*230:cls:locate 20,8:input "座標        X= ";X0:goto *SYUSEI3
*231:cls:locate 20,10:input "座標       Y= ";Y0:goto *SYUSEI3
*232:cls:locate 20,12:input "方向角       T= ";T0:goto *SYUSEI3
*233:cls:locate 20,12:input "パラメ-タ   A= ";A0:goto *SYUSEI3
*234:cls:locate 20,12:input "半 径       R= ";R0:goto *SYUSEI3
*235:cls:locate 20,12:input "BCの点名      ";N1$:goto *SYUSEI3
*236:cls:locate 20,12:input "  座標  X1= ";X(1):goto *SYUSEI3
*237:cls:locate 20,12:input "  座標  Y1= ";Y(1):goto *SYUSEI3
*238:cls:locate 20,12:input "   方向角  T1= ";TB:goto *SYUSEI3
*239:cls:locate 20,12:input "   半 径   R= ";R1:goto *SYUSEI3
*240:cls:locate 20,12:input "  交点名   = ";N2$:goto *SYUSEI3
'
*KEISAN3:'---------計 算 中---------
TR0=fnRAN(T0):TRB=fnRAN(TB):TR2=TRB+PI/2#*sgn(R1):T1=tan(TR0):RR=R0
X(3)=X(1)+cos(TR2)*R1*sgn(R1):Y(3)=Y(1)+sin(TR2)*R1*sgn(R1):'----------------円の中心
DX=X0-X(3):DY=Y0-Y(3):T2=DX*T1-DY:TT2=T2:gosub *ENCYOKUSUB
cls:locate 20,5:print "--------座標値の指定-----------"
locate 20,8:print using"X1=#######.###  Y1=#######.###・・・1";XP1,YP1
locate 20,10:print USING"X2=#######.###  Y2=#######.###・・・2";XP2,YP2
'
*254:locate 30,13:INPUT"番号を指定する。 ";JJ
if JJ<1 or JJ>2 then *254
on JJ goto *257,*258
*257:XP=XP1:YP=YP1:GOTO *259
*258:XP=XP2:YP=YP2
*259
DX=XP-X0:DY=YP-Y0:gosub *STSUB:LL=SS:AA=A0
*280
cls:locate 30,12:print "計 算 中"
RR=A0*A0/LL:gosub *YOUSOSUB:TZ=(TR0+SGM*sgn(R0)):T1=tan(TZ):T2=TT2:TX=TZ*RAA
XC=X0+cos(TZ)*S0:YC=Y0+sin(TZ)*S0:T1=tan(TR0+TAU*sgn(R0))
DX=XC-X(3):DY=YC-Y(3):T2=DX*T1-DY:gosub *ENCYOKUSUB
cls:locate 20,5:print "--------座標値の指定-----------"
locate 20,8:print using"X1=#######.###  Y1=#######.###・・・1";XP1,YP1
locate 20,10:print USING"X2=#######.###  Y2=#######.###・・・2";XP2,YP2
'
*288:locate 30,13:INPUT"番号を指定する。 ";JJ
if JJ<1 or JJ>2 then *288
on JJ goto *291,*292
*291:XP=XP1:YP=YP1:GOTO *293
*292:XP=XP2:YP=YP2
*293
DX=XP-XC:DY=YP-YC:gosub *STSUB:DS=SS:DX=XP-X0:DY=YP-Y0:gosub *STSUB:D2=LL-SS:LL=LL-DS*sgn(D2)
if DS>0.00004 then *280
TN=SGM*RAA:SGM1=fnDMS(TN):TN=TAU*RAA:TAU1=fnDMS(TN)
DX=XP-X(1):DY=YP-Y(1):gosub *STSUB:TIP=SS/2#/R1:TIP1=fnASI(TIP)*2#:CL=R1*TIP1/RAA:TIP2=fnDMS(TIP1)
TB1=(TRB+TIP1/RAA)*RAA:TTB=fnDMS(TB1):TA1=(TR0+TAU)*RAA:TTA=fnDMS(TA1)
'
'------------計算書作成------------
cls:locate 30,12:print "印 刷 中"
lprint:lprint:lprint:lprint:lprint:lprint:lprint:lprint tab(30)"クロソイド曲線と円曲線の交点計算書":lprint:lprint:lprint:lprint
lprint using "             &    &  X0=#######.#####    Y0=#######.#####";N0$,X0,Y0:lprint
AN=T0:gosub *DOFUNBYO1
lprint using "                 T0=#### ## ##.###   A =#######        R =#######";V1,V2,V3,A0,R0:lprint
lprint using "             &    &  X1=#######.#####    Y1=#######.##### ";N1$,X(1),Y(1):lprint
AN=TB:gosub *DOFUNBYO1
lprint using "                 TB=#### ## ##.###                     R =#######";V1,V2,V3,R1:lprint
lprint HH$:lprint
lprint using "           円の中心 XM=#######.#####   YM=#######.#####";X(3),Y(3):lprint
lprint using "           交点 &   &XP=#######.#####   YP=#######.##### ";N3$(J),XC,YC:lprint
AN=TTA:gosub *DOFUNBYO1
lprint using "                     L =  #####.#####   T1=#### ## ##.###";LL,V1,V2,V3:lprint
AN=TTB:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=TIP2:gosub *DOFUNBYO1
lprint using "                     CL=  #####.#####   T2=#### ## ##.###  IA=#### ## ##.###";CL,V4,V5,V6,V1,V2,V3:lprint
AN=TAU1:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=SGM1:gosub *DOFUNBYO1
lprint using "                    S0=  #####.#####   τ=#### ## ##.###  σ=#### ## ##.###";S0,V4,V5,V6,V1,V2,V3:lprint
lprint HH$:lprint
lprint chr$(12);
'
goto *KUROEN
'
*KUROKURO:'---------------クロソイド曲線どおしの交点計算-------------
cls:locate 15,2:print "*** クロソイド曲線どおしの交点計算 ***"
gosub *MENU1
on JJA goto *DATRIN4,*SYUSEI4,*KEISAN4,*SENTAKU1
'
*DATRIN4:'-------デ-タ 入力-------
cls:locate 20,2:print "-----------デ-タの入力-----------"
locate 20,5:input "KA1   点名          ";N1$
locate 20,6:input "   座標        X1= ";XA
locate 20,7:input "   座標        Y1= ";Ya
locate 20,9:input "   方向角    T1= ";TA
locate 20,10:input "   クロソイド  A1= ";AA1
locate 20,11:input "   半 径     R1= ";RA
locate 20,13:input "KA2    点名          ";N2$
locate 20,14:input "   座標       X2= ";XB
locate 20,15:input "   座標       Y2= ";YB
locate 20,16:input "   方向角    T2= ";TB
locate 20,18:input "   クロソイド  A2= ";AB
locate 20,19:input "   半 径     R2= ";RB
locate 20,20:input "   交点名        = ";NK$:goto *KUROKURO
'
*SYUSEI4:'--------デ-タ-の修正-----------
cls:locate 20,1:print "--------デ-タ-の修正-----------"
locate 20,3:print "KA1  点名          ・・・1"
locate 20,4:print "   座標       X1=・・・2"
locate 20,5:print "   座標        Y1=・・・3"
locate 20,6:print "   方向角    T1=・・・4"
locate 20,7:print "   クロソイド  A1=・・・5"
locate 20,8:print "   半 径     R1=・・・6"
locate 20,10:print "KA2  点名      ・・・・7"
locate 20,11:print "   座標       X2=・・・8"
locate 20,12:print "   座標       Y2=・・・9"
locate 20,13:print "   方向角    T2=・・・10"
locate 20,14:print "   クロソイド  A2=・・・11"
locate 20,15:print "   半 径     R2=・・・12"
locate 20,16:print "      交点名    ・・・・・・13"
locate 20,18:print "      次の修正  ・・・・・・14"
locate 20,18:print "      終 了    ・・・・・・15"
'
*320:locate 30,21:input "番号を指定して下さい。";B
if B<1 or B>15 then *320
on B goto *332,*333,*334,*335,*336,*337,*338,*339,*340,*341,*342,*343,*344,*SYUSEI4,*KUROKURO
'
*332:cls:locate 20,10:input "KA1  点名            ";N1$:goto *SYUSEI4
*333:cls:locate 20,10:input "   座標        X1= ";XA:goto *SYUSEI4
*334:cls:locate 20,10:input "   座標        Y1= ";Ya:goto *SYUSEI4
*335:CLS:locate 20,10:input "   方向角    T1= ";TA:goto *SYUSEI4
*336:CLS:locate 20,10:input "   クロソイド  A1= ";AA1:goto *SYUSEI4
*337:CLS:locate 20,10:input "   半 径     R1= ";RA:goto *SYUSEI4
*338:cls:locate 20,10:input "KA2   点名          ";N2$:goto *SYUSEI4
*339:cls:locate 20,10:input "   座標       X2= ";XB:goto *SYUSEI4
*340:cls:locate 20,10:input "   座標       Y2= ";YB:goto *SYUSEI4
*341:cls:locate 20,10:input "   方向角    T2= ";TB:goto *SYUSEI4
*342:cls:locate 20,10:input "   クロソイド  A2= ";AB:goto *SYUSEI4
*343:cls:locate 20,10:input "   半 径     R2= ";RB:goto *SYUSEI4
*344:cls:locate 20,10:input "   交点名  = ";NK$:goto *SYUSEI4
'
*KEISAN4:'---------計 算 中---------
TR1=fnRAN(TA):T1=tan(TR1):TR2=fnRAN(TB):T2=tan(TR2):X1=XA:Y1=YA:X2=XB:Y2=YB
gosub *KOUTENSUB:L1=SS1:L2=SS2
*382:AA=AA1:LL=L1:RR=AA*AA/L1:gosub *YOUSOSUB:TC1=TR1+SGM*sgn(RA):SC1=abs(S0):TU1=TAU:SG1=SGM
XC1=XA+cos(TC1)*SC1:YC1=YA+sin(TC1)*SC1:AA=AB:RR1=RR*sgn(RA)
LL=L2:RR=AA*AA/L2:gosub *YOUSOSUB:TC2=TR2+SGM*sgn(RB):SC2=abs(S0):TU2=TAU:SG2=SGM:RR2=RR*sgn(RB)
XC2=XB+cos(TC2)*SC2:YC2=YB+sin(TC2)*SC2
XC=(XC1+XC2)/2#:YC=(YC1+YC2)/2#
DX=XC-XA:DY=YC-YA:gosub *STSUB:SL1=SS:DX=XC-XB:DY=YC-YB:gosub *STSUB:SL2=SS
DS1=SL1-SC1:DS2=SL2-SC2:L1=L1+DS1:L2=L2+DS2
if abs(DS1)>0.00002 then *382
if abs(DS2)>0.00002 then *382
T1=(TR1+TU1*sgn(RA))*RAA:TTA=fnDMS(T1):T2=(TR2+TU2*sgn(RB))*RAA:TTB=fnDMS(T2)
TU=TU1*RAA:TAU1=fnDMS(TU):SG=SG1*RAA:SGM1=fnDMS(SG)
TU=TU2*RAA:TAU2=fnDMS(TU):SG=SG2*RAA:SGM2=fnDMS(SG)
'
'------------計算書作成------------
cls:locate 30,12:print "印 刷 中"
lprint:lprint:lprint:lprint:lprint:lprint:lprint:lprint tab(20)"*** クロソイド曲線どおしの交点計算 ***":lprint:lprint:lprint:lprint
lprint using "             &    &  XA=#######.#####    YA=#######.#####";N1$,Xa,Ya:lprint
AN=TA:gosub *DOFUNBYO1
lprint using "                 TA=#### ## ##.###   A =#######        R =#######";V1,V2,V3,AA1,RA:lprint
lprint using "             &    &  XB=#######.#####    YB=#######.#####";N2$,XB,YB:lprint
AN=TB:gosub *DOFUNBYO1
lprint using "                 TB=#### ## ##.###   A =#######        R =#######";V1,V2,V3,AB,RB:lprint
lprint AN1$:lprint
lprint using "           交点 &   &XP=#######.#####   YP=#######.##### ";NK$,XC,YC:lprint
AN=TTA:gosub *DOFUNBYO1
lprint using "                     L1=  #####.#####   T1=#### ## ##.###  R1=#########.####";L1,V1,V2,V3,RR1:lprint
AN=TAU1:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=SGM1:gosub *DOFUNBYO1
lprint using "                    S1=  #####.#####  τ1=#### ## ##.###  σ1=#### ## ##.###";SC1,V4,V5,V6,V1,V2,V3:lprint
AN=TTB:gosub *DOFUNBYO1
lprint using "                     L2=  #####.#####   T2=#### ## ##.###  R2=#########.####";L2,V1,V2,V3,RR2:lprint
AN=TAU2:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=SGM2:gosub *DOFUNBYO1
lprint using "                    S2=  #####.#####  τ2=#### ## ##.###  σ2=#### ## ##.###";SC2,V4,V5,V6,V1,V2,V3:lprint
lprint AN1$:lprint
lprint chr$(12);
'
goto *KUROKURO
'
*YOUSO:'---------------クロソイド曲線の要素の計算-------------
cls:locate 20,5:print "***作業メニュ- ***"
gosub *MENU1
on JJA goto *DATRIN5,*SYUSEI5,*KEISAN5,*SENTAKU1
'
*DATRIN5:'-------デ-タ 入力-------
cls:locate 20,5:print "-----------デ-タの入力-----------"
locate 20,8:input "パラメ-タ-  A1=  ";A1
locate 20,10:input "半     径    R1=   ";R1:goto *YOUSO
'
*SYUSEI5:'--------デ-タ-の修正-----------
cls:locate 20,5:print "--------デ-タ-の修正-----------"
locate 20,8:print "パラメ-タ-  A1= ・・・1"
locate 20,10:print "半     径    R1=  ・・・2"
locate 20,12:print "次の修正点       ・・・・3"
locate 20,14:print "終 了       ・・・・・・4"
'
*3850:locate 30,17:input "番号を指定して下さい。";JJ
if JJ<1 or JJ>4 then *3850
on JJ goto *437,*438,*SYUSEI5,*YOUSO
'
*437:cls:locate 20,10:input "パラメ-タ-  A1=  ";A1:goto *SYUSEI5
*438:cls:locate 20,10:input "半     径    R1=   ";R1:goto *SYUSEI5
'
*KEISAN5:'---------計 算 中---------
AA=A1:RR=R1:gosub *YOUSOSUB:L1=LL:X1=XX:Y1=YY:DR1=DR:XM1=XM:TK1=TK:TL1=TL:S01=S0
SGM1=fnDMS(SGM*RAA):TAU1=fnDMS(TAU*RAA)
'
'------------計算書作成------------
cls:locate 30,12:print "印 刷 中"
lprint:lprint:lprint:lprint:lprint:lprint:lprint:lprint tab(30)"クロソイドの要素計算書":lprint:lprint:lprint:lprint
lprint using "                    A=#####.#####    R=#####.#####     L=#####.#####";A1,R1,L1:lprint
lprint using "                    X=#####.#####    Y=#####.#####    S0=#####.#####";X1,Y1,S01:lprint
AN=TAU1:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=SGM1:gosub *DOFUNBYO1
lprint using "                  ⊿R=#####.#####   τ=#### ## ##.##  σ=#### ## ##.###";DR1,V4,V5,V6,V1,V2,V3:lprint
lprint using "                   XM=#####.#####   TK=#####.#####    TL=#####.#####";XM1,TK1,TL1:lprint
lprint HH$:lprint
lprint chr$(12);
'
goto *YOUSO
'
end
'
*ZAHYOU:'--------クロソイド曲線の中間点の座標計算--------
cls:locate 20,5:print "***作業メニュ- ***"
gosub *MENU1
on JJA goto *DATRIN6,*SYUSEI6,*KEISAN6,*SENTAKU1
'
*DATRIN6:'-------デ-タ 入力-------
cls:locate 20,1:print "-----------デ-タの入力-----------"
locate 20,4:input "KAの点名      ";N0$
locate 20,5:input "   座標   X= ";X0
locate 20,6:input "   座標   Y= ";Y0
locate 20,8:input "   方向角   T= ";T0
locate 20,9:input "パラメ-タ     A= ";AA:I=0
locate 20,10:input "半 径         R= ";RR:R0=RR
*433:I=I+1:B=I:locate 20,12:input "曲線長         L= ";L(I):LL=L(I)
locate 20,14:input "求点名          = ";N2$(I)
locate 30,17:print"次の点------1"
locate 30,19:print"終 了------2"
*476:locate 35,22:input "番号指定       ";BB
if BB<1 or BB>2 then *476
locate 30,12:print"                        "
locate 30,14:print"                        "
locate 30,17:print"                        "
locate 30,19:print"                        "
locate 35,22:print"                        "
on BB goto *433,*ZAHYOU
'
*SYUSEI6:'--------デ-タ-の修正-----------
cls:locate 20,1:print "--------デ-タ-の修正-----------"
locate 20,3:print "KAの点名  ・・・・・・1"
locate 20,4:print "   座標  X=・・・・2"
locate 20,5:print "   座標  Y=・・・・3"
locate 20,7:print "   方向角  T=・・・・4"
locate 20,8:print "パラメ-タ  A=・・・・5"
locate 20,9:print "半 径      R=・・・・6"
locate 20,11:print "曲線長        L=・・・・7"
locate 20,12:print "求点名    ・・・・・・8"
locate 20,14:print "終 了    ・・・・・・9"
'
*434:locate 30,16:input "番号を指定して下さい。";JJ
if JJ<1 or JJ>9 then *434
on JJ goto *501,*502,*503,*504,*505,*506,*507,*508,*ZAHYOU
'
*501:cls:locate 20,12:input "KAの点名       ";N0$:goto *SYUSEI6
*502:cls:locate 20,12:input "座標    X= ";X0:goto *SYUSEI6
*503:cls:locate 20,12:input "座標    Y= ";Y0:goto *SYUSEI6
*504:cls:locate 20,12:input "方向角     T= ";T0:goto *SYUSEI6
*505:cls:locate 20,12:input "パラメ-タ A= ";AA:goto *SYUSEI6
*506:cls:locate 20,12:input "半 径     R= ";RR:R0=RR:goto *SYUSEI6
*507:cls:locate 20,10:input "何番目か       ";J
locate 20,12:input "曲線長     L= ";L(J):goto *SYUSEI6
*508:cls:locate 20,12:input "求点名      = ";N2$:goto *SYUSEI6
'
*KEISAN6:'---------計 算 中---------
'------------計算書作成------------
lprint:lprint:lprint:lprint:lprint:lprint:lprint:lprint tab(30)"クロソイド曲線の中間点の座標計算":lprint:lprint:lprint:lprint
lprint using "             &    &  X0=#######.#####   Y0=#######.##### ";N0$,X0,Y0:lprint
AN=T0:gosub *DOFUNBYO1
lprint using "                 T0=#### ## ##.##    A=#######         R =#######.#";V1,V2,V3,AA,R0:lprint
lprint HH$:lprint
for I=1 to B
LL=L(I)
RR=AA*AA/LL:gosub *YOUSOSUB:TR=fnRAN(T0):TRA=TR+SGM*sgn(R0):RR(I)=RR*sgn(R0)
XP(I)=X0+cos(TRA)*S0:YP(I)=Y0+sin(TRA)*S0:T1=(TR+TAU*sgn(R0))*RAA:TT1=fnDMS(T1)
TN=TAU*RAA:TAU1(I)=fnDMS(TN):TN=SGM*RAA:SGM1(I)=fnDMS(TN):S0(I)=S0
'
lprint using "            &     & XP=#######.#####   YP=#######.##### ";N2$(I),XP(I),YP(I):lprint
AN=TT1:gosub *DOFUNBYO1
lprint using "                    T =#### ## ##.###  L =######.#####    RR=#########.####";V1,V2,V3,L(I),RR(I):lprint
AN=TAU1(I):gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=SGM1(I):gosub *DOFUNBYO1
lprint using "                    S0=  #####.#####   τ=#### ## ##.###  σ=#### ## ##.###";S0(I),V4,V5,V6,V1,V2,V3:lprint
lprint HH$:lprint
next I
lprint chr$(12);
'
goto *ZAHYOU
'
*5200:'------角度の正規化-----
if TN=>360# then TN=TN-360#
*5210:if TN<0 then TN=TN+360#
if TN=>360 then *5200
if TN<0 then *5210
return
'
*MENU1
locate 15,5:print"*** 作 業 メニュウ- ***"
locate 20,8:print"デ-タの入力 ・・・・・・・1"
locate 20,10:print"デ-タの修正 ・・・・・・・2 "
locate 20,12:print"計算書の印刷 ・・・・・・・3 "
locate 20,14:print"作業の終了 ・・・・・・・・4 "
locate 30,17:input"番号を指定    ";JJA
if JJA<1 or JJA>4 then *MENU1
return
'
*7600:'-----------デ-タの入力-----------
cls:locate 20,2:print "-----------デ-タの入力-----------"
locate 20,5:input "BCの点名      ";KK$
locate 20,7:input "   座標  X= ";XB
locate 20,9:input "   座標  Y= ";YB
locate 20,11:input "接線方向角  T0=  ";T0
locate 20,13:input "  半 径  R= ";R0
locate 20,15:input "  交 角  IA= ";TIA
locate 20,17:input "  幅 員  B= ";BB
return
'
*7700:'--------円曲線の要素 SUB------------
cls:locate 20,10:print "-----------円曲線の要素 SUB-----------"
TR2=TBIA/2#
R=abs(R):TL=R*tan(TR2):DCL=R*TBIA:SL=R*(1#/cos(TR2)-1#)
DM=R*(1#-cos(TR2)):DC=2#*R*sin(TR2)
return
'
*STSUB:'---------ST SUB---------
SS=sqr(DX*DX+DY*DY):TD=atn(DY/(DX+EE)):TT=TD*RAA
if DX<0 then TT=TT+180#
if DY<0 then TT=TT+360#
TD=TT
return
'
*KOUTENSUB:'--------交点 SUB---------
XP=(T2*X2-T1*X1+Y1-Y2)/(T2-T1):YP=T1*(XP-X1)+Y1
DX=X1-XP:DY=Y1-YP:gosub *STSUB:TT1=fnDMS(TT):TD1=TD:SS1=SS
DX=X2-XP:DY=Y2-YP:gosub *STSUB:TT2=fnDMS(TT):TD2=TD:SS2=SS
return
'
*ENCYOKUSUB:'------------直線と円の交点 SUB----------
T3=T1*T1+1#:TT4=(R1*R1*T3-T2*T2)
T4=sqr(TT4)
XP1=(T1*T2+T4)/T3+X(3):YP1=*7:DAT=atn(DATT)
DCOS=PI/2#-DAT:DRA=DCOS
TN0=fnRAN(TA0):TR1=TN0+DCOS:TR2=TN0-DCOS
XP1=X(1)+cos(TR1)*R1:YP1=Y(1)+sin(TR1)*R1
XP2=X(1)+cos(TR2)*R1:YP2=Y(1)+sin(TR2)*R1
return
'
*YOUSOSUB:'---------------クロソイド曲線の要素 SUB-------------
LL=AA*AA/RR:TAU=LL/2#/RR:XX=fnX(LL,RR):YY=fnY(LL,RR)
DR=YY+cos(TAU)*RR-RR:XM=XX-sin(TAU)*RR:TK=YY/sin(TAU):TL=XX-YY/tan(TAU)
SGM=atn(YY/XX):S0=XX/cos(SGM)
return
'
*DOFUNBYO1:'-----度.分秒の分離-----
VV=abs(AN):V1=fix(VV):V2=fix*8*100#):V3=(VV*100#-fix(VV*100#))*100#
if AN<0 then V1=(V1+0.1)*sgn(AN)
return
'
*ENDD1
'
end

 

*1:T-fix(T

*2:T*100#)-fix(T*100#

*3:T-fix(T

*4:T-fix(T

*5:T-fix(T

*6:L/R)^2#)/40#+((L/R)^4#)/3456#-((L/R)^6#)/599040#):'-----クロソイドの関数X------
def fnY(L,R)=L*L/6#/R*(1#-((L/R)^2#)/56#+((L/R)^4#)/7040#-((L/R)^6#)/1612800#):'-----クロソイドの関数X------
def fnASI(T)=atn(T/(sqr(-T*T+1#)))*RAA:'-------------ア-クサイン
def fnACO(T)=(-atn(T/sqr(-T*T+1#

*7:T1*T2+T4)/T3)*T1-T2+Y(3)
XP2=(T1*T2-T4)/T3+X(3):YP2=((T1*T2-T4)/T3)*T1-T2+Y(3)
return
'
*ENENSUB:'------------円と円の交点 SUB----------
DS=(R1*R1+S0*S0-R2*R2)/(2#*R1*S0):DATT=(DS/sqr(-DS*DS+1#

*8:VV-fix(VV