%%
%%  Ein Beispiel der DANTE-Edition
%%
%%  7. Auflage
%%
%%  Beispiel 05-05-2 auf Seite 81.
%%
%%  Copyright (C) 2016 Herbert Voss
%%
%%  It may be distributed and/or modified under the conditions
%%  of the LaTeX Project Public License, either version 1.3
%%  of this license or (at your option) any later version.
%%
%%  See http://www.latex-project.org/lppl.txt for details.
%%
%%
%% ====
% Show page(s) 1
%%
%%
\documentclass[]{exaarticle}
\pagestyle{empty}
\setlength\textwidth{352.81416pt}
\setlength\parindent{0pt}
%StartShownPreambleCommands
\usepackage{pst-plot,pst-xkey,multido}
\makeatletter
\pst@addfams{demo}% add family demo to the list
\define@boolkey[psset]{demo}[Pst@]{showcircles}[true]{}% prefix is \Pst@
\define@boolkey[psset]{demo}[Pst@]{hypocycloid}[true]{}%  "    "   "
\define@key[psset]{demo}{nAngle}{\pst@getint{#1}\psk@nAngle}
\define@key[psset]{demo}{dAngle}{\pst@getangle{#1}\psk@dAngle}
%
\psset[demo]{showcircles=false,nAngle=6,dAngle=60,hypocycloid=false}
\newpsstyle{cycloid}{linecolor=black,linewidth=0.2\pslinewidth}
%
\def\psCycloid{\pst@object{psCycloid}}
% A pstricks object reads a star and the optional arguments
% and then cintinues with <name>@i
% we use (#1), but will test, if we have another (#2,#3),
% otherwise we use the default (0,720)
\def\psCycloid@i(#1){%
 \@ifnextchar({\psCycloid@ii(#1)}{\psCycloid@ii(#1)(0,360)}}
% (#1)   : origin
% (#2,#3): start and end angle for the parametrix plot
% #4     : radius R of the big circle
% #5     : radius r of the small circle
% #6     : radius A of the rotatetd point
\def\psCycloid@ii(#1)(#2,#3)#4#5#6{%
 \pst@killglue % no whitespace
 \begingroup% % hold all local
 \addbefore@par{plotpoints=500}% can be overwritten by a following user set
 \use@par% % set the optional arguments
 \pst@getlength{#4}\pst@tempB% get the radius in pt (screen coors)
 \pst@getlength{#5}\pst@tempC% get the 2nd radius in pt
 \pst@getlength{#6}\pst@tempD% get the distance for a in pt
 \pstVerb{ % define it only once (in user coors!!!)
/R \pst@tempB \pst@number\psunit div def
   /r \pst@tempC \pst@number\psunit div def
   /A \pst@tempD \pst@number\psunit div def
   /Rr R r \ifPst@hypocycloid sub \else add \fi def  % R +- r
   /RDivr R r div def  % R/r
   /RrDivr RDivr 1 \ifPst@hypocycloid sub \else add \fi def % (R+-r)/r
 }%
 \if@star\psset{fillstyle=eofill,fillcolor=\pslinecolor}\fi%
 \parametricplot{#2}{#3}{%
     Rr t cos mul t RrDivr mul cos A mul sub  % x(t)
     Rr t sin mul t RrDivr mul sin A mul
     \ifPst@hypocycloid add \else sub \fi }% y(t)
 \ifPst@showcircles%
   \psset{style=cycloid}%
   \pscircle(#1){#4}%
   \multido{\rA=0.0+\psk@dAngle}{\psk@nAngle}{%
    \rput(!#4 #5 \ifPst@hypocycloid sub \else add \fi dup
      \rA\space cos mul exch \rA\space sin mul){% user coors!!
       \pscircle{#5}\psline[linecolor=blue]{*-o}(!%
         \rA\space RrDivr mul dup % the angle
         cos A mul neg
         exch sin A mul \ifPst@hypocycloid\else neg \fi)%
   }}%
   \psarc[arrowscale=2]{->}(#1){0.5cm}{0}{270}
 \fi%
 \endgroup% end of local macro
 \ignorespacesafterend% no whitespace at the end
}
\makeatother

\def\oneShot#1{%
\begin{pspicture}(-3,-3)(3,3)
 \psCycloid[linecolor=red,linewidth=1.5pt,showcircles,
    dAngle=10,nAngle=1][#1](0,0){2}{0.5}{0.6}
\end{pspicture}}

%StopShownPreambleCommands
\begin{document}
\begin{pspicture}(-3,-3)(3,3)
 \psCycloid[hypocycloid,linecolor=red,linewidth=1.5pt](0,0){2}{0.25}{0.6}
\end{pspicture}
%
\begin{pspicture}(-4,-3)(4,3)
 \psCycloid[hypocycloid,linecolor=red,linewidth=1.5pt,showcircles,
    dAngle=20,nAngle=18](0,0){2}{0.25}{0.6}
\end{pspicture}
\end{document}