%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                                                                           %%
%% This is file `pst-sphericaltrochoid.tex',                                 %%
%%                                                                           %%
%% IMPORTANT NOTICE:                                                         %%
%%                                                                           %%
%% Package `pst-sphericaltrochoid'                                           %%
%%                                                                           %%
%% Manuel Luque; Herbert Voß                                                 %%
%%                                                                           %%
%% This program can be redistributed and/or modified under the terms         %%
%% of the LaTeX Project Public License Distributed from CTAN archives        %%
%% in directory macros/latex/base/lppl.txt.                                  %%
%%                                                                           %%
%% DESCRIPTION:                                                              %%
%%  `pst-sphericaltrochoid' is a PSTricks tools                              %%
%%  Package to draw the spherical trochoid                                   %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\csname PSTSphericaltrochoid\endcsname
\let\PSTSphericaltrochoid\endinput

% Require PSTricks
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
\ifx\PSTSOLIDESIIIDLoaded\endinput\else\input pst-solides3d.tex\fi
\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey\fi

\def\fileversion{0.01}
\def\filedate{2025/12/25}
\message{`PST-shpericaltrochoid' v\fileversion, \filedate\space (ml,hv)}

\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax

\pst@addfams{pst-sphericaltrochoid}

\define@key[psset]{pst-sphericaltrochoid}{rB}{\edef\pst@sphericaltrochoid@rB{#1 }}
\psset[pst-sphericaltrochoid]{rB=1}% radius of the base circle

\define@key[psset]{pst-sphericaltrochoid}{rR}{\edef\pst@sphericaltrochoid@rR{#1 }}
\psset[pst-sphericaltrochoid]{rR=1}% radius of the rolling disk

\define@key[psset]{pst-sphericaltrochoid}{rG}{\edef\pst@sphericaltrochoid@rG{#1 }}
\psset[pst-sphericaltrochoid]{rG=1}% distance from the generating point to the center of the rolling disk

\define@key[psset]{pst-sphericaltrochoid}{w}{\edef\pst@sphericaltrochoid@w{#1 }}
\psset[pst-sphericaltrochoid]{w=90}% angle between the x-y plane and the plane of the rolling disk

\define@key[psset]{pst-sphericaltrochoid}{t}{\edef\pst@sphericaltrochoid@t{#1 }}
\psset[pst-sphericaltrochoid]{t=30}% angular displacement of the rolling disk along the edge of the base circle

\define@key[psset]{pst-sphericaltrochoid}{tmax}{\edef\pst@sphericaltrochoid@tmax{#1 }}
\psset[pst-sphericaltrochoid]{tmax=360}% maximum angular displacement of the rolling disk along the edge of the base circle

\define@boolkey[psset]{pst-sphericaltrochoid}[Pst@sphericaltrochoid@]{Sphere}[true]{}
\psset[pst-sphericaltrochoid]{Sphere=true}

\pstheader{pst-nutation.pro}%  Use the one from nutation!

\addtosolideslistobject{parallel,meridian}

\def\psSphericalTrochoid{\def\pst@par{}\pst@object{psSphericalTrochoid}}
\def\psSphericalTrochoid@i{%
  \addbefore@par{solidmemory,lightsrc=viewpoint,resolution=360,
                 Decran=1000,viewpoint=500 0 30 rtp2xyz,linecolor=red}%
  \begin@SpecialObj
  \pnode( ! % le point de vue
         \pst@solides@viewpoint /ZpointVue ED /YpointVue ED /XpointVue ED
         /THETA {YpointVue XpointVue atan} bind def
         /PHI   {ZpointVue XpointVue dup mul YpointVue dup mul add sqrt atan} bind def
         /nXviewpoint THETA cos PHI cos mul def
         /nYviewpoint THETA sin PHI cos mul def
         /nZviewpoint PHI sin def
         /rB \pst@sphericaltrochoid@rB def
         /rR \pst@sphericaltrochoid@rR def
         /rG \pst@sphericaltrochoid@rG def
         /inclination \pst@sphericaltrochoid@w def
         inclination 180 ge {/inclination 179.9 def} if
         inclination 0 le {/inclination 0.1 def} if
         /hC rR rB inclination  cos mul sub inclination sin div def
         /Rsphere rB dup mul hC dup mul add rR dup mul sub rG dup mul add sqrt def
         /angleRotation {rB t mul rR div} def
% the coordinates of the point of the spherical strophoid
         /xG { t cos rB inclination cos rR rG angleRotation sin mul sub 
               mul sub mul rG t sin mul angleRotation cos mul sub } def
         /yG { t sin rB inclination cos rR rG angleRotation sin mul sub 
               mul sub mul rG t cos mul angleRotation cos mul add } def
         /zG {inclination sin rR rG angleRotation sin mul sub mul} def
% the coordinates of the center of the rolling circle
         /xCR {t cos rB rR inclination cos mul sub mul} def
         /yCR {t sin rB rR inclination cos mul sub mul} def
         /zCR rR inclination sin mul def
% normale au plan du cercle roulant
        /nRx {t cos inclination sin mul neg} def
        /nRy {t sin inclination sin mul neg} def
        /nRz {inclination cos neg} def
% coordonn�es du point de contact
        /xCo {rB t cos mul} def
        /yCo {rB t sin mul} def
        /zCo 0 def
        0 0){factice}
  \psSolid[object=plan,definition=equation,args={[0 0 1 0] 90},name=monplan,action=none]%
  \psProjection[object=cercle,plan=monplan,args=0 0 rB,resolution=360,
                linecolor={[rgb]{0 0 0.5}},range=0 360,linewidth=0.1,
                fillstyle=solid,fillcolor=gray!40!cyan!40,opacity=0.5,
                visibility]
  \composeSolid
  \defFunction{SphericalTrochoid}(t){xG}{yG}{zG}%
  \psSolid[object=courbe,r=0,range=0 \pst@sphericaltrochoid@tmax,
           function=SphericalTrochoid,fillcolor=\pslinecolor,linewidth=0.07,linecolor=red]%
  \ifPst@sphericaltrochoid@Sphere
    \multido{\i=-90+30}{6}{%
      \psSolid[object=parallel,r=Rsphere,phi=\i,linecolor={[rgb]{0 0 0.5}}](0,0,hC)}%
    \multido{\i=0+30}{12}{%
      \psSolid[object=meridian,r=Rsphere,theta=\i,linecolor={[rgb]{0 0 0.5}}](0,0,hC)}%
    \psSolid[object=plan,definition=normalpoint,
             args={0 0 hC [nXviewpoint nYviewpoint nZviewpoint]},name=leplan,action=none]%
    \psProjection[object=cercle,plan=leplan,linecolor={[rgb]{0 0 0.5}},
                  args=0 0 Rsphere,range=0 360]%
  \fi
  \pstVerb{/t \pst@sphericaltrochoid@t def}%
  \psPoint(xCR,yCR,zCR){O}\psdot[linecolor=blue](O)
  \psPoint(xG,yG,zG){G}%
  \psline[linecolor=blue,linewidth=0.05](O)(G)%
  \psdot[linecolor=\pslinecolor,dotsize=0.2](G)
  \psSolid[object=plan,definition=normalpoint,args={xCR yCR zCR [nRx nRy nRz]},name=planC,action=none]%
  \psProjection[object=cercle,plan=planC,visibility,linecolor=blue,linewidth=0.1,
                args=0 0 rR,opacity=0.5,fillcolor=cyan!50,range=0 360,
                fillstyle=solid]
  \composeSolid
  \end@SpecialObj
  \ignorespaces
}%

\catcode`\@=\PstAtCode\relax
\endinput
 