Comment disposer trois gnomons pour que l'extrémité de l'ombre de chaque gnomon passe par le pied des deux autres


Programme de calcul d'une configuration

Le programme proposé ci-dessous est écrit pour Qbasic de Microsoft mais il est facilement adaptable à tout autre langage. Il permet de calculer la ou les configurations de trois gnomons à partir de la hauteur du premier gnomon et de l'heure vraie à laquelle l'extrémité de son ombre passe au pied du second. Pour chaque configuration un tableau est affiché, il donne à chaque fois que l'ombre d'un gnomon passe au pied d'un autre l'heure vraie, l'azimut et la hauteur du soleil.

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


DECLARE FUNCTION angl! (x!, y!)
DECLARE FUNCTION asin! (y!)
DECLARE FUNCTION acos! (x!)

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


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

Date de création: 21 Février 00