%% ========================================================================== %% %% Macros LaTeX indépendantes de xint %% %% ========================================================================== %% % Affichage des chiffres romains \newcommand{\RNum}[1]{\uppercase\expandafter{\romannumeral #1\relax}} %% ========================================================================== %% %% Définitions xint (fonctions et constantes) %% %% ========================================================================== %% % Conversion degré, minute, seconde en degrés décimaux \xintdeffloatfunc dms2d(d,m,s) := d+m/60+s/3600; % % Inclinaison de l'axe polaire \xintdeffloatvar ip := dms2d(23,26,13);% % Facteur d'agrandissement dans la projection stéréographique \xintdeffloatvar cpg := 6/tand(45+ip/2);% % Rayon du cercle de latitude phi \xintdeffloatfunc rcp(phi) := cpg*tand(45-phi/2);% % Latitude de l'héliolabe par défaut \xintdeffloatvar phi0 := 45;% % Un jour en degrés \xintdeffloatvar oneDay := 360/365.25;% % Nombre de jours suivant les mois de l'année (non bissextile) \xintdefiivar Jours := 31,28,31,30,31,30,31,31,30,31,30,31;% % Les mois de l'année \xintAssignArray{janvier}{février}{mars}{avril}{mai}{juin}% {juillet}{août}{septembre}{octobre}{novembre}{décembre}\to\Mois % Coordonnées x,y,z du point de hauteur h et d'azimut a dans la sphère locale % de latitude p \xintdeffloatfunc XYZ(p,h,a) := cosd(p)sind(h)+sind(p)cosd(h)cosd(a),% cosd(h)sind(a),% sind(p)sind(h)-cosd(p)cosd(h)cosd(a);% % Longitude et latitude célestes du point de coordonnées x,y,z et enchaînement % avec XYZ -- aatan2d est un détournement pour éviter le problème du cas x=y=0 \xintdeffloatfunc aatan2d(x,y) := (x==y)?{45}{atan2d(x,y)};% \xintdeffloatfunc toLonLat(x,y,z) := aatan2d(y,x),asind(z);% \xintdeffloatfunc LonLat(p,h,a) := toLonLat(XYZ(p,h,a)); % Calcul de l'ordonnée et du centre de l'écliptique. \xintdeffloatvar ye,re := (rcp(ip)-rcp(-ip))/2,(rcp(ip)+rcp(-ip))/2;% % Un peu de géométrie euclidienne... \xintdeffloatfunc ps(a,b,c,d) := a*c+b*d;% Produit scalaire \xintdeffloatfunc cs(a,b) := a*a+b*b;% Carré scalaire \xintdeffloatfunc add(a,b,c,d) := a+c,b+d;% Addition de 2 vecteurs \xintdeffloatfunc sub(a,b,c,d) := a-c,b-d;% Soustraction... \xintdeffloatfunc div(a,b,x) := a/x,b/x;% Division par un nombre \xintdeffloatfunc mul(a,b,x) := a*x,b*x;% Multiplication par un nombre %% ========================================================================== %% %% Interface PostScript (heliolabe.pro) %% %% ========================================================================== %% \makeatletter \def\EcliptiqueMoisLabels { \pst@killglue\begingroup\init@pscode% \addto@pscode{ tx@HeliolabeDict begin \ftf4{(rcp(ip)-6)/2}\space \ftf4{(rcp(ip)+6)/2}\space EcliptiqueMoisLabels end}% \use@pscode\endgroup\ignorespaces}% \def\TympanCerclesLabels { \pst@killglue\begingroup\init@pscode% \addto@pscode{ tx@HeliolabeDict begin 6 \ftf4{rcp(0)}\space \ftf4{rcp(ip)}\space TympanCerclesLabels end}% \use@pscode\endgroup\ignorespaces}% \def\TympanEOLabels { \pst@killglue\begingroup\init@pscode% \addto@pscode{ tx@HeliolabeDict begin \ftf4{rcp(0)}\space TympanEOLabels end}% \use@pscode\endgroup\ignorespaces}% \makeatother %% ========================================================================== %% %% Angles des cercles de hauteur interceptés par le tropique du capricorne %% %% ========================================================================== %% \def\Arc#1{ \xintdeffloatvar P1,P2 := rcp(LonLat(phi0,#1,0)[1]),rcp(LonLat(phi0,#1,180)[1]);% \xintdeffloatvar C,R := (#1<phi0)?{0.5(P1-P2),0.5(P1+P2)}{0.5(P2+P1),0.5abs(P2-P1)};% \xintdeffloatvar A := (C+R>6)?{acosd((sqr(C)+sqr(R)-36)/(2R*C))-90}{90};% \xintdeffloatvar B := -180-A;% } %% ========================================================================== %% %% Angles pour le tracé du vertical est-ouest %% %% ========================================================================== %% \def\AnglesVerticalEO{% \xintdeffloatvar lo := atan2d(sind(170),-cosd(phi0)cosd(170));% \xintdeffloatvar bo := asind(-sind(phi0)cosd(170));% \xintdeffloatvar pox,poy := rcp(bo)sind(lo),rcp(bo)cosd(lo);% \xintdeffloatvar yh,rh := cpg*tand(phi0),0.5(rcp(phi0)+rcp(-phi0));% \xintdeffloatvar ao1,ao2 := atan2d(yh,rcp(0)),atan2d(yh+poy,pox);% } %% ========================================================================== %% %% Extrémités des graduations journalières sur l'écliptique %% %% ========================================================================== %% \def\ExtremitesGraduations#1#2{% \xintdeffloatvar asc,dec := #1,#2;% \xintdeffloatvar R := rcp(#2);% \xintdeffloatvar A := R*cosd(asc),R*sind(asc);% \xintdeffloatvar O := 0,ye;% \xintdeffloatvar a,b,c:= cs(A),-ps(A,O),cs(O)-sqr(re-0.3);% \xintdeffloatvar l := (-b+sqrt(b*b-a*c))/a;% \xintdeffloatvar B := mul(A,l);% \xintdeffloatvar a,b,c:= cs(A),-ps(A,O),cs(O)-sqr(re-0.6);% \xintdeffloatvar l := (-b+sqrt(b*b-a*c))/a;% \xintdeffloatvar C := mul(A,l);% } %% ========================================================================== %% %% Construction du fichier contenant les extrémités des graduations %% %% ========================================================================== %% \def\MakeGraduations{% % Prévoir un message, cela risque de prendre un certain temps ! \xintdeffloatvar datas := 1;% Donnée d'index 0 \JulianDay(2021,1,1,0,0,0) \xintFor* ##1 in {\xintSeq[1]{1}{365}}:{% \ExtremitesGraduations{\ftf4{xmRAS(TS)}}{\ftf4{xmDS(TS)}}% \xintdeffloatvar datas := datas,A,B,C;% \xintdeffloatvar JD,TS := JD+1,(JD-2451544.0)/36525.0;% } \WriteXintValues{datas}{2021extgrad.xint} } %% ========================================================================== %% %% Chargement des extrémités de graduations %% %% ========================================================================== %% \def\LoadGraduations{% \IfFileExists{2021extgrad.xint}% {}{\MakeGraduations{}} \ReadXintValues{datas}{2021extgrad.xint} } %% ========================================================================== %% %% Accès aux extrémités de graduations %% %% ========================================================================== %% \xintNewFunction{extA}[1]{datas\xintieval{6#1+2},datas\xintieval{6#1+3}}% \xintNewFunction{extB}[1]{datas\xintieval{6#1+4},datas\xintieval{6#1+5}}% \xintNewFunction{extC}[1]{datas\xintieval{6#1+6},datas\xintieval{6#1+7}}% %% ========================================================================== %% %% Première couche du tympan (tympanA) %% %% ========================================================================== %% \def\tympanA{ \psset{linecolor=DarkSlateGray} \pscircle(0,0){6} % Le tropique du capricorne \pscircle(0,0){\ftf4{rcp(0)}} % L'équateur \pscircle(0,0){\ftf4{rcp(ip)}} % Le tropique du cancer \pscircle(0,0){\ftf4{rcp(90-ip)}} % Le cercle polaire arctique % Cercle gradué extérieur, pas : 15 minutes \multido{\rB=0+3.75}{96}{% \psline(\ftf4{6};\rB)(\ftf4{6+0.3};\rB)} \multido{\rB=0+15}{24}{% \psline[linewidth=1.25pt](\ftf4{6};\rB)(\ftf4{6+0.3};\rB)} \multido{\rB=-105+-15,\n=1+1}{12}{% \rput{!\rB\space 90 add}(\ftf4{6+0.65};\rB){\bfseries\RNum{\n}}} \multido{\rB=75+-15,\n=1+1}{12}{% \rput{!\rB\space 90 add}(\ftf4{6+0.65};\rB){\bfseries\RNum{\n}}} \pscircle(0,0){\ftf4{6+1}} \TympanCerclesLabels% } %% ========================================================================== %% %% Seconde couche du tympan (tympanB) %% %% ========================================================================== %% \def\tympanB{% \AnglesVerticalEO% \psset{linecolor=LightSteelBlue} \psline(-6,0)(6,0) % Ligne Est - Ouest % Ligne méridienne \psline(0,-6)(0,\ftf4{rcp(phi0+10)}) \psline(0,\ftf4{rcp(phi0-10)})(0,6) \psdot[dotsize=4pt](0,\ftf4{rcp(phi0)})% Zenith \psarc(0,\ftf4{-yh}){\ftf4{rh}}{\ftf4{ao1}}{\ftf4{ao2}} \psarc(0,\ftf4{-yh}){\ftf4{rh}}{\ftf4{180-ao2}}{\ftf4{180-ao1}} % Cercles de hauteur \multido{\i=0+10}{9}{\Arc{\i}% \psarcn(0,\ftf4{C}){\ftf4{R}}{\ftf4{A}}{\ftf4{B}} \rput(0,\ftf4{C-R}){\footnotesize\i°} } \multido{\i=5+10}{7}{\Arc{\i}% \psarcn[linestyle=dashed](0,\ftf4{C}){\ftf4{R}}{\ftf4{A}}{\ftf4{B}} } \TympanEOLabels% } %% ========================================================================== %% %% L'écliptique %% %% ========================================================================== %% \def\InitialiseN{% \xintdefiivar N:=0;% }% \def\AvanceN#1{ \xintdefiivar i := #1;% \xintdefiivar N := N+Jours[i-1];% }% \def\ecliptique{% \pscircle[linewidth=0.6cm,linecolor=LightGoldenrod,strokeopacity=0.6]% (0,\ftf4{ye}){\ftf4{re-0.3}}% \pscircle[linewidth=0.5pt,linecolor=DimGray](0,\ftf4{ye}){\ftf4{re}}% \pscircle[linewidth=0.5pt,linecolor=DimGray](0,\ftf4{ye}){\ftf4{re-0.6}}% \pscircle[linewidth=0.5pt,linecolor=DimGray](0,\ftf4{ye}){\ftf4{re-0.3}}% \multido{\i=0+1}{365}{% \psline[linewidth=0.5pt,linecolor=DimGray](\ftf4{extA(\i)})(\ftf4{extB(\i)})% }% \InitialiseN% \multido{\iA=1+1}{12}{% \psline[linewidth=0.75pt,linecolor=DimGray](\ftf4{extA(N)})(\ftf4{extC(N)})% \multido{\iB=5+5}{5}{% \psline[linewidth=0.75pt,linecolor=DimGray](\ftf4{extA(N+\iB)})(\ftf4{extB(N+\iB)})% } \AvanceN{\iA}% }% \EcliptiqueMoisLabels% } %% ========================================================================== %% %% Marque des saisons %% %% ========================================================================== %% \def\saisons{% \begingroup \psset{linecolor=red,arrows=->,linewidth=2pt} \psline(0,\ftf4{rcp(ip)-1})(0,\ftf4{rcp(ip)-0.5})% \uput*[-90](0,\ftf4{rcp(ip)-1}){\textcolor{red}{été}}% \psline(0,\ftf4{-6+1})(0,\ftf4{-6+0.5})% \uput*[90](0,\ftf4{-6+1}){\textcolor{red}{hiver}}% \psline(\ftf4{-rcp(0)+1},0)(\ftf4{-rcp(0)+0.5},0)% \uput*[0](\ftf4{-rcp(0)+1},0){\textcolor{red}{automne}}% \psline(\ftf4{rcp(0)-1},0)(\ftf4{rcp(0)-0.5},0)% \uput*[180](\ftf4{rcp(0)-1},0){\textcolor{red}{printemps}}% \endgroup } %% ========================================================================== %% %% L'alidade %% %% ========================================================================== %% \def\alidade{% \pscustom[fillcolor=MediumTurquoise,fillstyle=solid,opacity=0.35]{% \psline(0,1)(0,\ftf4{6+0.4})% \psarc(0,0){0.7}{90}{180}% \psline(-0.7,-1)(-0.7,\ftf4{-6+0.3})% \psarc(\ftf4{0.35sqrt(2)},\ftf4{-6+0.3+0.35sqrt(2)}){1.2935}{202.5}{247.5} \psline(0,\ftf4{-6-0.4})(0,-1)% \psarc(0,0){0.7}{270}{0}% \psline(0.7,0)(0.7,\ftf4{6-0.3})% \psarc(-\ftf4{0.35sqrt(2)},\ftf4{6-0.3-0.35sqrt(2)}){1.2935}{22.5}{67.5} }% \multido{\i=-20+5}{9}{% \psline[linecolor=black,linewidth=0.4pt](0,\ftf4{rcp(\i)})(0.15,\ftf4{rcp(\i)})% \rput[l](0.2,\ftf4{rcp(\i)}){\footnotesize\ftf0{abs(\i)}°}% }% } %% ========================================================================== %% %% Macros pour l'emploi de l'alidade %% %% ========================================================================== %% \xintdeffloatvar lon := 0;% \def\HM#1#2{% \xintdefvar hd := #1+#2;% \xintdefvar h := floor(hd/15);% \xintdefvar m := floor((hd-15h)*4+0.5);% \xintdefvar h,m := (m==60)?{h+1,0}{h,m};% } \def\HeureLegale#1{% \HM{\ftf4{-lon}}{#1}% \xinteval{h}h \LZ2{\xinteval{m}}m% } \def\CalculAngles{% \xintdefvar J := (mois>1)?{add(Jours[i],i=0..mois-2)}{0}+jour;% \xintdeffloatvar tA := extA(J);% \xintdeffloatvar rA,CA_alpha := sqrt(cs(tA)),atan2d(tA[1],tA[0]);% \Arc{0}% \xintdeffloatvar RA,yA := R,C;% \xintdeffloatvar CA_beta := acosd((yA^2+rA^2-RA^2)/(2yA*rA));% \xintdeffloatvar CA_gamma := CA_beta+90-CA_alpha;% \HM{\ftf4{180-CA_beta}}{0} \xdef\HeureLever{\xinteval{h}h \LZ2{\xinteval{m}}m} \HM{\ftf4{180+CA_beta}}{0} \xdef\HeureCoucher{\xinteval{h}h \LZ2{\xinteval{m}}m} } \def\MarqueLeverCoucher{% \psdot[linecolor=DimGray,dotsize=6pt](6;\ftf4{CA_beta+90})% \psdot[linecolor=DimGray,dotsize=6pt](6;\ftf4{CA_beta-90})% \psdot[linecolor=Yellow,dotsize=4pt](6;\ftf4{CA_beta+90})% \psdot[linecolor=Yellow,dotsize=4pt](6;\ftf4{CA_beta-90})% }% \def\MarqueCible{% \psdot[linecolor=DimGray,dotsize=6pt](\ftf4{rA};\ftf4{90+CA_beta})% \psdot[linecolor=Crimson,dotsize=4pt](\ftf4{rA};\ftf4{90+CA_beta})% }% %% ============================= FIN ======================================== %% \AtBeginDocument{\LoadGraduations} \endinput