summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-03-14 20:42:00 +0000
committerKarl Berry <karl@freefriends.org>2020-03-14 20:42:00 +0000
commitb2608121e57d86dd2f5f8ba12b2a9fc3d4fcbb7a (patch)
treef719a1349371274fa4f608f393cb2844ecd8fdf0 /Master/texmf-dist/tex/generic
parent792d78e8b4555f20ed39adee7f374c4131c1c7aa (diff)
pst-spirograph (14mar20)
git-svn-id: svn://tug.org/texlive/trunk@54295 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic')
-rw-r--r--Master/texmf-dist/tex/generic/pst-spirograph/pst-spirograph.tex256
1 files changed, 249 insertions, 7 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-spirograph/pst-spirograph.tex b/Master/texmf-dist/tex/generic/pst-spirograph/pst-spirograph.tex
index 02cfbcd4cfc..cb946557bfe 100644
--- a/Master/texmf-dist/tex/generic/pst-spirograph/pst-spirograph.tex
+++ b/Master/texmf-dist/tex/generic/pst-spirograph/pst-spirograph.tex
@@ -21,10 +21,14 @@
\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.50}
-\def\filedate{2020/03/11}
+\ifx\PSTricksLoaded\endinput \else \input pstricks \fi
+\ifx\PSTXKeyLoaded\endinput \else \input pst-xkey \fi
+\ifx\PSTthreeDLoaded\endinput\else \input pst-3d \fi
+\ifx\PSTnodesLoaded\endinput \else \input pst-node \fi
+\ifx\PSTplotLoaded\endinput \else \input pst-plot \fi
+
+\def\fileversion{0.51}
+\def\filedate{2020/03/14}
\message{`PSTSPIROGRAPH' v\fileversion, \filedate\ (ml,hv)}
\edef\PstAtCode{\the\catcode`\@}
@@ -45,6 +49,18 @@
\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}{Rarct}{\def\psk@Rarct{#1 }}
+\psset[pst-spirograph]{Rarct=0.1}
+\define@key[psset]{pst-spirograph}{wheelrotation}{\def\psk@wheelrotation{#1 }}
+\psset[pst-spirograph]{wheelrotation=0}
+
+\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{int}[true]{}
+\psset[pst-spirograph]{int=false}
+
+\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{notdrawWheel}[true]{}
+\psset[pst-spirograph]{notdrawWheel=false}
+
%
\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}}}
@@ -65,7 +81,6 @@
\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{circles}[true]{}
\psset[pst-spirograph]{circles=false}
-
%% hole position
\define@key[psset]{pst-spirograph}{HolePos}{\def\psk@HolePos{#1 }}
\psset[pst-spirograph]{HolePos=1.5} % 1<HolePos<2
@@ -76,11 +91,20 @@
\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{TypeA}[true]{}
\psset[pst-spirograph]{TypeA}
+\define@boolkey[psset]{pst-spirograph}[Pst@spirograph@]{RubberBand}[true]{}
+\psset[pst-spirograph]{RubberBand=false}
+
+\define@key[psset]{pst-spirograph}{theta1}{\def\psk@thetaA{#1}}
+\define@key[psset]{pst-spirograph}{theta2}{\def\psk@thetaB{#1}}
+\psset[pst-spirograph]{theta1=-90,theta2=90}
\def\psSpirograph{\def\pst@par{}\pst@object{psSpirograph}}
\def\psSpirograph@i{\@ifnextchar({\psSpirograph@ii}{\psSpirograph@ii(0,0)}}
\def\psSpirograph@ii(#1){%
- \begin@ClosedObj
+ \begin@SpecialObj
+ \ifPst@spirograph@RubberBand \psSpirograph@iv(#1)\else\psSpirograph@iii(#1)\fi
+}
+\def\psSpirograph@iii(#1){%
\pst@@getcoor{#1}%
\addto@pscode{
tx@spirographDict begin
@@ -209,15 +233,233 @@
linecolor
stroke
plaquette
+ drawHole
\ifPst@spirograph@circles Circles \fi
grestore
+ \else
+ 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@in polarAngle cos mul a@in polarAngle sin mul translate
+ polarAngle Z1 Z2 sub Z1 div mul rotate
+ m1 Z1
+ Datas2
+ Calculs
+ Beta_ rotate
+ Beta_ neg rotate
+ drawHole
+ grestore
\fi
\fi
end
}%
- \end@ClosedObj
+ \end@SpecialObj
\ignorespaces}
%
+\def\psSpirograph@iv(#1){%
+ \def\RA{\psCalc{\psk@ZA*\psk@m/2}}%
+ \def\RB{\psCalc{\psk@ZB*\psk@m/2}}% les rayons
+ \def\OB{\psCalc{\RA+\RB}}%
+ \def\RAp{\psCalc{(\RA*2-2.5*0.2)/2}}% cercles de pied
+ \def\RBp{\psCalc{(\RB*2-2.5*0.2)/2}}%
+ % la vitesse de rotation
+ \def\OMEGAA{-1}%
+ \def\OMEGAB{\psCalc{(-\OMEGAA)*\psk@ZA/\psk@ZB}}%
+ \def\ANGLE{\psCalc{\psk@wheelrotation}}% degrees
+ \def\ANGLErad{\psCalc{\ANGLE*3.14/180}}% radians
+ \def\nombrePoints{\psCalc{trunc(2*\ANGLE+5,0)}}%
+ % positionnement angulaire des 2 points de fixation de l'élastique
+ \def\thetaA{\psCalc{(\psk@thetaA)*3.14/180}}%
+ \def\thetaB{\psCalc{(\psk@thetaB)*3.14/180}}%
+ % les coordonnées des 2 points
+ \def\xA{\psCalc{0.9*\RAp*cos(\thetaA+\OMEGAA*\ANGLErad)}}%
+ \def\yA{\psCalc{sin(\thetaA+\OMEGAA*\ANGLErad)*\RAp*0.9}}%
+ \def\xB{\psCalc{cos(\thetaB+\OMEGAB*\ANGLErad)*\RBp*0.9}}%
+ \def\yB{\psCalc{sin(\thetaB+\OMEGAB*\ANGLErad)*\RBp*0.9+\OB}}%
+ % le milieu
+ \def\xM{\psCalc{(\xA+\xB)/2}}\def\yM{\psCalc{(\yA+\yB)/2}}%
+ \ThreeDput[normal=0 0 1](0,0,0){%
+ \psgrid[subgriddiv=0,gridlabels=0pt]%\psframe(-5,-5)(5,7)
+ \rput(0.05,-0.05){\psSpirographB[circles=false,polarangle=90,fillstyle=solid,color1=black,color2=black]}%
+ \psSpirographB[circles=false,polarangle=90,fillstyle=solid]%
+ \parametricplot[linecolor=red,plotpoints=\nombrePoints,algebraic,linewidth=0.1]{0}{\ANGLErad}{
+ (\RAp*0.9*cos(\thetaA+\OMEGAA*t)+\RBp*0.9*cos(\thetaB+\OMEGAB*t))/2|
+ (\RAp*0.9*sin(\thetaA+\OMEGAA*t)+\RBp*0.9*sin(\thetaB+\OMEGAB*t)+\OB)/2}%
+ \psline{->}(0,0)(0,1)\psline{->}(0,0)(1,0)%
+ % les cercles de contact
+ \pscircle[linestyle=dotted](0,0){\RA}\pscircle[linestyle=dotted](0,\OB){\RB}%
+ % les cercles de pied
+ %\pscircle[linestyle=dotted](0,0){\RAp}
+ %\pscircle[linestyle=dotted](0,\OB){\RBp}
+ }%
+ % les tiges de fixation des extrémités de l'élastique
+ \ThreeDput[normal=0 1 0](\xA,\yA,0){\psline[linewidth=0.1]{-*}(0,0)(0,1)\pnode(0,1){P1}}%
+ \ThreeDput[normal=0 1 0](\xB,\yB,0){\psline[linewidth=0.1]{-*}(0,0)(0,1)\pnode(0,1){P2}}%
+ % le milieu
+ \ThreeDput[normal=0 1 0](\xM,\yM,0){\pnodes(0,1){P3}(0,0){P4}}%
+ \psline[linecolor=blue](P1)(P2)%
+ \psline[linecolor=red]{->}(P3)(P4)%
+ \psdot[linecolor=blue](P3)%
+ \end@SpecialObj
+ \ignorespaces}
+%
+\def\psSpirographB{\def\pst@par{}\pst@object{psSpirographB}}
+\def\psSpirographB@i{\@ifnextchar({\psSpirographB@ii}{\psSpirographB@ii(0,0)}}
+\def\psSpirographB@ii(#1){%
+ \begin@SpecialObj
+ \pst@@getcoor{#1}%
+ \addto@pscode{%
+ \pst@coor /t@@y ED /t@@x ED
+ /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
+ /facteurRayonRaccord {\psk@Rarct mul} def
+ /polarAngle \psk@polarangle def
+ /color1 {\pst@usecolor\pscolora } def
+ /color2 {\pst@usecolor\pscolorb } def
+ /colorcircles {\pst@usecolor\pscolorc } def
+ /curvecolor {\pst@usecolor\pscolord} def
+ /linecolor {\pst@usecolor\pslinecolor} def
+ /ni \psk@holenumber def ni 8 gt { /ni 8 def } if
+ /thetamax \psk@thetamax def
+ Z1 2 mod 1 eq { /Z1 Z1 1 sub def } if
+ Z2 2 mod 1 eq { /Z2 Z2 1 sub def } if
+ /HolePos \psk@HolePos def
+ HolePos 0 lt HolePos 2 ge or { /HolePos 1.5 def } if
+ /Fill { \psk@opacityalpha .setopacityalpha fill } def
+ /R1 Z1 m1 mul 2 div def
+ /R2 Z2 m1 mul 2 div 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
+ %
+ tx@spirographDict begin
+ %%%% definition de la roue dentee %%%%%%
+ /Roue3d {
+ % arc de développante
+ /tabArcDev [ 0 1 ThetaTdeg { /i@ exch def [i@ devCercle] } for ] def
+ /n@ tabArcDev length def
+ /tabDent [
+ % l'arc de developpante initial
+ tabArcDev aload pop
+ % l'arc ce cercle de tete
+ DeltaT 0.1 2Beta DeltaT sub {/i@ exch def [Rt cm i@ cos mul Rt cm i@ sin mul] } for
+ % le symetrique de l'arc de developpante par rapport a l'axe de la dent
+ n@ 1 sub -1 0 { /compteur exch def [tabArcDev compteur get aload pop symAxe] } for
+ ] def
+ % tracé de la dent
+ /n2@ tabDent length def
+ newpath
+ ptC moveto
+ 0 1 Z@ 1 sub
+ { /i@ exch AngleDent mul def
+ \ifPst@spirograph@int
+ wheel 2 eq { ptA RotDent ptB RotDent Rarct arct ptB RotDent lineto }
+ { ptA RotDent lineto ptB RotDent lineto } ifelse
+ \else
+ Rp Rb eq { ptA RotDent lineto ptB RotDent lineto }
+ { ptA RotDent ptB RotDent Rarct arct ptB RotDent lineto } ifelse
+ \fi
+ 0 1 n2@ 1 sub { /compteur exch def tabDent compteur get aload pop RotDent lineto } for
+ \ifPst@spirograph@int
+ wheel 2 eq { Rp Rb eq { ptA' RotDent lineto ptC' RotDent lineto }
+ { ptA' RotDent ptC' RotDent Rarct arct ptC' RotDent lineto } ifelse }
+ { ptA' RotDent lineto ptC' RotDent lineto } ifelse
+ \else
+ Rp Rb eq { ptA' RotDent lineto ptC' RotDent lineto }
+ { ptA' RotDent ptC' RotDent Rarct arct ptC' RotDent lineto } ifelse
+ \fi
+ } for
+ } def % Roue3d
+ %
+%%%%%%%%%%%%%%%%%5
+ thetamax 0 le { /pas -1 def }{ /pas 1 def } ifelse
+ /tabSpirograph [ 0 pas thetamax {/i_ exch def [ i_ coorPen3 ] } for ] def
+% gsave
+% tabSpirograph 0 get aload pop moveto
+% 1 1 tabSpirograph length 1 sub {/nP exch def tabSpirograph nP get aload pop lineto } for
+% curvecolor
+% \pst@number\pscurvewidth SLW
+% stroke
+% grestore
+%%%%%%%%%%%%%%%
+ /AngleRotation \psk@wheelrotation def
+ %%% Les dessins de l'engrenage %%%%%%
+ %%%%%%%%%% Roue N°1 %%%%%%%%%%%%%%%%%
+ \ifPst@spirograph@notdrawWheel
+ \else
+ /wheel 1 def
+ gsave
+ t@@x t@@y translate
+ m1 Z1
+ \ifPst@spirograph@int
+ Datas2 Calculs Beta_ AngleRotation sub rotate Roue3d COURONNE closepath
+ \ifx\psk@fillstyle\relax\else color1 fill \fi
+ Roue3d closepath linecolor stroke
+ COURONNE closepath linecolor stroke
+ \ifPst@spirograph@circles Circles \fi
+ \else
+ Datas1 Calculs Beta_ AngleRotation sub rotate Roue3d AXE closepath
+ \ifx\psk@fillstyle\relax\else color1 fill \fi
+ Roue3d closepath linecolor stroke
+ AXE closepath
+ \ifx\psk@fillstyle\relax\else 0.8 setgray fill \fi
+ AXE closepath linecolor stroke
+ CLAVETTE
+ \ifx\psk@fillstyle\relax\else 0 0.125 0.25 0.25 setcmykcolor fill \fi
+ CLAVETTE linecolor stroke
+ \ifPst@spirograph@circles Circles \fi
+ \fi
+ grestore
+ \fi
+ %%%%%%%%%% Roue N°2 %%%%%%%%%%%%%%%%%
+ /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
+ \ifPst@spirograph@int
+ a@in polarAngle cos mul t@@x add a@in polarAngle sin mul t@@y add translate
+ Beta_ Z1 Z2 div AngleRotation mul sub polarAngle Z1 Z2 sub Z2 div mul sub rotate
+ \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 Z1 Z2 div AngleRotation mul add polarAngle Z1 Z2 add Z2 div mul add rotate
+ \fi
+ Roue3d
+ AXE
+ closepath
+ \ifx\psk@fillstyle\relax\else color2 fill \fi
+ Roue3d
+ closepath
+ linecolor
+ stroke
+ AXE
+ closepath
+ \ifx\psk@fillstyle\relax\else 0.8 setgray fill \fi
+ AXE
+ closepath
+ linecolor
+ stroke
+ CLAVETTE
+ \ifx\psk@fillstyle\relax\else 0 0.125 0.25 0.25 setcmykcolor fill \fi
+ CLAVETTE
+ linecolor
+ stroke
+ \ifPst@spirograph@circles Circles \fi
+ grestore
+ end
+ }%
+ \end@SpecialObj
+ \ignorespaces
+}% % fin de la commande PSTricks
+%
\catcode`\@=\PstAtCode\relax
%
\endinput \ No newline at end of file