Programme informatique de construction
des cadrans solaires bifilaires et à polos
par
Jean Pakhomoff
gnomoniste à Marseille
1ère partie (1/4)
30 OPEN "bfpnop.wps" FOR OUTPUT AS#1
50 REM CETTE ETUDE PERSONNELLE DES CADRANS BIFILAIRES (ET A POLOS) EST
DEDIEE A MES DEUX FILLES SONIA ET NATHALIE.
60 REM JEAN PAKHOMOFF FEVRIER 1995
65 REM 24 JUIN 1997. instruction OPEN en Novembre 2000.
90 KEY OFF:DEFDBL A-Z:CLS:PI=4#*ATN(1#)
100 INPUT "Cadran à heures solaires: appuyez sur s; à heures civiles sur c. s ou
c ?",JEANPAKHOMOFF$
110 IF JEANPAKHOMOFF$="s" THEN GOTO 430
120 PRINT "Correction arbitraire selon le pays: par exemple en France + 1 heure
l'hiver"
130 PRINT
140 PRINT "et + 2 heures l'été; cette correction peut être éventuellement < 0"
150 PRINT
160 INPUT "?",XCA
170 PRINT "Longitude du fuseau , longitude du lieu ; - pour l'est, + pour l'oues
t"
180 PRINT
190 PRINT "a,b en degrés décimaux"
200 INPUT LO,L
210 PRINT
220 PRINT #1,"Correction arbitraire = ";XCA;"h.";" Longitude du fuseau = ";LO;"°
"
230 PRINT
240 PRINT #1,"Longitude du lieu = ";L;"°"
250 LMM=12#+XCA-(LO-L)/15#
260 PRINT "A midi local il est ";LMM;" h. civile"
270 PRINT #1," A midi local il est ";LMM;" h.civile":PRINT #1,
280 PRINT
290 U=FIX(LMM):UU=U+.25#:UUU=U+.5#:UUUU=U+.75#
300 IF LMM>UUUU THEN 340
310 IF LMM>UUU THEN 350
320 IF LMM>UU THEN 360
330 LLH=U: GOTO 370
340 LLH=UUUU: GOTO 370
350 LLH=UUU: GOTO 370
360 LLH=UU
370 RRRM=(LMM-LLH)*15#
380 PRINT "Angle horaire de départ du matin =";RRRM;"° <==> ";LLH;"h. civiles."
390 PRINT #1,"Angle horaire de départ du matin =";RRRM;"° <==> ";LLH;"h. civiles
.":PRINT #1,
400 RRRS=3.75#-RRRM
410 PRINT "Angle horaire de départ de l'aprés-midi =";RRRS;" <==> ";LLH+.25#;" h
. civiles."
420 PRINT #1,"Angle horaire de départ de l'aprés-midi =";RRRS;" <==> ";LLH+.25#;
" h. civiles."
430 INPUT "Mois et année de construction du cadran (mois de 1 à 12): mo,an ?",MO
,AN:ANN=AN:AN=AN-1900#+MO/12#:EPS=(23#*3600#+27#*60#+8.26#)/3600#:EPS=EPS*PI/180
440 EP=EPS-(.46845#*AN/3600#)*PI/180#:LEC=0:REM En ce qui concerne les variation
s d'epsilon voir le programme nonasp
450 FOR L%=1 TO 4
460 DEC(L%)=SIN(EP)*SIN(LEC):DEC(L%)=ATN(DEC(L%)/SQR(1#-DEC(L%)^2#)):REM sinÙ=si
n¯*sinLo où Lo est la longitude écliptique.
470 LEC=LEC+PI/6#:REM pi/6=30° On a dec(1)=0; dec(2)=11...; dec(3)=20...; dec(4
)=23.439...
480 NEXT L%
490 PRINT #1,"Cadran construit en ";MO;"/";ANN
500 PRINT #1,"A cette époque epsilon est trés proche de la valeur ";EP*180#/PI
510 PRINT #1,"Les déclinaisons d'entrée dans les signes du zodiaque sont alors é
gales à":
520 DEC(2)=FIX(DEC(2)*18000000#/PI)/100000#:DEC(3)=FIX(DEC(3)*18000000#/PI)/1000
00#:DEC(4)=FIX(DEC(4)*18000000#/PI)/100000#:REM dec(1)=0
530 B(1)=DEC(1):B(2)=-DEC(2):B(3)=-DEC(3):B(4)=-DEC(4)
540 PRINT #1,DEC(1);" BELIER-BALANCE ";DEC(2);" TAUREAU-VIERGE":PRINT #1
550 PRINT #1,DEC(3);" GEMEAUX-LION ";DEC(4);" CANCER":PRINT #1
560 PRINT #1,B(2);" POISSONS-SCORPION ";B(3);" VERSEAU-SAGITTAIRE":PRINT #1
570 PRINT #1,B(4);" CAPRICORNE":PRINT #1
580 PRINT"Déclinaisons d'entrée dans les signes du zodiaque":PRINT
590 PRINT"à retenir pour la date de construction du cadran":PRINT
600 PRINT DEC(1);" ";DEC(2);" ";DEC(3);" ";DEC(4):PRINT
610 PRINT B(1);" ";B(2);" ";B(3);" ";B(4):PRINT
620 GOTO 2200
630 REM HORAZBIF ce programme donne l'angle horaire correspondant à un azimut
choisi et à une déclinaison choisie. Pratique pour avoir le point de l'arc diurn
e d'été sur une direction choisie ou l'angle horaire du soleil
640 REM lorsqu'il passe dans le plan d'un cadran vertical. On part de la formul
e de l'azimut tan(a)=sin(t)/(cos(t)*sin(f)-tan(d)*cos(f)). De là en posant sin(f
)*tan(a)=P
650 REM et tan(a)*tan(d)*cos(f)=Q on tire cos(t)*P-sin(t)-Q=0. On prend ensuite
la formule de l'arc moitié en posant tan(t/2)=m; rappelons qu'on a alors
660 REM cos(t)=(1-m^2)/(1+m^2); sin(t)=2*m/(1+m^2) et tan(t)=2*m/(1-m^2).
670 REM On fait ensuite t=2*atn(m)
680 IF F>PI/2#-.000000001# THEN 720:REM cas du pôle où tous les azimuts sont pos
sibles. On pourrait sans aucun calcul écrire que l'angle horaire égale l'azimut
puisque f=pi/2===>tgH=sin(pi/2)*tgt=tga===>a=t.
690 IF F<.0000000001# THEN IF ABS(AAA-PI/2#)<.0000000001# THEN Z3=90:SHC=90:GOTO
1040:REM équateur avec D=0 où D est la déclinaison
700 IF F<.0000000001# THEN IF AAA=PI/2#+D THEN R1=1#:R2=-1#:GOTO 790:REM cas de
l'équateur où p=0 et q=-1 ou q=1 si aaa=PI/2+D ou aaa=PI/2-D (donc D avec son s
igne). Apparemment l'ordinateur ne peut pas résoudre sqr(1-1)=0.
710 REM En fait la condition de la ligne précédente est inutile car à l'équateu
r a+D ne peut être égal à pi/2 sauf si D=0 (condition traitée à la ligne précéde
nte).
720 P=SIN(F)*TAN(AAA):Q=TAN(AAA)*TAN(D)*COS(F):IF FIX(ABS(D)*1000000#)=FIX(F*100
0000#) THEN GOTO 820
730 R1=(1#+SQR(1#+P^2#-Q^2#))/-(P+Q):R2=(1#-SQR(1#+P^2#-Q^2#))/-(P+Q)
740 IF F<PI/2#-.000000000001# THEN GOTO 780
750 RR1=2#*ATN(R1):RR2=2#*ATN(R1)+PI:IF RR1>0 THEN SHC=RR1:GOTO 1030
760 SHC=RR2:GOTO 1030
770 REM Les 2 lignes précédentes sont le cas du pôle où R1,2=(1+(-)sqr(1+tga^2))
/-tga. R1*R2=-1 <==>tgR1=-1/tgR2 <==>R2=R1+pi/2. Donc 2 racines pour les arcs mo
itiés: R1 et R1+pi/2 ce qui donne les arcs 2*R1 et 2*R1+pi. On prendra la racine
>0.
780 IF F>.00000000001# THEN GOTO 920
790 RR1=2#*ATN(R1):RR2=PI-2#*ATN(R1):IF RR1<PI/2#+.0000000001# THEN SHC=RR1:GOTO
1030
800 SHC=RR2:GOTO 1030
810 REM Les 2 lignes précédentes sont le cas de l'équateur où R1,2=(1+(-)sqr(1-t
gD^2*tga^2))/-tgD*tga. R1*R2=1 <==>tg(pi/2-R1)=1/tgR1. Donc 2 racines: 2R1 et PI
-2R1. On prend la racine < à pi/2 car à l'équateur l'angle horaire maximum est p
i/2 (asd = 6h).
820 IF ABS(P)<.0000000001# THEN SHC=0:GOTO 1030:REM Si P=0 <===> Þ=0 et si Ù=0 =
==>l'azimut est constamment égal à 90°:shc=2*(-90)=-180 +180=0
830 IF D<-.000000000001# THEN 860
840 SHC=2#*ATN(-1#/P):GOTO 1030
850 REM Si D=Þ ==>P=sinD*tga et Q=tga*tgD*cosD=tga*sinD=P. Donc R1,2=(1+(-)sqr(1
+p^2-p^2))/-(p+p) ==>R1=(1+1)/-2*p =-1/p et R2=0. C'est le cas des zones intertr
opicales où le soleil passe au zénith à midi 2 fois dans l'année.
860 AAA=PI-AAA:P=SIN(F)*TAN(AAA)
870 SHC=2#*ATN(-1#/P):SHC=PI-SHC:AAA=PI-AAA:GOTO 1030
880 REM Si D=-f on a Q=-P et P+Q=0 (car P=sin(-D)*tga=-sinD*tga et q=tga*tgD*cos
(-D)=tga*sinD===>Q=-P). Donc on ne peut plus calculer les racines R1 et R2. On v
a alors calculer l'heure symétrique sur le même cercle horaire en rajoutant Ò à
l'azimut a.
890 REM On se retrouve dans le cas de la latitude f avec l'azimut 2PI-(PI+a)=PI
-a de l'autre côté de la méridienne (du matin on passe au soir ou inversement) c
eci avec la déclinaison D=-D et D devient >0 et égal à f.
900 REM C'est le cas de la ligne 860. On sait alors calculer shc qui diffèrera d
e PI avec le shc cherché. On rajoutera PI à shc et on retranchera cet angle de 2
PI pour avoir l'angle horaire à partir de la méridienne<==> shc=2PI-(PI+shc)=PI-
shc.
910 REM On redonne alors à a sa valeur en le retranchant à PI: PI-(PI-a)=a et on
donne aussi à D sa valeur d'origine en faisant D=-D puis on renvoie à la ligne
1030.
920 R1=2#*ATN(R1):R2=2#*ATN(R2):REM valeurs en radians.
930 IF R1<0 THEN R1=R1+PI
940 IF R2<0 THEN R2=R2+PI:REM valeurs en radians
950 Z1=ATN(SIN(R1)/(COS(R1)*SIN(F)-TAN(D)*COS(F)))
960 IF Z1<0 THEN Z1=Z1+PI
970 Z2=ATN(SIN(R2)/(COS(R2)*SIN(F)-TAN(D)*COS(F)))
980 IF Z2<0 THEN Z2=Z2+PI
990 R1=R1*180#/PI:R2=R2*180#/PI
1000 AZI1=AAA-Z1:AZI2=AAA-Z2
1005 IF ABS(AZI1)<ABS(AZI2) THEN SHC=R1:GOTO 1040
1010 SHC=R2
1020 GOTO 1040
1030 Z3=ATN(SIN(SHC)/(COS(SHC)*SIN(F)-TAN(D)*COS(F))):SHC=SHC*180#/PI:Z3=Z3*180#
/PI:IF Z3<0 THEN Z3=Z3+180
1040 IF HH$="w"THEN GOTO 1070
1050 IF NO=1 THEN PRINT #1,"Le soleil passe dans le plan du cadran à ";12#+SHC/1
5#;" h.solaire du soir.":RETURN
1060 PRINT #1," Le soleil passe dans le plan du cadran à ";12#-SHC/15#;" heure s
olaire du matin.":RETURN
1070 IF NO=1 THEN PRINT #1,"Le soleil passe dans le plan du cadran à ";12#-SHC/1
5#;" h.solaire du matin.":RETURN
1080 PRINT #1," Le soleil passe dans le plan du cadran à ";12#+SHC/15#;" heure s
olaire du soir.":RETURN
1090 REM configuration affichage des verticaux.
1100 ZZ$="###.### ###.### ###.### ###.### ####.### ####.### ###.###":RETU
RN
1110 PRINT #1,TAB(2);" A hor";TAB(11);"H tab Þ";TAB(20);" AZ ";TAB(29);" Ht
";TAB(38);" X cm. ";TAB(46);" Y(A) cm. ";TAB(58);" HV tab f' "
1120 RETURN
1121 REM configuration affichage des horizontaux.
1122 ZZZ$="###.### ####.### ###.### ###.### ####.### ####.### ####.### ##
#.###":RETURN
1125 PRINT #1,TAB(2);" A hor";TAB(12);"H tab Þ";TAB(21);" AZ ";TAB(30);" Ht ";
TAB(40);" X cm. ";TAB(49);" Y(A) cm. ";TAB(59);" Y(O) cm. ";TAB(69);" HVtabf' "
:RETURN
1130 IF D=0 THEN ASDD=PI/2#:RETURN:REM calcul de l'arc semi-diurne à l'altitude
0 et sans tenir compte de la réfraction: ce problème est traité dans ASDALT puis
CADSALT ou CADSO24D.
1140 IF D>0 THEN IF D>=PI/2#-F THEN PRINT"Pas de coucher pour cette D":ASDD=PI:R
RETURN
1150 IF D<0 THEN IF ABS(D)>=PI/2#-F THEN PDL$="Pas de lever pour cette déclinais
on":PRINT PDL$:PRINT:PRINT #1,PDL$:RETURN
1160 IF F=0 THEN ASDD=PI/2#:GOTO 1200
1170 IF F<PI/2#-.00000000000001# THEN GOTO 1190
1180 ASDD=PI:GOTO 1200:REM j'avais écrit asdd=2pi dans une précédente versionLIS
T
1190 ASD=-TAN(D)*TAN(F):ASDD=ATN(SQR(1#-ASD^2#)/ASD):IF ASD<0 THEN ASDD=ASDD+PI
1200 PRINT #1,"ASD =";ASDD*180#/PI;" Durée du jour =";ASDD*24#/PI;" h.":PRINT #1
,"Lever à ";12#-12#*ASDD/PI;" et coucher à ";ASDD*12#/PI+12#;" heures solaires":
:RETURN:REM 24=(180/15) X 2
1210 REM Calcul de la déclinaison magnifique du matin et du soir.
1220 IF F<PI/2#-.00000000000001# THEN 1250
1230 PRINT #1,"Au pôle le soleil passe dans le plan du cadran à ";12#-AWM*12#/PI
;" h. solaire du matin et à ";12#+AWS*12#/PI;" h. solaire du soir.":RETURN
1240 REM Au pôle awm ou aws sont des azimuts égaux aux angles horaires.
1250 DM=-COS(F)*COS(AWM):DMM=ATN(DM/SQR(1#-(DM)^2#)):REM toujours<pi/2 donc on n
e prévoit pas de correction par pi-dmm (sinus).
1260 IF ABS(DMM)<EP THEN 1290
1280 PRINT"Ce cadran n'a pas de déclinaison magnifique":PRINT #1,"Ce cadran n'a
pas de déclinaison magnifique.":RETURN
1290 REM Calcul de l'heure du lever dans le plan du cadran.
1300 IF ABS(DMM)<.0000000001# THEN HLPCC=PI/2#:GOTO 1340
1310 IF F<.0000000001# THEN HLPCC=PI/2#:GOTO 1340
1320 HLPC=-TAN(DMM)*TAN(F):HLPCC=ATN(SQR(1#-HLPC^2#)/HLPC):IF HLPC<0 THEN HLPCC=
HLPCC+PI
1330 REM Déclinaison magnifique du soir.
1340 DS=-COS(F)*COS(AWS):DMS=ATN(DS/SQR(1#-DS^2#))
1350 REM Calcul de l'heure de coucher dans le plan du cadran.
1360 IF ABS(DMS)<.0000000001# THEN HCPCC=PI/2#:GOTO 1390
1370 IF F<.0000000001# THEN HCPCC=PI/2#:GOTO 1390
1380 HCPC=-TAN(DMS)*TAN(F):HCPCC=ATN(SQR(1#-HCPC^2#)/HCPC):IF HCPC<0 THEN HCPCC=
HCPCC+PI
1390 PRINT #1,"Déclinaison magnifique du matin =";DMM*180#/PI
1400 PRINT #1,"Heure de lever dans le plan du cadran =";12#-HLPCC*12#/PI;" h. so
laire"
1410 PRINT #1,"Déclinaison magnifique du soir =";DMS*180#/PI
1420 PRINT #1,"Heure de coucher dans le plan du cadran =";12#+HCPCC*12#/PI;" h.
solaire":REM 12=180/15
1430 RETURN
1440 REM Calcul des azimuts de lever et coucher: cos(a)=-sinD/cosf
1450 IF D>=PI/2#-F THEN PDC$="Pas de coucher pour cette déclinaison":PRINT #1,PD
C$:RETURN:REM les non levers sont traités en ligne 1150
1460 ALE=-SIN(D)/COS(F):IF ALE=0 THEN ALLE=PI/2#:GOTO 1480
1470 ALLE=ATN(SQR(1#-ALE^2#)/ALE):IF ALE<0 THEN ALLE=ALLE+PI
1480 PRINT #1,"Azimut du lever =";360#-FIX(ALLE*180000#/PI)/1000#;"°"
1490 PRINT #1,"Azimut du coucher =";FIX(ALLE*180000#/PI)/1000#
1500 RETURN