Dans un article de la revue Cadran-Info de mai 2021 page 51 (« Cadrans cylindriques de Hartmann »), Henri et Paul Gagnaire décrivent la maquette d’un cadran de hauteur original. Le présent billet en propose une réalisation.
Les courbes horaires sont tracées sur un plan. L’échelle horizontale constitue un calendrier. Une épingle tient lieu de style, ici. Perpendiculaire au plan, le style est placé sur la verticale correspondant au solstice d’été.
Pour lire l’heure, il faut disposer le cadran verticalement, en l’orientant de manière à ce que l’extrémité de l’ombre du style atteigne la ligne de la date du jour.
Sur la photo précédente : réglage sur le 10 novembre, on lit 15h30 (photo prise l’après-midi). Sur ce tracé, une simplification a été adoptée : les lignes verticales de dates sont régulièrement espacées de 10 jours (ce qui rend le mois de février aussi long que les autres…) J’estime que cette simplification induit une erreur qui reste inférieure à la précision du cadran. Elle évite de multiplier les lignes verticales, car le calendrier est replié (janvier à juin vers la droite, puis juillet à décembre vers la gauche).
On peut comparer ce cadran solaire au cadran de berger, dont le style se déplace sur la verticale de la date. Sur le cadran de berger, du fait des fluctuations de la hauteur du Soleil au cours de l’année, les lignes horaires sont très resserrées au solstice d’hiver mais très étendues au solstice d’été. Plusieurs solutions peuvent être imaginées pour résoudre ce problème. On peut trouver dans des collections de musées des cadrans de berger munis de deux styles de longueurs différentes, avec deux ensembles de lignes (été et hiver).
Le cadran plan à style fixe, quant à lui, imagine un « style droit virtuel » d’autant plus long que l’on s’éloigne du solstice d’été.
Ainsi, dans la formule calculant la hauteur des lignes, la longueur du style virtuel est l’hypoténuse du triangle ESH. Deux effets s’opposent : l’allongement du style virtuel tend à décaler les courbes vers le bas alors que l’approche du solstice d’hiver tend à avoir l’effet inverse.Le résultat est un ensemble de courbes horaires de hauteurs comparables.
Considérations techniques sur le calcul des courbes horaires :
Le calcul des hauteurs de courbes a été réalisé en rédigeant un code Python, qui réalise les calculs des coordonnées ainsi que le tracé des courbes.
Le code Python :
#Tracé d'un cadran solaire de hauteur plan, à style droit fixe
import matplotlib.pyplot as plt
import numpy as np
#paramètres de départ :----------------------------------------------
latitude=np.radians(49.5)#REGLAGE LATITUDE
a=3.0#longueur du style
largeur=18#largeur du plan, pour l'échelle horizontale
plt.rcParams["font.family"] = "Ubuntu"#ou autre police installée sur le système
plt.rcParams.update({"text.usetex": True}) #police LaTeX (optionnel)
plt.rcParams["font.size"] = 11#taille de la police
#Modèlisation déclinaison selon le rang J du jour :
def declinaison(J):
return np.arcsin(np.sin(np.radians(23.44))*np.sin((J-81)*2*np.pi/365.2422))
#------------------------------------------------------------------------------------
#calcul de l'angle horaire maximal, d'après la latitude :
Ahmax=np.degrees(np.arccos(-np.tan(latitude)*np.tan(np.radians(23.4))))
Ahmax=105#pour forcer Ahmax manuellement
Ah=np.radians(np.arange(0, Ahmax+15, 15))#angle horaire
J=np.arange(1, 365, 0.1)#rang du jour dans l'année
N=np.arange(0, 181, 1)#rang du jour après 21 juin
decl=declinaison(N+171)#déclinaison après le 21 juin
x=-largeur/180*N#distance horizontale au 21 juin
b=np.sqrt(a**2+x**2)#taille du style virtuel, à une date donnée
#Paramètres du graphique :
fig=plt.figure(figsize=(8, 5), tight_layout=True, edgecolor='royalblue', linewidth=2)
ax=plt.subplot(111, aspect='equal')
plt.xlim(-largeur-0.6, 0.6)#limites de l'axe en abscisses
plt.title("Cadran de hauteur à style fixe (Latitude %s°)"%(round(np.degrees(latitude), 2)))
plt.scatter(0, 0, s=12, color='red')#point d'implantation du style
plt.text(0, 0.1, "style", ha='center', va='bottom', c='red')
plt.axvline(0, ls='--', color="purple", linewidth=0.5)
plt.axvline(-largeur, ls='--', color="purple", linewidth=0.5)
#------------------------------------------------------------------
#Calcul et tracé des lignes horaires
for H in Ah:
h=np.arcsin(np.sin(decl)*np.sin(latitude)+np.cos(decl)*np.cos(latitude)*np.cos(H))
y=-b*np.tan(h)
plt.plot(x, y)
h0hiver=np.arcsin(np.sin(min(decl))*np.sin(latitude)+np.cos(min(decl))*np.cos(latitude)*np.cos(H))
h0ete=np.arcsin(np.sin(max(decl))*np.sin(latitude)+np.cos(max(decl))*np.cos(latitude)*np.cos(H))
if h0ete>0:#écrire l'heure (matin)
plt.text(0.1, -a*np.tan(h0ete), "%s"%(int(round(12-np.degrees(H)/15))), fontsize=13, va='center')
if h0hiver >0:#écrire l'heure (soir)
plt.text(-largeur, -largeur*np.tan(h0hiver), "%s"%(int(12+np.degrees(H)/15)), fontsize=13, va='center', ha='right')
#Demi-heures :
demies=np.radians(np.arange(7.5, 127.5, 15))
for H in demies:
h=np.arcsin(np.sin(decl)*np.sin(latitude)+np.cos(decl)*np.cos(latitude)*np.cos(H))
y=-b*np.tan(h)
plt.plot(x, y, 'g--', alpha=0.5, linewidth=0.5)
#---------------------------------------------------------------
ymin, ymax=ax.get_ylim()#récupération des limites verticales (avant le tracé des graduations de hauteur)
plt.ylim(ymin, 0)
#graduations juillet à décembre :
datesS2=np.array([182, 213, 244, 274, 305, 335])#rangs des 1ers jours des mois
initialeS2=["D", "N", "O", "S", "A", "J"]#initiale du mois
gradDates=np.arange(-16, 0, 3)
ax.xaxis.set_ticks(gradDates)
ax.xaxis.set_ticklabels(initialeS2)
ax.xaxis.set_ticks(np.arange(-18, -1, 1), minor=True)#grille secondaire verticale
#graduations janvier à juin :
initialeS1=["J", "F", "M", "A", "M", "J"]#initiale du mois
datesS1=np.array([0, 30, 60, 90, 120, 150])#rangs du 1er jour du mois
xdatesS1=-(170-datesS1)/180*largeur
for n in range(len(datesS1)):
plt.text(xdatesS1[n], ymin+0.1, initialeS1[n], ha='center')
ax.yaxis.set_ticks([])#suppression des graduations en ordonnées
plt.grid(which='major')
plt.grid(which='minor', alpha=0.5)
#Repères de saisons
plt.text(0, 0.98*ymin, "solstice d'été", rotation=90, backgroundcolor="white", ha='center', va='bottom')
plt.text(-largeur, 0.98*ymin, "solstice d'hiver", rotation=90, backgroundcolor="white", ha='center', va='bottom')
#lignes de hauteurs :
hmax=90+23.4-np.degrees(latitude)#hauteur méridienne maxi (21 juin)
gradh=np.radians(np.arange(5, hmax+5, 5))
for h in gradh:
y=-b*np.tan(h)
plt.plot(x, y, linewidth=0.4, color='gray', alpha=0.5)
#Segment de la longueur du style :
plt.plot([-largeur+1, -largeur+1+a], [ymin+1, ymin+1], lw='6', color='darkblue', solid_capstyle='butt')
plt.text(-largeur+1+a/2, ymin+0.6, 'longueur du style', ha='center')
#-------------------------------------------------------------------------------------
#Personnaliser le nom du fichier sauvegardé, avec la latitude :
latitudeChaine=str(round(np.degrees(latitude), 2))#latitude en chaîne de caractères
if latitudeChaine[-1]=="0":
latitudeChaine=latitudeChaine[:-2]#si entière, retirer le point et le 0
latitudeChaine=latitudeChaine.replace(".", "-")
NomFichier="CadranHauteurPlanStyleFixe"+latitudeChaine
fig.savefig(NomFichier+".pdf")
fig.savefig(NomFichier+".png", dpi=300)
#fig.savefig("CadranHauteurPlanStyleFixe495.png", dpi=300)
plt.show()
Pour adapter à votre latitude, il suffit de modifier la valeur de la latitude dans le code.
Imprimez l’image (l’imprimante peut mettre à l’échelle). Pour construire le cadran solaire, utilisez un style de la longueur du segment figurant sur le tracé.
Dans cette version, j’ai ajouté les lignes d’égale hauteur du Soleil. En effet, rares sont les cadrans de hauteur qui permettent une lecture de la hauteur (la seule exception que je connaisse est le cadran quart de cercle).
Ces lignes de hauteur sont tracées de 5 et 5 degrés.
Exemples de lecture pour la latitude 49.5° :
- au solstice d’hiver à 14h30, la hauteur du Soleil est de 10° environ.
- le 1er mai, à 9h, la hauteur du Soleil est de 40° environ.
Pour supprimer les lignes d’égale hauteur, il suffit de supprimer le code correspondant dans le programme.
Vous pouvez également télécharger le document pdf suivant, qui contient le tracé pour les latitudes entières de la France métropolitaine, de 42 à 52° :
Réalisation concrète du cadran :
Pour assurer la verticalité du plan et la rigidité du style, ce cadran gagnera a être réalisé en bois ou métal. Voici le fichier .svg du plan du cadran, en vue d’une découpe au laser :
Ce dessin a été réalisé avec Inkscape, en exportant le tracé pdf. Inkscape est un logiciel gratuit et multi-plateforme de dessin vectoriel, qui permet l’export en format dxf, un format utilisable pour les découpeuses laser.
Le diamètre du cercle vert (trou du style) est à adapter à celui de la tige.
Soyez le premier à commenter