%% $Id: pst-spirograph.tex 75 2014-08-19 18:38:05Z herbert $
%%
%% This is file `pst-spirograph.tex',
%%
%% IMPORTANT NOTICE:
%%
%% Package `pst-spirograph.tex'
%%
%% COPYRIGHT 2015 by 
%%     Manuel Luque 
%%     Herbert Voss <hvoss@tug.org>
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN archives
%% in directory CTAN:/macros/latex/base/lppl.txt.
%%
%% DESCRIPTION:
%%   `pst-spirograph' is a PSTricks package to show sprograph curves
%%
%%
\csname PSTSPIROGRAPHLoaded\endcsname
\let\PSTSPIROGRAPHLoaded\endinput
% Requires some packages
\ifx\PSTricksLoaded\endinput\else \input pstricks \fi
\ifx\PSTXKeyLoaded\endinput\else  \input pst-xkey \fi
\def\fileversion{0.40}
\def\filedate{2014/08/18}
\message{`PSTSPIROGRAPH' v\fileversion, \filedate}

\edef\PstAtCode{\the\catcode`\@} 
\catcode`\@=11\relax 
\pst@addfams{pst-spirograph}
\pstheader{pst-spirograph.pro}
\define@key[psset]{pst-spirograph}{Z1}[20]{\def\psk@ZA{#1 }}
\psset[pst-spirograph]{Z1=20}
\define@key[psset]{pst-spirograph}{Z2}[10]{\def\psk@ZB{#1 }}
\psset[pst-spirograph]{Z2=10}
\define@key[psset]{pst-spirograph}{m}[0.5]{\def\psk@m{#1 }}
\psset[pst-spirograph]{m=0.5}
\define@key[psset]{pst-spirograph}{ap}[20]{\def\psk@ap{#1 }}
\psset[pst-spirograph]{ap=20}
\define@key[psset]{pst-spirograph}{polarangle}[0]{\def\psk@polarangle{#1 }}
\psset[pst-spirograph]{polarangle=0}
\define@key[psset]{pst-spirograph}{holenumber}[1]{\def\psk@holenumber{#1 }}
\psset[pst-spirograph]{holenumber=1}
\define@key[psset]{pst-spirograph}{thetamax}[360]{\def\psk@thetamax{#1 }}
\psset[pst-spirograph]{thetamax=360}
%
\define@key[psset]{pst-spirograph}{color1}[{[rgb]{0.625 0.75 1}}]{\pst@getcolor{#1}\pscolora}
\psset[pst-spirograph]{color1={[rgb]{0.625 0.75 1}}}
\define@key[psset]{pst-spirograph}{color2}[{[rgb]{0.75 1 0.75}}]{\pst@getcolor{#1}\pscolorb}
\psset[pst-spirograph]{color2={[rgb]{0.75 1 0.75}}}
\define@key[psset]{pst-spirograph}{circlescolor}[red]{\pst@getcolor{#1}\pscolorc}
\psset[pst-spirograph]{circlescolor=red}
\define@key[psset]{pst-spirograph}{curvecolor}[red]{\pst@getcolor{#1}\pscolord}
\psset[pst-spirograph]{curvecolor=red}
%
\newdimen\pscurvewidth
\define@key[psset]{pst-spirograph}{curvewidth}[1pt]{\pssetlength\pscurvewidth{#1}}
\psset[pst-spirograph]{curvewidth=1pt}
%% === Option pour dessiner le type d'engrenage ---------------------
\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{inner}[true]{}
\psset[pst-spirograph]{inner}
%% === pour dessiner cercle de base et cercle primitif
\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{circles}[true]{}
\psset[pst-spirograph]{circles=false}
%
\def\psSpirograph{\def\pst@par{}\pst@object{psSpirograph}}
\def\psSpirograph@i{\@ifnextchar({\psSpirograph@ii}{\psSpirograph@ii(0,0)}}
\def\psSpirograph@ii(#1){%
\begin@SpecialObj
\pst@@getcoor{#1}%
\addto@pscode{
tx@spirographDict begin
\pst@coor /t@@y ED /t@@x ED
1 setlinejoin
/cm {\pst@number\psunit mul } bind def
/Z1 \psk@ZA def
/m1 \psk@m def
/Z2 \psk@ZB def
/m2 \psk@m def
/ap \psk@ap def
/polarAngle  \psk@polarangle def
/ni \psk@holenumber def % numero du trou
ni 8 ge {/ni 8 def} if
/thetamax \psk@thetamax def
/ifinner \ifPst@spirograph@inner true \else false \fi def
/ki 1 ni 9 div sub def
/r2 m1 Z2 mul 2 div def
/qi Z1 Z2 div 1 sub def
/qi2 Z1 Z2 div 1 add def
thetamax 0 le {/pas -1 def}{/pas 1 def} ifelse
/tabSpirograph [ % tableau des points de l'hypocycloide
0 pas thetamax {/i_ exch def [i_ coorPen]} for
               ] def
/tabSpirograph2 [ % tableau des points de l'epicycloide
0 pas thetamax {/i_ exch def [i_ coorPen2]} for
               ] def
/nPts tabSpirograph length 1 sub def
/nPts2 tabSpirograph2 length 1 sub def
/color1 {\pst@usecolor\pscolora } def
/color2 {\pst@usecolor\pscolorb } def
/circlescolor {\pst@usecolor\pscolorc } def
/curvecolor {\pst@usecolor\pscolord } def
/linecolor  {\pst@usecolor\pslinecolor} def
/fillopacity \psk@opacityalpha def
%
/Circles {
gsave
[ \psk@dash\space ] 0 setdash
newpath
0 0 R@ cm 0 360 arc
closepath
circlescolor
stroke
% on ne dessine pas le cercle de base
%newpath
%0 0 Rb cm 0 360 arc
%closepath
%stroke
grestore
} def
/trous {
1 dict begin
    /a@ {R@ cm 3 div 3.14159 div} bind def
    gsave
    positionAngular rotate
    0 60 540 {/THETA exch def
             untrou
             1 setgray
/fill \tx@setTransparency /fill load def
 fill
             untrou
             linecolor
             stroke
              } for
    grestore
 end
}def
%%% Les dessins de l'engrenage %%%%%%
%%%%%%%%%% Roue N°1 %%%%%%%%%%%%%%%%%
/Roue1{
1 dict begin
/wheel 1 def
gsave
t@@x t@@y translate
m1 Z1
ifinner {
    Datas2
    Calculs
    Beta_ rotate
    Roue
    COURONNE
    closepath
  \ifx\psk@fillstyle\relax\else color1 /fill \tx@setTransparency /fill load def fill \fi
Roue
closepath
linecolor
stroke
COURONNE
closepath
linecolor
stroke
\ifPst@spirograph@circles Circles \fi
}{
    Datas1
    Calculs
    Beta_ rotate
    Roue
    closepath
  \ifx\psk@fillstyle\relax\else color1 /fill \tx@setTransparency /fill load def  fill \fi
Roue
closepath
linecolor
stroke
\ifPst@spirograph@circles Circles \fi
} ifelse
grestore
% dessin de l'hypocycloide ou de l'epicycloide
gsave
t@@x t@@y translate
\ifPst@spirograph@inner
tabSpirograph 0 get aload pop moveto
1 1 nPts {/nP exch def
    tabSpirograph nP get aload pop lineto
    } for
\else
tabSpirograph2 0 get aload pop moveto
1 1 nPts2 {/nP exch def
    tabSpirograph2 nP get aload pop lineto
    } for
\fi
curvecolor
\pst@number\pscurvewidth SLW
stroke
grestore
end
} def
Roue1
%%%%%%%%%% Roue N°2 %%%%%%%%%%%%%%%%%
/Roue2 {
5 dict begin
/wheel 2 def
gsave
m2 Z2 Datas1
Calculs
/a@ex m2 Z1 Z2 add mul 2 div cm def % entraxe engrenage exterieur
/a@in m2 Z1 Z2 sub mul 2 div cm def % entraxe engrenage interieur
/a@ {R@ cm 3 div 3.14159 div} bind def
\ifPst@spirograph@inner
    a@in polarAngle cos mul t@@x add a@in polarAngle sin mul t@@y add translate
    Beta_ polarAngle Z1 Z2 sub Z2 div mul sub rotate
    /positionAngular 2Beta 2 div def
\else
    a@ex polarAngle cos mul t@@x add a@ex polarAngle sin mul t@@y add translate
    DeltaSdeg DeltaP add neg 180 Z2 div add 180 add polarAngle Z1 Z2 add Z2 div mul add rotate
    /positionAngular Beta_ neg def
\fi
Roue
closepath
\ifx\psk@fillstyle\relax\else
    color2
/fill \tx@setTransparency /fill load def
 fill
\fi
Roue
closepath
linecolor
stroke
trous
\ifPst@spirograph@circles Circles \fi
grestore
gsave
newpath
\ifPst@spirograph@inner
    a@in polarAngle cos mul t@@x add a@in polarAngle sin mul t@@y add translate
    Beta_ polarAngle Z1 Z2 sub Z2 div mul sub rotate
    /THETA 540 ni 60 mul sub def
    positionAngular rotate
    a@ THETA DegtoRad mul THETA cos mul neg
    a@ THETA DegtoRad mul THETA sin mul
    0.06 cm 0 360 arc
 \else
     a@ex polarAngle cos mul t@@x add a@ex polarAngle sin mul t@@y add translate
    DeltaSdeg DeltaP add neg 180 Z2 div add 180 add polarAngle Z1 Z2 add Z2 div mul add rotate
    /a@ {R@ cm 3 div 3.14159 div} bind def
    /THETA 540 ni 60 mul sub def
    positionAngular rotate
    a@ THETA DegtoRad mul THETA cos mul neg
    a@ THETA DegtoRad mul THETA sin mul
    0.06 cm 0 360 arc
\fi
closepath
curvecolor
fill
grestore
 end
 } def
Roue2
end
}%
\end@SpecialObj}% % fin de la commande PSTricks
%
\catcode`\@=\PstAtCode\relax
%
\endinput 