Voici le code source asy d'une figure expliquant comment sont créées les lignes horaires temporaires sur la surface de la sphère (céleste, rayon unité par définition). Le plan horizontal est l'horizon du lieu, l'origine du repère est l'observateur, le point du vue est préférentiellement l'Est. Les arcs S-e et S'-h sont les arc solsticiaux d'été et d'hiver respectivement, E-Eq est l'équateur. Les "jolies" courbes en jaune sont les lignes temporaires ou des portions de sinusoïdes sphériques.
J'aurais voulu tracer les points d'intersection entre chaque sinusoïde et les 3 arcs (été, équinoxe, hiver) : je n'y parvient pas...je sèche un peu (ce n'est pas grave pour mon argumentation de la figure, mais quand même, est-ce qu'Asymptote peut le faire? - sachant que les arcs dessinés ne sont pas exactement des arcs de cercle...).
J'aurai voulu aussi faire apparaître les sommets (ou crête) de chaque sinusoïde; lesquels se trouvent sur un arc de cercle (en dashdotted) d'axe l'axe des pôles, et parallèle bien sur à l'équateur. Là non plus je n'y suis pas parvenu ! Décidément...
Dernière chose, pour faire complet : j'ai tracé les arcs orientés +u et -u. J'y ai passé beaucoup de temps et j'ai trouvé une solution. Mais personnellement je trouve que c'est du bricolage, aussi n'existerai-t-il pas une meilleure solution pour juste obtenir le tracé d'un "arc de cotation" pour les angles (en 2D j'ai compris comment faire et quoi utiliser, mais en 3D?).
En tout cas, la figure proposée est assez compliqué quand même, et le pdf fait à peine 3,6 Mo, ce qui j'estime n'est pas trop vu les choses qu'il y a sur la figure ! Cela peut servir de modèle d'exemple après tout... Tout ceci a été fait à partir des nombreux exemples présents sur ce site (et celui de P. Ivaldi), sans lesquels je serais à peine capable de tracer un segment !
Code : Tout sélectionner
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Work = Lycée Professionnel Pasteur
// 25 rue du Professeur Delvalle - 06000, Nice.
// date = 7 février 2010.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Objet = Gnomonique théorique
// Lignes horaires Temporaire en usage dans l'antiquité.
// Figure : Définition de la différence ascensionnelle. (figure de Delambre revisitée)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
settings.outformat="pdf";
settings.prc=true; // pour figure 3D manipulable à la souris sous Adobe Reader >7.
settings.tex="pdflatex";
//Appel des fichiers de macros.
import geoespace;
import graph3;
import solids;
//usepackage("mathrsfs");
usepackage("relsize");//règle la taille du texte...
usepackage("asycolors");
currentpen=fontsize(9);
//unitsize(1cm);
size(420,0);
dotgranularity=0; // Render dots as spheres.
// Réglages de la vue...
currentprojection=orthographic(3,10,8);
currentlight=(0,0,10);
//~~~~~~~~~ CONSTRUCTIONS des objets de la figure de Delambre ~~~~~~~~~
//latitude géographique du lieu du cadran solaire... *
// *********************************************************************
real phi=43+43/60;//(38+00/60); // Nice, bien sur... * <---- // 66+34/60
// *********************************************************************
real R=1; // Rayon de la sphère <----
// Construction de la demi-sphère céleste...
surface SphereCeleste=unithemisphere; // Demi-sphère de rayon unité.
draw( surface( SphereCeleste) , lightblue+opacity(.4));
// Equateur Céleste...
path3 equateur=rotate((90-phi), -Y)*arc( (0,0,0), (0,R,0), (0,-R,0), Z, CW );
draw(equateur,0.75bp+dashed+3blue,Arrow3(Relative(1/8),size=7bp));
// Cercle limite des hectémories. Enveloppe des maxima...
triple centre_maximal=R*(0,0,Sin(90-phi));
path3 cercle_maximal = rotate((90-phi), -Y)*Circle(centre_maximal,R*Cos(90-phi),10);
draw(cercle_maximal,0.75bp+dashdotted+red);
// Paramètres de calcul : obliquité de l'écliptique, arcs semi-diurne (ou angle horaire des lever/coucher).
real deltamax=23+26/60;
real ue=aCos(-Tan(phi)*Tan(deltamax)); // arc semi-diurne en été.
real uh=aCos(-Tan(phi)*Tan(-deltamax)); // arc semi-diurne en hiver.
// La différence ascensionnelle : -u en hiver, +u en été... (pour une déclinaison max ou mini)
real diff_asc=aSin(Tan(phi)*Tan(deltamax));
// Construction des tropiques.
triple centre_tropique_ete=R*(0,0,Sin(deltamax) ),//centre du parallèle supérieur (sur l'axe des pôles)
e1=R*(Cos(ue)*Cos(deltamax),Sin(ue)*Cos(deltamax),Sin(deltamax) ) ,//pt lever
e2=R*(Cos(-ue)*Cos(deltamax),Sin(-ue)*Cos(deltamax),Sin(deltamax) ) ;//pt coucher
path3 tropique_ete=rotate((90-phi), -Y)* arc( centre_tropique_ete, e1, e2 , Z, CW );// tropique du cancer
draw(tropique_ete,0.75bp+dashed+orange,Arrow3(Relative(1/8),size=7bp));
triple centre_tropique_hiver=R*(0,0,Sin(-deltamax) ),//centre du parallèle inférieur (sur l'axe des pôles)
h1=R*(Cos(uh)*Cos(-deltamax),Sin(uh)*Cos(-deltamax),Sin(-deltamax) ),//pt lever
h2=R*(Cos(-uh)*Cos(-deltamax),Sin(-uh)*Cos(-deltamax),Sin(-deltamax) );//pt coucher
path3 tropique_hiver=rotate((90-phi),-Y)*arc( centre_tropique_hiver, h1, h2, Z, CW );// tropique du capricorne
draw(tropique_hiver,0.75bp+dashed+orange,Arrow3(Relative(1/8),size=7bp));
// Fin de la construction des tropiques.
real K=- cot(radians(phi)); // Il n'existe pas de fonction cotangente "Cot(.)" pour les degrés... C'est Curieux
// CONSTRUCTION des sinusoïdes sphériques - (voir aussi Chasles)...
for(int k=1; k < 7; ++k) { //
real n=6/k ; // heure temporaire
// Equation paramétrique des sinusoïdes sphériques (sur la sphère céleste)...
real x(real t) {return R*Cos(t)/sqrt(1+(K*Cos(n*t))^2) ;}
real y(real t) {return R*Sin(t)/sqrt(1+(K*Cos(n*t))^2) ;}
real z(real t) {return R*K*Cos(n*t)/sqrt(1+(K*Cos(n*t))^2) ;}
// courbes hectémoréales.
path3 hectemorie=rotate((90-phi), -Y)*graph(x,y,z,0,k*60/2, operator ..);
draw(hectemorie, 1/1.8bp+3*yellow, Arrow3(7bp,Relative(.85)) );
} //fin de boucle.
//~~~~~~~~~ Quelques décors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Axes du repère 3D.
draw((-R,0,0)--(R+0.25,0,0),Arrow3);
draw((0,-R,0)--(0,R+0.2,0),Arrow3);
draw((0,0,0)--(0,0,R+0.2),Arrow3);
label("$x$", (R+0.2,0,0),sud); // l'axe des x est orienté vers le sud.
label("$y$", (0,R+0.2,0),est); // l'axe des y est orienté vers l'est.
label("$z$", (0,0,R+0.2),ouest); // L'axe des z est l'axe vertical (zénith du lieu).
// Lettrage des Points : Pôle Nord Céleste, Sud, Nord (local) et zénith - (sur l'axe Ox)
triple Eq=rotate((90-phi), -Y)*(R,0,0),
PoleNord=rotate((90-phi), -Y)*(0,0,R),
Sud=(R,0,0),
Nord=(-R,0,0),
Zenith=(0,0,R) ;
dot("$E_q$",Eq,nouest,3bp+red); // Equateur
dot("$P$",PoleNord,nest,3bp+black); //Pôle nord céleste
dot("$S_d$",Sud,ouest,3bp+blue); //Sud local
dot("$N$",Nord,est,3bp+blue); //nord local
dot("$Z$",Zenith,nouest,3bp+black); //zénith du lieu
dot("$E$",(0,R,0),souest,3bp+blue); //Est
dot((0,-R,0),2bp+blue); //Ouest
// Lettrage sur les tropiques (au méridien).
dot("$e$",rotate((90-phi),-Y)*(R*Cos(deltamax),0,R*Sin(deltamax)),nouest,3bp+black);
dot("$h$",rotate((90-phi),-Y)*(R*Cos(-deltamax),0,R*Sin(-deltamax)),nouest,3bp+black);
// Lettrage aux levers du soleil pour les tropiques.
dot("$S$",rotate((90-phi),-Y)*e1,sud,3bp+black); // point du lever en été.
dot("$S^\prime$",rotate((90-phi),-Y)*h1,sud,3bp+black); // point du lever en hiver.
// arc méridien
path3 ArcMeridien=arc((0,0,0), (R,0,0), (-R,0,0), Y, CW);
draw(ArcMeridien,1bp+red);
// Tracé de l'axe équatorial.
draw((0,0,0)--Eq,0.75bp+deepblue+dashed);
// Tracé de l'axe des pôles
draw((0,0,0)--PoleNord,dashed+0.75bp+deepblue);
// arcs pour les différences ascensionnelles +/- u :
path3 Arc_ete =rotate((90-phi), -Y)*arc((0,0,0), (0,0,R), e1 , CCW);
path3 Arc_hiver =rotate((90-phi), -Y)*arc((0,0,0), (0,0,R), h1 , CCW);
path3 Arc_equateur =rotate((90-phi), -Y)*arc((0,0,0), (0,0,R), (0,R,0), CCW);
draw(Arc_ete,1bp+10*white);
draw(Arc_hiver,1bp+10*white);
draw(Arc_equateur,1bp+white);
// Ci-après, c'est un peu du bidouillage, tout ça pour marquer les angles +/- u...
// Peut-on mieux faire?
// marquage des angles +u et -u... les différences ascensionnelles.
real alpha1=22; // réglage la position de l'arc le long de l'axe de pôles...
triple centre_arc=R*(0,0,Sin(90-alpha1)), // centre de l'arc de cercle pour u.
arc10=R*(0,Cos(90-alpha1),Sin(90-alpha1)) , // point sur l'arc perp. au méridien
arc11=R*(Cos(ue)*Cos(90-alpha1),Sin(ue)*Cos(90-alpha1),Sin(90-alpha1));// point sur l'arc de u...
path3 arc1 = rotate((90-phi), -Y)* arc(centre_arc, arc10, arc11 , CCW);
draw( arc1, 0.75bp+heavyblue, Arrow3(5bp) );
real alpha2=20; // réglage la position de l'arc le long de l'axe de pôles...
triple arc20=R*(0,Cos(90-alpha2),Sin(90-alpha2)) ,
arc21=R*(Cos(uh)*Cos(90-alpha2),Sin(uh)*Cos(90-alpha2),Sin(90-alpha2));
path3 arc2 = rotate((90-phi), -Y)* arc(centre_arc, arc20, arc21 , CCW);
draw( arc2, 0.75bp+heavyblue, Arrow3(5bp) );
triple arc15=R*(Cos(ue-diff_asc/2)*Cos(90-alpha1),Sin(ue-diff_asc/2)*Cos(90-alpha1),Sin(90-alpha1)),
arc16=R*(Cos(uh+diff_asc/2)*Cos(90-alpha2),Sin(uh+diff_asc/2)*Cos(90-alpha2),Sin(90-alpha2));
label("\relsize{-1.5}{$+u$}",rotate((90-phi),-Y)*arc15,souest+0.5bp,deepblue);//marquage de +u.
label("\relsize{-1.5}{$-u$}",rotate((90-phi),-Y)*arc16,souest+0.15bp,deepblue);// marquage de -u.
shipout(bbox(0.5cm));//pour encadrer et laisser une marge sur le dessin.