Remarque: Ce programme est valable en tout point du globe sans aucune modification.
DIM x(3), y(3), g(3)
DIM gm(6), pd(6), ah(6), az(6), h(6)
REM Constantes / Initialisations
pi = 3.141593
dr = pi / 180
hr = pi / 12
x(1) = 0: y(1) = 0: g(1) = 1
CLS
INPUT "Latitude, négative dans l'hémisphère sud (P)"; p: p = p * dr
INPUT "Déclinaison comprise entre 0 et P (D)"; d: d = d * dr
INPUT "Hauteur du premier gnomon (G)"; g
IF ABS(p + d) > pi / 2 THEN
REM Le soleil ne se couche pas
PRINT "Heure vraie comprise entre 0 et 24";
ELSE
REM Le soleil se couche, calcul des heures vraies limites
hm = 2 * ATN(SIN(d) / SIN(p))
ah1 = acos(-TAN(p) * TAN(d))
ah2 = acos(SIN(hm) / COS(p) / COS(d) - TAN(p) * TAN(d))
PRINT USING "Heure vraie comprise entre ##.#### et ##.####"; 12 - ah1 / hr; 12 - ah2 / hr
PRINT USING " ou entre ##.#### et ##.####"; 12 + ah2 / hr; 12 + ah1 / hr;
END IF
INPUT " (Hv)"; hv: ah = (hv - 12) * hr
REM Position du pied du second gnomon
dn = COS(p) * COS(d) * COS(ah) + SIN(p) * SIN(d)
x(2) = (COS(p) * SIN(d) - SIN(p) * COS(d) * COS(ah)) / dn
y(2) = COS(d) * SIN(ah) / dn
REM Coefficients de l'équation des courbes d'ombre
i = SIN(d) * SIN(d) - COS(p) * COS(p)
j = SIN(d) * SIN(d)
k = -SIN(2 * p)
l = SIN(d) * SIN(d) - SIN(p) * SIN(p)
REM Hauteur du second gnomon
g(2) = k / l * x(2) + 1
REM Affichage de la position et la hauteur du second gnomon
PRINT "X2="; g * x(2), "Y2="; g * y(2), "G2="; g * g(2)
REM variable intermédiaire
u = i - k * k / 2 / l
REM Coefficients de l'équation du second degré
a = i * j * y(2) * y(2) + u * u * x(2) * x(2)
b = j * k * y(2) * y(2) + u * l * x(2)
c = j * l * y(2) * y(2) + l * l / 4
REM Discriminant
dt = b * b - 4 * a * c
REM Première solution
x(3) = (-b - SGN(p) * SQR(dt)) / 2 / a
GOSUB 1000
IF a > 0 THEN
REM seconde solution
PRINT "Autre configuration:"
x(3) = (-b + SGN(p) * SQR(dt)) / 2 / a
GOSUB 1000
ELSE
PRINT "Il n'y a pas d'autre configuration"
END IF
END
1000 REM Calcule et affiche tous les éléments d'une configuration
REM abscisse du pied du troisième gnomon
y(3) = -(u * x(2) * x(3) + l / 2) / j / y(2)
REM Hauteur du troisième gnomon
g(3) = k / l * x(3) + 1
REM Affichage de la position et la hauteur du troisième gnomon
PRINT "X3="; g * x(3), "Y3="; g * y(3), "G3="; g * g(3)
REM Calcul de l'angle horaire et la position du soleil
REM à chaque fois que l'ombre d'un gnomon atteint le pied d'un autre
i3 = 1
FOR i1 = 1 TO 3
FOR i2 = 1 TO 3
IF i1 <> i2 THEN
gm(i3) = i1: pd(i3) = i2
dx = x(i2) - x(i1)
dy = y(i2) - y(i1)
ah(i3) = angl(COS(p) * g(i1) - SIN(p) * dx, dy)
az(i3) = angl(-dx, dy)
h(i3) = ATN(g(i1) / SQR(dx * dx + dy * dy))
i3 = i3 + 1
END IF
NEXT
NEXT
REM Tri des résultats par ordre croissant d'angle horaire
FOR i1 = 1 TO 5
FOR i2 = i1 + 1 TO 6
IF ah(i1) > ah(i2) THEN
i3 = gm(i2): gm(i2) = gm(i1): gm(i1) = i3
i3 = pd(i2): pd(i2) = pd(i1): pd(i1) = i3
i3 = ah(i2): ah(i2) = ah(i1): ah(i1) = i3
i3 = az(i2): az(i2) = az(i1): az(i1) = i3
i3 = h(i2): h(i2) = h(i1): h(i1) = i3
END IF
NEXT
NEXT
REM Affichage des résultats
PRINT "gnomon pied heure vraie azimut hauteur"
FOR i1 = 1 TO 6
PRINT USING " # # ##.#### ####.#### ##.####"; gm(i1); pd(i1); 12 + ah(i1) / hr; az(i1) / dr; h(i1) / dr
NEXT
RETURN
FUNCTION acos (x)
REM Fonction Arc Cosinus
SHARED pi
IF x = 0 THEN
a = pi / 2
ELSE
a = ATN(SQR(1 - x * x) / x)
IF x < 0 THEN a = a + pi
END IF
acos = a
END FUNCTION
FUNCTION angl (x, y)
REM Angle d'un vecteur par rapport à l'axe des x
SHARED pi
IF x = 0 THEN
a = SGN(y) * pi / 2
ELSE
a = ATN(y / x)
IF x < 0 AND y >= 0 THEN a = a + pi
IF x < 0 AND y < 0 THEN a = a - pi
END IF
angl = a
END FUNCTION
FUNCTION asin (y)
REM Fonction Arc Sinus
SHARED pi
IF ABS(y) = 1 THEN asin = y * pi / 2 ELSE asin = ATN(y / SQR(1 - y * y))
END FUNCTION
Date de création: 21 Février 00