blob: 57b941240e653217fa83af1c51353340e7201fa6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
|
%% $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
|