Retour

pst-heliolabe.tex

Télécharger le fichier
%% ========================================================================== %%
%% 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