summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pstricks/voss/bsp360.tex
blob: 0f5fc5f8f2cc875d3bb9e52262c7a508c1a1d748 (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
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
\documentclass[12pt,a4paper]{article}
\usepackage{pst-plot,pst-3d,pst-node}%
\pagestyle{empty}
\input{pommereau.tex}
\SpecialCoor
\makeatletter
\def\SectionConiqueE{\pst@object{SectionConiqueE}}
\def\SectionConiqueE@i{\@ifnextchar[{\SectionConiqueE@do}{\SectionConiqueE@do[]}}
\def\SectionConiqueE@do[#1]#2#3{{%
% #2 hauteur
% #3 demi-angle au sommet
\pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}
\pst@killglue
\psset{#1}%
\begin@OpenObj
\addto@pscode{%
% Les couleurs
/Cyan 1 def
/Magenta 1 def
/Yellow 0.2 def
/K 1 def
% les rayons de lumière
/xLight 1 def
/yLight 1 def
/zLight 0 def
/NormeLight {xLight dup mul yLight dup mul zLight dup mul add add
            sqrt} bind def
% Les datas
    /increment 10 def
    /THETA #3 def
    /Hauteur #2 \pst@number\psunit mul def
    /Rcone {Hauteur THETA cos div THETA sin mul} bind def
    /OMEGA \OMEGA\space def
    /tanOMEGA {OMEGA dup sin exch cos div} bind def
    /m1 {90 THETA sub dup sin exch cos div} bind def
    /H \nhauteur\space\pst@number\psunit mul def
% Vecteur ViewPoint
    /vX \vx\space def
    /vY \vy\space def
    /vZ \vz\space def
% la partie restante après coupe
0 increment 360 increment sub {%
    /iTA exch def
% normale à la facette
    /nXfacette THETA cos iTA increment 2 div add cos mul def
    /nYfacette THETA cos iTA increment 2 div add sin mul def
    /nZfacette THETA sin neg def
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
/facetteReste {
newpath
    /zI {OMEGA 90 eq{H}{H 1 iTA sin m1 tanOMEGA mul div add div OMEGA sin div}ifelse} bind def
    zI m1 div iTA cos mul
    zI m1 div iTA sin mul
    zI
    \tx@ProjThreeD
     moveto
iTA 1 iTA increment add {%
    /iTA1 exch def
    /zI {OMEGA 90 eq{H}{H 1 iTA1 sin m1 tanOMEGA mul div add div OMEGA sin div}ifelse} bind def
    zI m1 div iTA1 cos mul
    zI m1 div iTA1 sin mul
    zI
    \tx@ProjThreeD
    lineto
    } for
    0 0 lineto
closepath
} def
PSfacette 0 ge {
facetteReste
/cosV {1 xLight nXfacette mul
       yLight nYfacette mul
       zLight nZfacette mul
       add add
      NormeLight
       nXfacette dup mul
       nYfacette dup mul
       nZfacette dup mul
       add add sqrt mul div sub} bind def
% remplissage des facettes
Cyan cosV mul Magenta cosV mul Yellow cosV mul 0 setcmykcolor
fill
facetteReste
0 setgray
stroke } if
} for
% l'ellipse du plan de coupe
/ellipse {
/TableauxPoints [
0 1 359 {% on décrit le cercle
    /theta exch def [
    /zI {OMEGA 90 eq{H}{H 1 theta  sin m1 tanOMEGA mul div add div OMEGA sin div}ifelse} bind def
    zI m1 div theta  cos mul
    zI m1 div theta  sin mul
    zI
    \tx@ProjThreeD ]
    } for
    ] def
newpath
 TableauxPoints 0 get aload pop moveto
0 1 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
closepath
 } def
%le produit scalaire du vecteur viewpoint et du vecteur normal au plan >0 ?
  /Test  vY OMEGA cos mul %
         vZ OMEGA sin mul
         add def
Test 0 ge {
gsave
 ellipse
1 1 0 setrgbcolor
fill
grestore
ellipse
% 0 setgray
 stroke
} if
%MaillageConePositif
%MaillageConeNegatif
 }% fin du code ps
\showpointsfalse
\end@OpenObj}}
%

\let\ProjThreeD\tx@ProjThreeD
\def\pnodeThreeD(#1,#2,#3)#4{%
      \pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}
  \pnode(!#1 #2 #3 \ProjThreeD){#4}}
%
\def\ConeIIID{\pst@object{ConeIIID}}
\def\ConeIIID@i{\@ifnextchar[{\ConeIIID@do}{\ConeIIID@do[]}}
\def\ConeIIID@do[#1]#2#3{{%
% #2 hauteur
% #3 demi-angle au sommet
\pst@Verb{%
          \psk@embedangle
          \psk@viewpoint
          \psk@viewangle
          \tx@SetMatrixThreeD}
\pst@killglue
\psset{#1}%
\begin@OpenObj
\addto@pscode{%
/MaillageConePositif {
1 setlinejoin
0 increment 360 increment sub {%
    /theta exch def
% normale à la facette
    /nXfacette THETA cos theta increment 2 div add cos mul def
    /nYfacette THETA cos theta increment 2 div add sin mul def
    /nZfacette THETA sin neg def
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
% dessin de la facette si la condition de visibilité est satisfaite
PSfacette 0 ge {
facetteSup
stroke
} if
} for
} def
%
/MaillageConeNegatif {
1 setlinejoin
0 increment 360 increment sub {%
    /theta exch def
% normale à la facette
    /nXfacette THETA cos theta increment 2 div add cos mul def
    /nYfacette THETA cos theta increment 2 div add sin mul def
    /nZfacette THETA sin def
% test de visibilité
    /PSfacette vX nXfacette mul
           vY nYfacette mul add
           vZ nZfacette mul add
    def
% dessin de la facette si la condition de visibilité est satisfaite
PSfacette 0 ge {
facetteInf
stroke
} if
} for
} def
/facetteSup {
newpath
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur \tx@ProjThreeD
     moveto
theta 1 theta increment add {%
    /theta1 exch def
    /Xpoint Rcone theta1 cos mul def
    /Ypoint Rcone theta1 sin mul def
     Xpoint Ypoint Hauteur \tx@ProjThreeD
    lineto
    } for
    0 0 lineto
closepath} def
%
/facetteInf {
newpath
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur neg \tx@ProjThreeD
     moveto
theta 1 theta increment add {%
    /theta1 exch def
    /Xpoint Rcone theta1 cos mul def
    /Ypoint Rcone theta1 sin mul def
     Xpoint Ypoint Hauteur neg \tx@ProjThreeD
    lineto
    } for
    0 0 lineto
closepath} def
% Les datas
    /increment 10 def
    /THETA #3 def
    /Hauteur #2 \pst@number\psunit mul def
    /Rcone {Hauteur THETA cos div THETA sin mul} bind def
    /OMEGA \OMEGA\space def
    /tanOMEGA {OMEGA dup sin exch cos div} bind def
    /m1 {90 THETA sub dup sin exch cos div} bind def
    /H \nhauteur\space\pst@number\psunit mul def
% Vecteur ViewPoint
    /vX \vx\space def
    /vY \vy\space def
    /vZ \vz\space def
% le dessin de la face supérieure
/face_sup {
/TableauxPoints [
0 1 359 {% on décrit le cercle
    /theta exch def [
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur \tx@ProjThreeD ]
    } for
    ] def
newpath
 TableauxPoints 0 get aload pop moveto
0 1 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
%0.7 setgray
closepath
%fill
%stroke
 } def
 %
/face_inf {
/TableauxPoints [
0 1 359 {% on décrit le cercle
    /theta exch def [
    /Xpoint Rcone theta cos mul def
    /Ypoint Rcone theta sin mul def
     Xpoint Ypoint Hauteur neg \tx@ProjThreeD ]
    } for
    ] def
newpath
 TableauxPoints 0 get aload pop moveto
0 1 359 {
    /compteur exch def
    TableauxPoints compteur get aload pop
    lineto } for
%0.7 setgray
closepath
%fill
% stroke
 } def
MaillageConePositif
%MaillageConeNegatif
 vZ 0 ge {face_sup}{face_inf} ifelse
 }% fin du code ps
\showpointsfalse
\end@OpenObj}}

\makeatother
\definecolor{grisbleu}{rgb}{0.85, 0.85, .95}
\begin{document}
%\pstpyth{6pt}{8pt}{\test}
%\expandafter\clear\the\test
\def\nhauteur{4.5}%
\def\OMEGA{55}%
\cossin\cosO\sinO{\OMEGA}%
\realmul\YH=\cosO*\nhauteur%
\realmul\ZH=\sinO*\nhauteur%
\begin{pspicture}(-5,-8)(5,10)
\pstVerb{%
    /OMEGA \OMEGA\space def
    /H \nhauteur\space def
    }%
\def\vx{0.5}\def\vy{0.3}\def\vz{0.2}%
\psset{viewpoint={\vx} {\vy} {\vz}}%
\pnodeThreeD(0,0,0){O}
\pnodeThreeD(0,0,11){Z}
\pnodeThreeD(5,0,0){X}
\pnodeThreeD(0,5,0){Y}
\ThreeDput[normal=0 0 1](0,0,0){\psframe[fillstyle=solid,fillcolor=grisbleu](-5,-5)(5,5)
    \psgrid[gridlabels=0,subgriddiv=0](-5,-5)(5,5)}
\psline{->}(O)(X)
\psline{->}(O)(Z)
\psline{->}(O)(Y)
\uput[180](Z){$z$}
\uput[180](X){$x$}
\uput[0](Y){$y$}
\SectionConiqueE{9}{30}% hauteur, demi-angle au sommet
\ThreeDput[normal=0 {\cosO} {\sinO}](0,\YH,\ZH){%
%        \parametricplot[fillstyle=vlines,hatchcolor=red]{0}{360}{%
%    B t cos mul A t sin mul HO' add OMEGA 0 lt {neg} if}
    \psgrid[gridlabels=0,subgriddiv=0,gridcolor=red](-4,-3)(4,10)%
    \psframe[linewidth=1mm](-4,-3)(4,10)}
\pnodeThreeD(0,0,H 90 OMEGA sub cos div){Z'}
\psdot(Z')
\psline{->}(Z')(Z)
\ConeIIID{10}{30}% hauteur, demi-angle au sommet
\pnodeThreeD(0,H OMEGA cos mul,H OMEGA sin mul){H}
\psdot(H)
\uput[0](H){$H$}
\psline[linecolor=red,linestyle=dashed](O)(H)
\end{pspicture}
\end{document}