%% $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 %% %% 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