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

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

14.真北計算 (F-BASIC)

lprint type"dc"
*TAIYOSUKANSOKU'太陽観測
defdbl A-H,M,P,O,R,T-Z:defstr N,Q,S:defint I,J
EET=1/100000000#:EES=1.0027379#:EEE=0.006719218798677#
PI=3.141592653589793#
XYAS=180#/PI:ASXY=PI/180#
dim DS(17),A1(20),A2(20),XT(20),DD1(10),AAT(10),AS1(6),AA1(6),AS2(6),AA2(6),AS3(6),AA3(6)
dim AS4(6),AA4(6),AS5(6),AA5(6),AS6(6),AA6(6)
DS(1)=129.3#:DS(2)=131#:DS(3)=132.1#:DS(4)=133.3#:DS(5)=134.2#:DS(6)=136#
DS(7)=137.1#:DS(8)=138.3#:DS(9)=139.5#:DS(10)=140.5#:DS(11)=140.15#:DS(12)=142.15#
DS(13)=144.15#:DS(14)=142#:DS(15)=127.3#:DS(16)=124#:DS(17)=131#
def fnRAN(T)=fix(T)+fix*1*100#)/60#+(T*100#-fix(T*100#))/36#
def fnDMS(T)=fix(T)+fix*2*60#)/100#+*3*60#-fix*4*60#))*0.006#
'-----------------
*SENTAKU1
cls:locate 20,3:print"計算の項目を選択して下さい。"
locate 25,6:print"太陽観測・・・・・・・・・・・・・・1"
locate 25,8:print"北極星観測ー天体位置表による。・・・2"
locate 25,10:print"北極星観測ー方位角表による。・・・・3"
locate 25,12:print"観測手簿の計算・・・・・・・・・・・4"
locate 25,14:print"作業終了・・・・・・・・・・・・・・5"
locate 30,20:input"番号を選択して下さい。  ";JO
if JO<1 or JO>5 then *SENTAKU1
on JO goto *TAIYOU,*HOKKYOKU1,*HOKKYOKU2,*KANSOKU,*SYURYOU
'
*TAIYOU:'-----太陽観測-----
'-----作業メニュ------
cls:gosub *MENU1
on J goto *DATRIN1,*SYUSEI1,*KEISAN1,*ENDD1
'
*DATRIN1
cls
locate 15,2:print"*** 太陽による方位角の計算 ***"
locate 20,4:input"測 点・・・・・・・";ST
locate 20,6:input"視準点・・・・・・・";SB
locate 20,8:input"年,月,日・・・・・";YY,GG,HH
locate 20,10:input"座標系・・・・・・・";JN
locate 20,12:input"緯 度・・・・・・・";B
locate 20,13:input"経 度・・・・・・・";BL
locate 20,15:input"視赤緯・・・・・・・";DD
locate 20,16:input"翌日の視赤緯・・・・";DD2
locate 20,18:input"均時差・・・・・・・";EE
locate 20,19:input"翌日の均時差・・・・";EE2
'
cls
locate 12,2:print"no      時  間      m-s(夾 角)"
locate 30,22:print"終了は 0 です(プリント します。"
'
for J=1 to 8:JJ=J-1
locate 5,(14+J):print J
locate 10,(14+J):input "時間=  ";A1(J)
if A1(J)=0 then *TAIYOU
locate 30,(14+J):input "夾角=  ";A2(J)
locate 12,(3+J):print J
locate 27,(3+J):print A1(J):locate 50,(3+J):print A2(J)
next J
goto *TAIYOU
'
*KEISAN1
lprint:lprint:lprint:lprint:lprint:lprint:lprint"                     *** 太陽観測による方位角の計算 ***"
lprint:lprint:lprint:lprint:lprint using"             測 点 &     &---> 後視点  &     &";ST$,SB$
lprint:lprint using"             観測年月日   ##### ## ##        座標系    ### 系";YY,GG,HH,JN
AN=B:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=BL:gosub *DOFUNBYO1
lprint:lprint using"             緯 度       #### ## ##.###      経 度       #### ## ##.###";V4,V5,V6,V1,V2,V3
AN=DD:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=DD2:gosub *DOFUNBYO1
lprint:lprint using"             当日の赤緯  #### ## ##.###       翌日の赤緯  #### ## ##.###";V4,V5,V6,V1,V2,V3
AN=EE:gosub *DOFUNBYO1:V4=V1:V5=V2:V6=V3:AN=EE2:gosub *DOFUNBYO1
lprint:lprint using"             当日の均時差  ### ## ##.###       翌日の均時差  ### ## ##.###";V4,V5,V6,V1,V2,V3
lprint:lprint:lprint:lprint
lprint"               NO         時  間   M-S(夾角)     方位角"
'
DT=52#:AZMS=0:DD3=fnRAN(DD):DD4=fnRAN(DD2):EE3=fnRAN(EE)
EE4=fnRAN(EE2):BB=fnRAN(B):BLL=fnRAN(BL)
'
for P=1 to JJ
WT=fnRAN(A1(P)):WT=WT-9#:ET=(WT+DT/3600#)/24#
DE=EE3+(EE4-EE3)*ET:AUT=WT+DE:ALT=AUT+BLL/15#:ALO=(ALT-12#)*15#
DD0=DD3+(DD4-DD3)*ET:DS=sin(ALO*ASXY)/(EET+tan(DD0*ASXY)*cos(BB*ASXY)-sin(BB*ASXY)*cos(ALO*ASXY)):DS=atn(DS)*XYAS
AAL1=sin(ALO*ASXY):AAL2=tan(DD0*ASXY):AAL3=cos(BB*ASXY):AAL4=sin(BB*ASXY):AAL5=cos(ALO*ASXY)
if ALO>0 and DS>0 then DS=360#-DS else DS=180#-DS:goto 940
if ALO<0 then DS=-DS
if DS>0 then DS=180#-DS
*940
AN=A2(P):gosub *5300:V4=V1:V5=V2:V6=V3:AN=fnRAN(A2(P)+EET)
AZ=DS+AN:gosub *5200:XT(P)=AZ:AZMS=AZMS+AZ:AZ=fnDMS(AZ)
AN=AZ:gosub *5300:V7=V1:V8=V2:V9=V3:AN=A1(P):gosub *5300
lprint:lprint using"               ###     #### ## ##.#      #### ## ##.#    #### ## ##.##";P,V1,V2,V3,V4,V5,V6,V7,V8,V9
next P
lprint:lprint:lprint:lprint
AN=AZMS/JJ:A1=AN:AN=fnDMS(AN):gosub *5300
lprint using"                           平均方位角   #### ## ##.##";V1,V2,V3
AN=DS(JN):AN=fnRAN(AN):AN=(BLL-AN)*sin(BB*ASXY)*(-1#):A2=AN:AN=fnDMS(AN):gosub *5300
lprint:lprint using"                           真北方位角   #### ## ##.##";V1,V2,V3
AN=A1+A2:TT3=AN:AN=fnDMS(AN):gosub *5300
lprint:lprint using"                           平均方向角   #### ## ##.##";V1,V2,V3
A=0
for P=1 to JJ
A=A+(XT(P)-A1)^2#
next P
AN=sqr(A/(JJ*(JJ-1#)))*3600#
lprint:lprint using"                           平均二乗誤差  ####.##";AN
'
lprint chr$(12);
goto *TAIYOU
'
*5200:'------角度の正規化-----
if AZ=>360# then AZ=AZ-360#
*5210:if AZ=<0 then AZ=AZ+360#
if AZ=>360 then *5200
if AZ<0 then *5210
return
'
*5300:'-----度 分 秒の分散-----
VV=abs(AN):V1=fix(AN):VV2=(VV-fix(VV)+EET)*100#
V2=fix(VV2):V3=(VV2-fix(VV2))*100#
return
'
'-----度から度、分、秒への変換-----
'
*SYUSEI1:'-----デ-タの修正-------
cls:locate 15,2:print"*** 太陽による方位角の計算 ***"
locate 20,4:print"測 点・・・・・・・ 1"
locate 20,5:print"視準点・・・・・・・ 2"
locate 20,7:print"年,月,日・・・・・ 3"
locate 20,8:print"座標系・・・・・・・ 4"
locate 20,10:print"緯 度・・・・・・・ 5"
locate 20,11:print"経 度・・・・・・・ 6"
locate 20,13:print"視赤緯・・・・・・・ 7"
locate 20,14:print"翌日の視赤緯・・・・ 8"
locate 20,16:print"均時差・・・・・・・ 9"
locate 20,17:print"翌日の均時差・・・・10"
locate 20,19:print"時間と夾角・・・・・11"
locate 20,21:print"終  了 ・・・・・12"
'
locate 30,22:input"番号を指定  ";JK
if JK<1 or JK>12 then *SYUSEI1
on JK goto *101,*102,*103,*104,*105,*106,*107,*108,*109,*110,*111,*TAIYOU
'
*101:cls:locate 20,10:input"測 点・・・・・・・";ST:goto *SYUSEI1
*102:cls:locate 20,10:input"視準点・・・・・・・";SB:goto *SYUSEI1
*103:cls:locate 20,10:input"年,月,日・・・・・";YY,GG,HH:goto *SYUSEI1
*104:cls:locate 20,10:input"座標系・・・・・・・";JN:goto *SYUSEI1
*105:cls:locate 20,10:input"緯 度・・・・・・・";B:goto *SYUSEI1
*106:cls:locate 20,10:input"経 度・・・・・・・";BL:goto *SYUSEI1
*107:cls:locate 20,10:input"視赤緯・・・・・・・";DD:goto *SYUSEI1
*108:cls:locate 20,10:input"翌日の視赤緯・・・・";DD2:goto *SYUSEI1
*109:cls:locate 20,10:input"均時差・・・・・・・";EE:goto *SYUSEI1
*110:cls:locate 20,10:input"翌日の均時差・・・・";EE2:goto *SYUSEI1
*111:cls:locate 20,7:INPUT "何番目か番号を指定・・ ";J1
locate 20,10:input"時間・・ ";A1(J1)
locate 20,12:input"夾角・・ ";A2(J1):goto *SYUSEI1
'
'--------------北極星による方位角の計算----------
*HOKKYOKU1
cls:locate 20,10:print "*** 検討中です。 ***":stop:goto *SENTAKU1
'
'-------------北極星による方位角の計算 2-----------
*HOKKYOKU2
cls:locate 20,10:print "*** 検討中です。 ***":stop:goto *SENTAKU1
'
'------------観測手簿の計算--------------
*KANSOKU
cls:locate 20,10:print "*** 検討中です。 ***":stop:goto *SENTAKU1
'
'
*MENU1
locate 15,8:print"*** 作 業 メニュウ- ***"
locate 20,12:print"デ-タの入力 ・・・・・・・1"
locate 20,14:print"デ-タの修正 ・・・・・・・2 "
locate 20,16:print"計算書の印刷 ・・・・・・・3 "
locate 20,18:print"作業の終了 ・・・・・・・・4 "
locate 30,21:input"番号を指定    ";J
if J<1 or J>4 then *MENU1
return
'
'-----度.分秒の分離-----
*DOFUNBYO1
VV=abs(AN):V1=fix(AN):V2=fix*5*100#):V3=(VV*100#-fix(VV*100#))*100#
if AN<0 then V1=(V1+0.1)*sgn(AN)
return
'
*ENDD1
 
 
 
'
*SYURYOU
'
end
 

*1:T-fix(T

*2:T-fix(T

*3:T-fix(T

*4:T-fix(T

*5:VV-fix(VV