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

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

4.路線線形計算 (F-BASIC)

lprint type"dc"
'-----------曲線設置-------------
defdbl A-H,L,M,P-Z:defstr N,K:defint I,J
PI=3.141592653589793#:EE=0.0000000001#
RA=206264.8062471#:RAA=180#/PI:RRA=PI/180#
dim NN$(20),N2$(20),X(20),Y(20),T(20),L(20),S(20),L1(20),XP(20),YP(20),KK$(20)
def fnRRA(T)=(T*10000#-40#*(fix(T*100#)+60#*fix(T)))/RA
def fnRAA(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/36#:'-----度分秒から度へ------
def fnDMS(T)=fix(T)+fix*3*60#)/100#+*4*60#-fix*5*60#))*0.006#:'-----度から度分秒へ------
def fnX(L,R)=L*(1#-*6:TT=TR/2#
CL=TR*R:TL=tan(TT)*R:SL=R*(1#/cos(TT)-1#):ML=2#*R*sin(TR/2#)
'
cls:lprint:lprint:lprint:lprint:lprint
lprint "                曲 線 の 要 素 の 計 算":lprint:lprint:lprint
lprint using "                交 角  IA =#######.######";T(3):lprint
lprint using "                半  径   R =  #####.######";R:lprint:lprint:lprint
lprint using "                        TL =#######.########";TL:lprint
lprint using "                        CL =#######.########";CL:lprint
lprint using "                        SL =#######.########";SL:lprint
lprint using "                        ML =#######.########";ML:lprint
lprint chr$(12);
'
goto *SENTAKU1
'
*BCIN:'--------与点の入力
cls:locate 20,8:print "--------与点の入力--------"
locate 20,10:input "始点の点名   = ";NBC
locate 20,12:input "始点の 半径  = ";RBC
locate 20,14:input "始点の X   = ";XBC
locate 20,16:input "始点の Y   = ";YBC
locate 20,18:input "始点の 方向角 = ";TBC
TRBC=fnRAA(TBC)
return
'
'
*ST:'-------ST計算
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#
TR=TT*RRA
return
'
*SYUSEI1:'------修  正
cls:locate 20,1:print "--------デ-タ-の修正-----------"
locate 20,3:print"与点の点名 ・・・・・・・・・・・1"
locate 20,5:print"与点の半径  修正・・・・・・・・2"
locate 20,7:print"与点のX、  修正・・・・・・・・3"
locate 20,9:print"与点のY、  修正・・・・・・・・4"
locate 20,11:print"与点の方向角、修正・・・・・・・・5"
locate 20,13:print"曲線長 CL ・・・・・・・・・・6 "
locate 20,15:print"与 長 B1 ・・・・・・・・・・7 "
locate 20,17:print"区間長 B ・・・・・・・・・・・8 "
locate 20,19:print"修正の終了 ・・・・・・・・・・・9 "
locate 30,22:input"番号を指定    ";I
if I<1 or I>9 then *SYUSEI1
on I goto *139,*140,*141,*142,*143,*144,*145,*146,*ZAHYOU
'
'-----与点の修正
*139:cls:locate 10,10:input "与点名          ";NBC$:goto *SYUSEI1
*140:cls:locate 10,10:input "与点半径      ";RBC:goto *SYUSEI1
*141:cls:locate 10,10:input "与点    x       ";XBC:goto *SYUSEI1
*142:cls:locate 10,10:input "与点    y       ";YBC:goto *SYUSEI1
*143:cls:locate 10,10:input "出る方向角     ";TBC:TRBC=fnRAA(TBC):goto *SYUSEI1
*144:cls:locate 20,10:input "曲線長 CL  = ";CL:goto *SYUSEI1
*145:cls:locate 20,12:input "与 長 B1  = ";B1:goto *SYUSEI1
*146:cls:locate 20,14:input "区間長 B   = ";BB:goto *SYUSEI1
'
*CYOUSO:'---------------クロソイド曲線の要素の計算-------------
cls:locate 20,5:print "***作業メニュ- ***"
gosub *MENU1
on JJA goto *DATRIN5,*SYUSEI5,*KEISAN5,*ENDD1
'
*DATRIN5:'-------デ-タ 入力-------
cls:locate 20,5:print "-----------デ-タの入力-----------"
locate 20,8:input "パラメ-タ-  A1=  ";A1
locate 20,10:input "半     径    R1=   ";R1:goto *CYOUSO
'
*SYUSEI5:'--------デ-タ-の修正-----------
cls:locate 20,5:print "--------デ-タ-の修正-----------"
locate 20,8:print "パラメ-タ-  A1= ・・・1"
locate 20,10:print "半     径    R1=  ・・・2"
locate 20,12:print "終 了       ・・・・・・4"
*3850:locate 30,15:input "番号を指定して下さい。";JJ
if JJ<1 or JJ>4 then *3850
on JJ goto *343,*344,*CYOUSO
'
*343:cls:locate 20,10:input "パラメ-タ-  A1=  ";A1:goto *SYUSEI5
*344:cls:locate 20,10:input "半     径    R1=   ";R1:goto *SYUSEI5
'
*KEISAN5:'---------計 算 中---------
AA=A1:RR=R1*sgn(R1):gosub *YOUSOSUB:L1=LL:X1=XX:Y1=YY:DR1=DR:XM1=XM:TK1=TK:TL1=TL:S01=S0
TN=SGM*RAA:SGM1=fnDMS(TN):TN=TAU*RAA:TAU1=fnDMS(TN)
'
'------------計算書作成------------
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
lprint using "                  ⊿R=#####.#####   τ=###.#######   σ=###.######";DR1,TAU1,SGM1:lprint
lprint using "                   XM=#####.#####   TK=#####.#####   TL=#####.#####";XM1,TK1,TL1:lprint
lprint HH$:lprint
lprint chr$(12);
'
goto *CYOUSO
'
*CZAHYOU:'--------クロソイド曲線の中間点の座標計算--------
cls:locate 20,5:print "***作業メニュ- ***"
gosub *MENU1
on JJA goto *DATRIN6,*SYUSEI6,*KEISAN6,*ENDD1
'
*DATRIN6:'-------デ-タ 入力-------
cls:locate 20,1:print "-----------デ-タの入力-----------"
locate 20,4:input "KAの点名      ";NN$
locate 20,5:input "   座標   X= ";X0
locate 20,6:input "   座標   Y= ";Y0
locate 20,8:input "   方向角   T= ";T0:TR0=fnRAA(T0)
locate 20,9:input "パラメ-タ     A= ";AA
locate 20,10:input "半 径        R= ";R0
'
cls:locate 20,6:print "--------求点の入力--------"
locate 20,8:print "--------与長と区間長の入力--------"
locate 20,10:input "曲線長 L    = ";L0
locate 20,12:input "与 長 B1  = ";B1
locate 20,14:input "区間長 B   = ";BB:goto *CZAHYOU
'
*KEISAN6:'---------計 算 中---------
I=0:LL=B1
*293
I=I+1:II=I
L(I)=LL:RR=AA*AA/LL:gosub *YOUSOSUB:TR1=TR0+sgn(R0)*SGM:TT=TR0+sgn(R0)*TAU:TT=TT*RAA
if TT<0 then TT=TT+360
if TT>360# then TT=TT-360#
T(I)=fnDMS(TT)
X(I)=X0+cos(TR1)*abs(S0):Y(I)=Y0+sin(TR1)*abs(S0)
N$=str$ (I):N2$(I)="NO."+N$:LL=LL+BB
if LL<L0 then *293
'
LL=L0:I=I+1:II=I
L(I)=LL:RR=AA*AA/LL:gosub *YOUSOSUB:TR1=TR0+sgn(R0)*SGM:TT=TR0+sgn(R0)*TAU:TT=TT*RAA
if TT<0 then TT=TT+360
if TT>360# then TT=TT-360#
T(I)=fnDMS(TT)
X(I)=X0+cos(TR1)*abs(S0):Y(I)=Y0+sin(TR1)*abs(S0)
N$=str$ (I):N2$(I)="NO."+N$
'
cls:lprint:lprint:lprint:lprint:lprint
lprint "                        中 間 点 座 標 計 算":lprint:lprint:lprint
lprint"         与点名     X     Y      方向角           L":lprint
lprint using "         &     &#######.#### #######.####     ####.##### ######.#####";NN$,X0,Y0,T0,L0:lprint
lprint using "            A=######.###  R=#######.#####  B1=##.####  B=###.#####";AA,R0,B1,BB:lprint
lprint "             点 名       X      Y       接線方向角   曲線長 ":lprint
'
for I=1 to II
lprint using "              &    & #######.##### #######.#####  ####.######  ####.#####";N2$(I),X(I),Y(I),T(I),L(I):lprint
next I
'
lprint chr$(12);
goto *CZAHYOU
'
*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 "与 長          B1=・・8"
locate 20,13:print "区間長          B =・・9"
locate 20,15:print "終 了   ・・・・・10"
'
*434:locate 30,17:input "番号を指定して下さい。";JJ
if JJ<1 or JJ>10 then *434
on JJ goto *438,*439,*440,*441,*442,*443,*444,*445,*446,*CZAHYOU
'
*438:cls:locate 20,12:input "KAの点名       ";N0$:goto *SYUSEI6
*439:cls:locate 20,12:input "座標    X= ";X0:goto *SYUSEI6
*440:cls:locate 20,12:input "座標    Y= ";Y0:goto *SYUSEI6
*441:cls:locate 20,12:input "方向角     T= ";T0:goto *SYUSEI6
*442:cls:locate 20,12:input "パラメ-タ A= ";AA:goto *SYUSEI6
*443:cls:locate 20,12:input "半 径     R= ";R0:goto *SYUSEI6
*444:cls:locate 20,12:input "曲線長     L= ";LL:goto *SYUSEI6
*445:cls:locate 20,12:input "与 長    B1= ";B1:goto *SYUSEI6
*446:cls:locate 20,12:input "区間長     B= ";BB:goto *SYUSEI6
'
*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
cls:locate 15,3:print"*** 作 業 メニュウ- ***"
locate 20,6:print"デ-タの入力 ・・・・・・・1"
locate 20,8:print"デ-タの修正 ・・・・・・・2 "
locate 20,10:print"計算書の印刷 ・・・・・・・3 "
locate 20,12:print"作業の終了 ・・・・・・・・4 "
locate 30,16:input"番号を指定    ";JJA
if JJA<1 or JJA>4 then *MENU1
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*RRA
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
'
*ENDD1:stop
'
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------
HH$="          ------------------------------"
'-----------------
*SENTAKU1
cls:locate 20,5:print"計算の項目を選択して下さい。"
locate 25,8:print"円曲線への垂線(出尺)・・・・・・・・1"
locate 25,10:print"円曲線の要素の計算・・・・・・・・・・2"
locate 25,12:print"円曲線の中間点の座標計算・・・・・・・3"
locate 25,14:print"クロソイド曲線の要素の計算・・・・・・4"
locate 25,16:print"クロソイド曲線の中間点の座標計算・・・5"
locate 25,18:print"作 業 終 了・・・・・・・・・・・・6"
locate 30,21:input"番号を選択して下さい。  ";JO
if JO<1 or JO>6 then *SENTAKU1
on JO goto *SUISEN,*YOUSO,*ZAHYOU,*CYOUSO,*CZAHYOU,*ENDD1
'
*SUISEN:'--------円曲線への垂線(出尺)
gosub *MENU1
on JJA goto *157,*SYUSEI2,*KEISAN3,*SENTAKU1
*157:gosub *BCIN:'-------与点の入力
TR=TRBC+sgn(RBC)*abs(PI/2#):XM=XBC+cos(TR)*abs(RBC):YM=YBC+sin(TR)*abs(RBC)
I=0
'
*PIN:'--------求点の入力
*128:I=I+1:II=I
cls:locate 20,8:print "--------求点の入力--------"
locate 20,10:input "求点の点名   = ";NN$(I)
locate 20,12:input "求点の X   = ";X(I)
locate 20,14:input "求点の Y   = ";Y(I)
'
DX=X(I)-XM:DY=Y(I)-YM:N$=str$(I)
gosub *ST
XP(I)=XM+cos(TR)*abs(RBC):YP(I)=YM+sin(TR)*abs(RBC):TT=TT+sgn(RBC)*90#
if TT<0 then TT=TT+180#
if TT>360# then TT=TT-360#
T(I)=fnDMS(TT):WW(I)=sgn(RBC)*(abs(RBC)-SS):N2$(I)="交点"+N$
if WW(I)<0 then KK$(I)="左 側"
if WW(I)>0 then KK$(I)="右 側"
'
*147
cls:locate 20,3:print"次の点の計算をやりますか。"
locate 25,10:print"次の計算・・・・・・1"
locate 25,12:print"終 了・・・・・・・2"
locate 30,15:input"番号を選択して下さい。  ";JO
if JO<1 or JO>2 then *147
on JO goto *128,*SUISEN
'
*KEISAN3
lprint:lprint:lprint:lprint:lprint
lprint "                   曲 線 へ の 垂 線 計 算":lprint:lprint:lprint
lprint"         与点名     X      Y   方向角        半 径":lprint
lprint using "         &     &#######.#### #######.#### ####.#####   #######";NBC,XBC,YBC,TBC,RBC:lprint
lprint using "         円中心 #######.#### #######.####";XM,YM:lprint:lprint
lprint"         求点名     X      Y":lprint
lprint"         交点名     X      Y    方向角   離れ(右+ 左-)":lprint
for I=1 to II
lprint using "          &     & #######.#### #######.#### ";NN$(I),X(I),Y(I):lprint
lprint using "          &     & #######.#### #######.#### ####.######    ####.##### &   &";N2$(I),XP(I),YP(I),T(I),WW(I),KK$(I):lprint
next I
lprint chr$(12);
'
goto *SUISEN
'
*SYUSEI2:'------修  正
cls:locate 20,3:print "--------与点の修正--------"
locate 20,6:print"与点の点名 ・・・・・・・・・・・1"
locate 20,8:print"与点の半径  修正・・・・・・・・2"
locate 20,10:print"与点のX、  修正・・・・・・・・3"
locate 20,12:print"与点のY、  修正・・・・・・・・4"
locate 20,14:print"与点の方向角、修正・・・・・・・・5"
locate 20,14:print"与点の方向角、修正・・・・・・・・6"
locate 20,16:print"修正の終了 ・・・・・・・・・・・7 "
locate 30,19:input"番号を指定    ";I
if I<1 or I>7 then *SYUSEI2
on I goto *181,*182,*183,*184,*185,*186,*SUISEN
'
'-----与点の修正
*181:cls:locate 10,10:input "与点名          ";NBC$:goto *113
*182:cls:locate 10,10:input "与点半径      ";RBC:goto *113
*183:cls:locate 10,10:input "与点    x       ";XBC:goto *113
*184:cls:locate 10,10:input "与点    y       ";YBC:goto *113
*185:cls:locate 10,10:input "出る方向角     ";TBC:TRBC=fnRAA(TBC):goto *113
'
*186
'------求点の修 正
cls:locate 20,6:print "--------求点の修正--------"
locate 20,8:input "何番目の点か ・・・・・・・・ ";I
locate 20,6:print"求与点の点名 ・・・・・・・・・1"
locate 20,10:print"求与点のX、  ・・・・・・・・2"
locate 20,11:print"求与点のY、  ・・・・・・・・3"
locate 20,12:print"修正の終了 ・・・・・・・・・・4"
locate 30,15:input"番号を指定    ";I
if I<1 or I>4 then *SYUSEI2
on I goto *101,*102,*103,*SUISEN
'
*113
TR=TRBC+sgn(RBC)*abs(PI/2#):XM=XBC+cos(TR)*abs(RBC):YM=YBC+sin(TR)*abs(RBC)
I=0
'
for I=1 to II
DX=X(I)-XM:DY=Y(I)-YM:N$=str$(I)
gosub *ST
XP(I)=XM+cos(TR)*abs(RBC):YP(I)=YM+sin(TR)*abs(RBC):TT=TT+sgn(RBC)*90#
if TT<0 then TT=TT+180#
if TT>360# then TT=TT-360#
T(I)=fnDMS(TT):WW(I)=sgn(RBC)*(abs(RBC)-SS):N2$(I)="交点"+N$
if WW(I)<0 then KK$(I)="左 側"
if WW(I)>0 then KK$(I)="右 側"
next I
goto *SYUSEI2
'
cls:locate 20,7:print "--------求点の修正--------"
*101:locate 20,13:input "求点の点名   = ";NN$(I):goto *113
*102:locate 20,15:input "求点の X   = ";X(I):goto *113
*103:locate 20,17:input "求点の Y   = ";Y(I):goto *113
'
*ZAHYOU:'--------円曲線の中間点の座標計算
cls:locate 15,8:print"*** 作 業 メニュウ- ***"
gosub *MENU1
on JJA goto *73,*SYUSEI1,*KEISAN2,*SENTAKU1
'
*73
gosub *BCIN:'-------与点の入力
cls:locate 20,8:print "--------与長と区間長の入力--------"
cls:locate 20,10:input "曲線長 CL  = ";CL
locate 20,12:input "与 長 B1  = ";B1
locate 20,14:input "区間長 B   = ";BB
*KEISAN2:LB=B1
TR=TRBC+sgn(RBC)*(PI/2#):XM=XBC+cos(TR)*abs(RBC):YM=YBC+sin(TR)*abs(RBC)
cls:lprint:lprint:lprint:lprint:lprint
lprint "                   中 間 点 座 標 計 算":lprint:lprint:lprint
lprint"         与点名     X     Y      方向角          半 径":lprint
lprint using "         &     &#######.#### #######.####     ####.#####   #######";NBC,XBC,YBC,TBC,RBC:lprint
lprint using "         CL=    #####.#### B1=##.####  B=###.#####";CL,B1,BB:lprint
lprint using "         円中心 #######.#### #######.####";XM,YM:lprint:lprint
lprint "        点 名       X      Y      接線方向角  曲線長    弦 長":lprint
I=0
*169
I=I+1:II=I
BA=LB/2#/RBC:L1(I)=2#*RBC*sin(BA):TR=TRBC+BA
X(I)=XBC+cos(TR)*L1(I):Y(I)=YBC+sin(TR)*L1(I):L(I)=LB:DX=X(I)-XM:DY=Y(I)-YM
'
gosub *ST
TT=TT+sgn(RBC)*90#
if TT>360# then TT=TT-360#
if TT<0 then TT=TT+360#
T(I)=fnDMS(TT):LB=LB+BB:N$=str$(I):NN$(I)="NO."+N$
if LB<CL then *169
LB=CL
I=I+1:II=I
BA=LB/2#/RBC:L1(I)=2#*RBC*sin(BA):TR=TRBC+BA
X(I)=XBC+cos(TR)*L1(I):Y(I)=YBC+sin(TR)*L1(I):L(I)=LB:DX=X(I)-XM:DY=Y(I)-YM
'
gosub *ST
TT=TT+sgn(RBC)*90#
if TT>360# then TT=TT-360#
if TT<0 then TT=TT+360#
T(I)=fnDMS(TT):LB=LB+BB:N$=str$(I):NN$(I)="NO."+N$
for I=1 to II
lprint using "         &    & #######.##### #######.##### ####.##### ####.###### ####.#####";NN$(I),X(I),Y(I),T(I),L(I),L1(I):lprint
next I
'
lprint chr$(12);
goto *ZAHYOU
'
'
*YOUSO:'-------円曲線の要素の計算
*14:cls:locate 20,2:print "-----------デ-タの入力-----------"
locate 20,10:input "  交角 IA= ";T(3)
locate 20,12:input "  半径  R= ";R
'
TR=fnRAA(T(3