Deux cadrans analemmatiques à heure légale


Second cadran - Programme

Voici pour terminer cette présentation un petit programme écrit en Qbasic de Microsoft qui permet de calculer la position des points nécéssaires à la réalisation de ce second type de cadran. Il faut, pour l'utiliser, renseigner les variables suivantes: Après lancement, le programme affiche les heures légales entre lesquelles le cadran peut fonctionner puis il affiche les coordonnées des différents points dans le repère suivant: Pour avoir une impression des résultats il suffit de remplacer les instructions PRINT par LPRINT.

Remarque: Ce programme est valable en tout point du globe sans aucune modification.


REM Constantes
k = .0172024
jm = 308.67
jl = 21.55
e = .0167
ob = .4091
pi = 3.141593: dr = pi / 180: hr = pi / 12

REM Coordonnées géographiques
lo = -2.1: la = 49.1
lo = lo * dr: dp = (90 - la) * dr

REM Heure légale recouverte par la courbe en 8, fuseau horaire
hc = 14: fh = 1
ag = lo - (hc - fh) * hr + pi

REM Déclinaison et inclinaison du cadran, hauteur du centre de rotation
d = 0: i = 0: g = 100
d = d * dr: i = i * dr

REM Heures de fonctionnement ************************

REM Vecteur normal au plan du cadran
x = 0: y = 0: z = -g

REM Passage au repère local
r = -i: GOSUB 1200: r = d: GOSUB 1300

REM Passage au repère équatorial
r = -dp: GOSUB 1200: r = ag: GOSUB 1300

REM Calcul de la portion utile
IF x = 0 THEN
 a = pi
ELSE
 a = ATN(y / x)
 IF x < 0 THEN
  IF y = 0 THEN a = pi ELSE a = a + SGN(y) * pi
 END IF
 a = 2 * a
END IF

REM Calcul de l'heure limite du centre de rotation
h1 = hc + 12
IF h1 >= 24 THEN h1 = h1 - 24

REM Calcul de l'heure limite projetée à l'infini
h2 = -a / hr + h1
IF h2 < 0 THEN h2 = h2 + 24
IF h2 >= 24 THEN h2 = h2 - 24

REM affichage des résultats
IF y = 0 THEN
 IF x > 0 THEN
  PRINT "Le cadran ne fonctionne pratiquement pas"
 ELSE
  PRINT "le cadran fonctionne presque tout le jour"
 END IF
ELSE
 IF y > 0 THEN
  PRINT USING "Le cadran fonctionne entre ##.# h et ##.# +/- 0,5 h"; h2; h1
 ELSE
  PRINT USING "Le cadran fonctionne entre ##.# +/- 0,5 h et ##.# h"; h1; h2
 END IF
END IF
PRINT "Quand la table du cadran est éclairée ..."
PRINT

REM Tracé du pied du style **************************

REM Heure UT de midi moyen local
h = 12 + lo / hr

FOR mi = 1 TO 12
IF mi < 3 THEN mo = mi + 12 ELSE mo = mi

FOR jo = 1 TO 21 STEP 10

REM Nombre de jours écoulés depuis le 1 Mars O h TU
j = INT(30.61 * (mo + 1)) + jo + h / 24 - 123

REM Anomalie et longitude moyenne
m = k * (j - jm): l = k * (j - jl)

REM Longitude vrai
s = l + 2 * e * SIN(m) + 1.25 * e * e * SIN(2 * m)

REM Coordonnées rectangulaires du soleil dans le repère équatorial
x = COS(s): y = COS(ob) * SIN(s): z = SIN(ob) * SIN(s)

REM Equation du temps et déclinaison puis inversion
r = l: GOSUB 1300: y = -y: z = -z

REM Passage au repère local
r = -ag: GOSUB 1300: r = dp: GOSUB 1200

REM Passage au repère cadran
r = -d: GOSUB 1300: r = i: GOSUB 1200

REM Position du pied du style
PRINT USING "Le ## du mois ##:"; jo; mi;
PRINT TAB(29); "X ="; -g * x / z, "Y ="; -g * y / z

NEXT: NEXT
PRINT

REM Tracé de la ligne horaire ***********************

FOR hl = 4 TO 20

REM Vecteur "centre de projection-point horaire" dans le repère équatorial
a = lo - (hl - fh) * hr
x = COS(a) - COS(ag): y = SIN(a) - SIN(ag): z = 0

REM Passage au repère local
r = dp: GOSUB 1200

REM Passage au repère cadran
r = -d: GOSUB 1300: r = i: GOSUB 1200

REM Position du point horaire
PRINT USING "A l'heure ##:"; hl;
PRINT TAB(29); "X ="; -g * x / z, "Y ="; -g * y / z

NEXT

END

1200 REM Rotation de l'angle r autour de l'axe y
rx = COS(r) * x - SIN(r) * z: rz = SIN(r) * x + COS(r) * z
x = rx: z = rz: RETURN

1300 REM Rotation de l'angle r autour de l'axe z
rx = COS(r) * x + SIN(r) * y: ry = -SIN(r) * x + COS(r) * y
x = rx: y = ry: RETURN


Télécharger le source -o- Retour à la page principale

Date de création: 18 Novembre 97