diff options
author | Karl Berry <karl@freefriends.org> | 2020-03-14 20:42:00 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-03-14 20:42:00 +0000 |
commit | b2608121e57d86dd2f5f8ba12b2a9fc3d4fcbb7a (patch) | |
tree | f719a1349371274fa4f608f393cb2844ecd8fdf0 /Master/texmf-dist/tex/generic/pst-spirograph | |
parent | 792d78e8b4555f20ed39adee7f374c4131c1c7aa (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/pst-spirograph')
-rw-r--r-- | Master/texmf-dist/tex/generic/pst-spirograph/pst-spirograph.tex | 256 |
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 |