Réinitialisation du projet
[mp-solid.git] / objets.mp
1 %24/01/2011
2 %Gestion des couleurs dans l'objet Deplacement.
3
4 %27/11/2010
5 %Manque plusieurs : dans la définition de ObjetNew
6
7 %07/02/2009
8 color OTFc[][][];%pour mémoriser les différents sommets de chaque objet;
9 color OTFc[][].iso;
10 color coul[][];%pour memoriser la couleur de chacune des faces de l'objet;
11 color Outcolor[],Incolor[];%Permet de gérer la gestion des couleurs d'un objet lors d'un déplacement de cet objet
12 boolean Vue[][];
13
14 boolean creux;  creux=false;%pour gérer les solides creux
15 boolean transformation; transformation=false;%pour gérer les transformations
16 boolean Ferme[];%pour gérer les faces : si le solide est fermé, toutes les faces non vues ne sont pas intégrées aux calculs
17 boolean perso[];%pour gérer les gestions personnelles des couleurs
18 for k=0 upto 100:
19   perso[k]=false;
20 endfor;
21 boolean numeroteface;
22 numeroteface:=false;
23
24 string couleurperso;
25
26 defaultfont:="cmr5";
27
28 vardef Image(expr dep)=
29   if transformation:
30     Transform(dep)
31   else:
32     RotXYZ(dep)
33   fi
34   +TR
35 enddef;
36
37 boolean Transparence;
38 Transparence:=false;
39
40 vardef AffichageObjet[]=
41   save _affi;
42   picture _affi;
43   color Fc[][];color cou[];
44   tapj:=0;
45   for k=0 upto apj.@:
46     cpt[tapj]:=tapj;
47     Fc[tapj].nb:=OTFc.@[k].nb;
48     for l=1 upto Fc[tapj].nb:
49       Fc[tapj][l]:=OTFc.@[k][l];
50     endfor;
51     Fc[tapj].iso:=OTFc.@[k].iso;
52     cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
53     ALT[tapj]:=ALT.@[k];
54     Vue[tapj]:=Vue.@[k];
55     tapj:=tapj+1;
56   endfor;
57   tapj:=tapj-1;
58   QS(0,tapj);
59   if Transparence :
60     for k=0 upto tapj:
61       if Vue[cpt[k]]=false:
62         fill for l=1 upto Fc[cpt[k]].nb:
63           Projette(Fc[cpt[k]][l])--
64         endfor
65         cycle withcolor abs(lumin(cpt[k]))*cou[cpt[k]];
66         if traits=true:
67           draw for l=1 upto Fc[cpt[k]].nb:
68             Projette(Fc[cpt[k]][l])--
69           endfor
70           cycle dashed evenly withpen pencircle scaled0.25bp;
71         fi;
72       fi;
73     endfor;
74     for k=0 upto tapj:
75       if Vue[cpt[k]]:
76         transparence for l=1 upto Fc[cpt[k]].nb:
77           Projette(Fc[cpt[k]][l])--
78         endfor
79         cycle;
80         if traits=true:
81           draw for l=1 upto Fc[cpt[k]].nb:
82             Projette(Fc[cpt[k]][l])--
83           endfor
84           cycle withpen pencircle scaled0.25bp;
85         fi;
86       fi;
87     endfor;
88   else:
89     if Ferme.@:
90       for k=0 upto tapj:
91         if Vue[cpt[k]]=true:
92           fill for l=1 upto Fc[cpt[k]].nb:
93             Projette(Fc[cpt[k]][l])--
94           endfor
95           cycle withcolor
96           if arcenciel=true:
97             lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
98           else:
99             lumin(cpt[k])*cou[cpt[k]]
100           fi;
101           if traits:
102             draw for l=1 upto Fc[cpt[k]].nb:
103               Projette(Fc[cpt[k]][l])--
104             endfor
105             cycle withpen pencircle scaled0.25bp;
106             %add by cp 01/08/11
107           else:
108             draw for l=1 upto Fc[cpt[k]].nb:
109               Projette(Fc[cpt[k]][l])--
110             endfor
111             cycle withcolor
112               if arcenciel=true:
113               lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
114             else:
115               lumin(cpt[k])*cou[cpt[k]]
116             fi;
117             %fin add
118           fi;
119         fi;
120       endfor;
121     else:
122       for k=0 upto tapj:%apj downto 1:
123         fill for l=1 upto Fc[cpt[k]].nb:
124           Projette(Fc[cpt[k]][l])--
125         endfor
126         cycle withcolor if Vue[cpt[k]]:
127           if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
128           else:lumin(cpt[k])*cou[cpt[k]] fi
129         else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
130         if traits:
131           draw for l=1 upto Fc[cpt[k]].nb:
132             Projette(Fc[cpt[k]][l])--
133           endfor
134           cycle withpen pencircle scaled0.25bp;
135           %add by cp 01/08/2011
136         else:
137           draw for l=1 upto Fc[cpt[k]].nb:
138               Projette(Fc[cpt[k]][l])--
139           endfor
140           cycle withcolor if Vue[cpt[k]]:
141               if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
142             else:lumin(cpt[k])*cou[cpt[k]] fi
143           else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
144           %fin add
145         fi;
146       endfor;
147     fi;
148   fi;
149   if numeroteface=true:
150     for k=0 upto tapj:
151       if Vue[k]:
152         label(""&decimal(k)&"",Projette(Fc[k].iso));
153       fi;
154     endfor;
155   fi;
156 enddef;
157
158
159 vardef AffichageObjetold[]=
160   save _affi;
161   picture _affi;
162   color Fc[][];color cou[];
163   tapj:=0;
164   for k=0 upto apj.@:
165     cpt[tapj]:=tapj;
166     Fc[tapj].nb:=OTFc.@[k].nb;
167     for l=1 upto Fc[tapj].nb:
168       Fc[tapj][l]:=OTFc.@[k][l];
169     endfor;
170     Fc[tapj].iso:=OTFc.@[k].iso;
171     cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
172     ALT[tapj]:=ALT.@[k];
173     Vue[tapj]:=Vue.@[k];
174     tapj:=tapj+1;
175   endfor;
176   tapj:=tapj-1;
177   QS(0,tapj);
178   if Ferme.@:
179     for k=0 upto tapj:
180       if Vue[cpt[k]]=true:
181         fill for l=1 upto Fc[cpt[k]].nb:
182           Projette(Fc[cpt[k]][l])--
183         endfor
184         cycle withcolor
185         if arcenciel=true:
186           lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
187         else:
188           lumin(cpt[k])*cou[cpt[k]]
189         fi;
190         draw for l=1 upto Fc[cpt[k]].nb:
191           Projette(Fc[cpt[k]][l])--
192         endfor
193         cycle withpen pencircle scaled0.25bp;
194       fi;
195     endfor;
196   else:
197     for k=0 upto tapj:%apj downto 1:
198       fill for l=1 upto Fc[cpt[k]].nb:
199         Projette(Fc[cpt[k]][l])--
200       endfor
201       cycle withcolor if Vue[cpt[k]]:
202         if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
203         else:lumin(cpt[k])*cou[cpt[k]] fi
204       else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
205       draw for l=1 upto Fc[cpt[k]].nb:
206         Projette(Fc[cpt[k]][l])--
207       endfor
208       cycle withpen pencircle scaled0.25bp;
209     endfor;
210   fi;
211   if numeroteface=true:
212     for k=0 upto tapj:
213       if Vue[k]:
214         label(""&decimal(k)&"",Projette(Fc[k].iso));
215       fi;
216     endfor;
217   fi;
218 enddef;
219
220 vardef DessineFusion=
221   save _fusion;
222   picture _fusion;
223   tapj:=0;
224   color Fc[][];color cou[];
225   for l=1 upto nbobj:
226     for k=0 upto apj[l]:
227       cpt[tapj]:=tapj;
228       cou[tapj]:=if perso[l]:scantokens(couleurperso) else: coul[l][k] fi;
229       Fc[tapj].nb:=OTFc[l][k].nb;
230       for p=1 upto Fc[tapj].nb:
231         Fc[tapj][p]:=OTFc[l][k][p];
232       endfor;
233       Fc[tapj].iso:=OTFc[l][k].iso;
234       ALT[tapj]:=ALT[l][k];
235       Vue[tapj]:=Vue[l][k];
236       if Ferme[l]:
237         if Vue[tapj]=false:
238           tapj:=tapj-1;
239         fi;
240       fi;
241       tapj:=tapj+1;
242     endfor;
243   endfor;
244   tapj:=tapj-1;
245   QS(0,tapj);
246   for k=0 upto tapj:
247     fill for l=1 upto Fc[cpt[k]].nb:
248       Projette(Fc[cpt[k]][l])--
249     endfor
250     cycle withcolor if Vue[cpt[k]]:
251       if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
252       else:lumin(cpt[k])*cou[cpt[k]] fi
253     else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
254     if traits:
255       draw for l=1 upto Fc[cpt[k]].nb:
256         Projette(Fc[cpt[k]][l])--
257       endfor
258       cycle withpen pencircle scaled0.25bp;
259     fi;
260   endfor;
261 enddef;
262
263 vardef Objettore[](expr Rn,rn)=
264   Outcolor.@:=outcolor;
265   Incolor.@:=incolor;
266   if creux:
267     Ferme.@:=false
268   else:
269     Ferme.@:=true;
270   fi;
271   scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
272   scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
273   vardef Famille(expr u,v)=((R+r*cos(u))*cos(v),(R+r*cos(u))*sin(v),r*sin(u)) enddef;
274   umin:=-pi; umax:=pi; upas:=2*pi/nb;
275   vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
276   apj:=0;
277   %On crée les facettes et on calcule la profondeur en Z.
278   for k=0 upto (nb-1):
279     for l=0 upto (subh-1):
280       tcpt.@[apj]:=apj;
281       OTFc.@[apj].nb:=4;
282       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
283       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
284       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
285       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
286       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
287       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
288       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
289         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
290       else:
291         Vue.@[apj]:=false;coul.@[apj]:=incolor;
292       fi;
293       apj:=apj+1;
294     endfor;
295   endfor;
296   apj.@:=apj-1;
297 enddef;
298
299 vardef ObjetTube[](expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
300   Outcolor.@:=outcolor;
301   Incolor.@:=incolor;
302   scantokens("vardef F(expr t)="&Fn&" enddef;");
303   scantokens("vardef Fp(expr t)="&dp&" enddef;");
304   color G[][];
305   NB:=nbp;%nb de pas
306   nn:=pas;
307   %pour gérer le "flip" aux points d'inflexion
308   color VNbisprec[];
309   VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
310   %
311   ang:=360/nb;
312   for l=0 upto NB:
313     for k=0 upto nb:
314       G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
315     endfor;
316   endfor;
317   apj:=0;
318   if creux=false:
319     Ferme.@:=true;
320     nbsp:=nb;
321     tcpt.@[apj]:=apj;
322     OTFc.@[apj].nb:=nbsp;
323     for k=1 upto nbsp:
324       OTFc.@[apj][k]:=Image(G[0][nbsp+1-k]);
325     endfor;
326     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
327     apj:=apj+1;
328     tcpt.@[apj]:=apj;
329     OTFc.@[apj].nb:=nbsp;
330     for k=nbsp downto 1:
331       OTFc.@[apj][k]:=Image(G[NB][k]);
332     endfor;
333     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
334     apj:=apj+1;
335   else:
336     Ferme.@:=false;
337   fi;
338   for l=0 upto (NB-1):
339     for k=0 upto nb-1:
340       tcpt.@[apj]:=apj;
341       OTFc.@[apj].nb:=4;
342       OTFc.@[apj][1]:=Image(G[l][k]);
343       OTFc.@[apj][2]:=Image(G[l][k+1]);
344       OTFc.@[apj][3]:=Image(G[l+1][k+1]);
345       OTFc.@[apj][4]:=Image(G[l+1][k]);
346       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
347       apj:=apj+1;
348     endfor;
349   endfor;
350   apj:=apj-1;
351   for k=0 upto apj:
352     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
353     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
354       Vue.@[k]:=true;coul.@[k]:=outcolor;
355     else:
356       Vue.@[k]:=false;coul.@[k]:=incolor;
357     fi;
358   endfor;
359   apj.@:=apj;
360 enddef;
361
362 vardef ObjetCylindre[](expr fn,umin,umax,vmin,vmax)=
363   Outcolor.@:=outcolor;
364   Incolor.@:=incolor;
365   scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
366   apj:=0;
367   upas:=(umax-umin)/nb;vpas:=(vmax-vmin)/subh;
368   %On crée les facettes et on calcule la profondeur en Z.
369   %for k=umin step upas until umax:
370   %  for l=vmin step vpas until vmax:
371   for k=0 upto (nb-1):
372     for l=0 upto (subh-1):
373       tcpt.@[apj]:=apj;
374       OTFc.@[apj].nb:=4;
375       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
376       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
377       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
378       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
379       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
380       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
381       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
382         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
383       else:
384         Vue.@[apj]:=false;coul.@[apj]:=incolor;
385       fi;
386       apj:=apj+1;
387     endfor;
388   endfor;
389   apj.@:=apj-1;
390 enddef;
391
392 vardef Objetcylindre[](expr rn,hn)=
393   Outcolor.@:=outcolor;
394   Incolor.@:=incolor;
395   scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
396   scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
397   vardef Famille(expr u,v)=(r*cos(u),r*sin(u),v) enddef;
398   umin:=pi; umax:=-pi; upas:=-2*pi/nb;
399   vmin:=0; vmax:=h; vpas:=h/subh;
400   nbsp:=nb;
401   apj:=0;
402   if creux=false:
403     Ferme.@:=true;
404     tcpt.@[apj]:=apj;
405     OTFc.@[apj].nb:=nbsp;
406     for k=1 upto nb:
407       OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
408     endfor;
409     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
410     apj:=apj+1;
411     tcpt.@[apj]:=apj;
412     OTFc.@[apj].nb:=nbsp;
413     for k=1 upto nbsp:
414       OTFc.@[apj][k]:=Image(Famille(umin+(nbsp-k)*upas,vmax));
415     endfor;
416     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
417     apj:=apj+1;
418   else:
419     Ferme.@:=false;
420   fi;
421   %On crée les facettes et on calcule la profondeur en Z.
422   for k=0 upto (nb-1):
423     for l=0 upto (subh-1):
424       tcpt.@[apj]:=apj;
425       OTFc.@[apj].nb:=4;
426       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
427       OTFc.@[apj][2]:=Image((Famille(umin+k*upas,vmin+l*vpas)));
428       OTFc.@[apj][3]:=Image((Famille(umin+k*upas,vmin+(l+1)*vpas)));
429       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
430       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
431       apj:=apj+1;
432     endfor;
433   endfor;
434   apj:=apj-1;
435   for k=0 upto apj:
436     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
437     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
438       Vue.@[k]:=true;coul.@[k]:=outcolor;
439     else:
440       Vue.@[k]:=false;coul.@[k]:=incolor;
441     fi;
442   endfor;
443   apj.@:=apj;
444 enddef;
445
446 vardef ObjetCone[](expr fn,umin,umax,zbas,orign)=
447   Outcolor.@:=outcolor;
448   Incolor.@:=incolor;
449   scantokens("vardef Famille(expr u)="&fn&" enddef;");
450   scantokens("color "&substring(0,4) of orign&"; "&orign&";");
451   apj:=0;
452   upas:=(umax-umin)/nb;vpas:=2*abs(zbas)/subh;
453   %On crée les facettes et on calcule la profondeur en Z.
454   for k=0 upto (nb-1):
455     for l=0 upto (2*subh-1):
456       tcpt.@[apj]:=apj;
457       OTFc.@[apj].nb:=4;
458       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas)+(l/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas));
459       OTFc.@[apj][4]:=Image(Famille(umin+k*upas)+(l/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas));
460       OTFc.@[apj][3]:=Image(Famille(umin+k*upas)+((l+1)/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas));
461       OTFc.@[apj][2]:=Image(Famille(umin+(k+1)*upas)+((l+1)/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas));
462       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
463       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
464       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
465         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
466       else:
467         Vue.@[apj]:=false;coul.@[apj]:=incolor;
468       fi;
469       apj:=apj+1;
470     endfor;
471   endfor;
472   apj.@:=apj-1;
473 enddef;
474
475 subh:=12;
476
477 vardef Objetcone[](expr rn,hn)=
478   Outcolor.@:=outcolor;
479   Incolor.@:=incolor;
480   scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
481   scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
482   vardef Famille(expr u,v)=(r*(1-(v/h))*cos(u),r*(1-(v/h))*sin(u),v) enddef;
483   umin:=pi; umax:=-pi; upas:=-2*pi/nb;
484   vmin:=0; vpas:=h/subh; vmax:=h-vpas;
485   apj:=0;
486   if creux=false:
487     Ferme.@:=true;
488     tcpt.@[apj]:=apj;
489     OTFc.@[apj].nb:=nb;
490     for k=0 upto nb:
491       OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
492     endfor;
493     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
494     apj:=apj+1;
495   else:
496     Ferme.@:=false;
497   fi;
498   %On crée les facettes et on calcule la profondeur en Z.
499   for k=0 upto (nb-1):
500     for l=0 upto (subh-1):
501       tcpt.@[apj]:=apj;
502       OTFc.@[apj].nb:=4;
503       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
504       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
505       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
506       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
507       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
508       apj:=apj+1;
509     endfor;
510   endfor;
511   apj:=apj-1;
512   for k=0 upto apj:
513     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
514     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
515       Vue.@[k]:=true;coul.@[k]:=outcolor;
516     else:
517       Vue.@[k]:=false;coul.@[k]:=incolor;
518     fi;
519   endfor;
520   apj.@:=apj;
521 enddef;
522
523 vardef Objettronccone[](expr rn,hn,Hn)=
524   Outcolor.@:=outcolor;
525   Incolor.@:=incolor;
526   scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
527   scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
528   scantokens("numeric "&substring(0,1) of Hn&"; "&Hn&";");
529   vardef Famille(expr u,v)=(r*(1-v/H)*cos(u),r*(1-v/H)*sin(u),v) enddef;
530   umin:=pi; umax:=-pi; upas:=-2*pi/nb;
531   vmin:=0; vpas:=h/subh; vmax:=h;
532   apj:=0;
533   if creux=false:
534     Ferme.@:=true;
535     tcpt.@[apj]:=apj;
536     OTFc.@[apj].nb:=nb;
537     for k=0 upto nb:
538       OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
539     endfor;
540     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
541     apj:=apj+1;
542     tcpt.@[apj]:=apj;
543     OTFc.@[apj].nb:=nb;
544     for k=0 upto nb:
545       OTFc.@[apj][nb-k]:=Image(Famille(umin+k*upas,vmax));
546     endfor;
547     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
548         apj:=apj+1;
549   else:
550     Ferme.@:=false;
551   fi;
552   %On crée les facettes et on calcule la profondeur en Z.
553   for k=0 upto (nb-1):%umin step upas until umax-upas:
554     for l=0 upto (subh-1):
555        tcpt.@[apj]:=apj;
556       OTFc.@[apj].nb:=4;
557       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
558       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
559       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
560       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
561       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
562       apj:=apj+1;
563     endfor;
564   endfor;
565   apj:=apj-1;
566   for k=0 upto apj:
567     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
568     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
569       Vue.@[k]:=true;coul.@[k]:=outcolor;
570     else:
571       Vue.@[k]:=false;coul.@[k]:=incolor;
572     fi;
573   endfor;
574   apj.@:=apj;
575 enddef;
576
577 vardef Objetsphere[](expr Rn)=
578   Outcolor.@:=outcolor;
579   Incolor.@:=incolor;
580   if creux:Ferme.@:=false else: Ferme.@:=true fi;
581   scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
582   vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
583   umin:=-pi/2; umax:=pi/2; upas:=pi/nb;
584   vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
585   apj:=0;
586   %On crée les facettes et on calcule la profondeur en Z.
587   for k=0 upto (nb-1):
588     for l=0 upto (subh-1):
589       tcpt.@[apj]:=apj;
590       OTFc.@[apj].nb:=4;
591       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
592       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
593       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
594       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
595       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
596       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
597       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
598         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
599       else:
600         Vue.@[apj]:=false;coul.@[apj]:=incolor;
601       fi;
602       apj:=apj+1;
603     endfor;
604   endfor;
605   apj.@:=apj-1;
606 enddef;
607
608 vardef Objetcalotte[](expr Rn,Phib,Phih)=
609   Outcolor.@:=outcolor;
610   Incolor.@:=incolor;
611   scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
612   scantokens("numeric "&substring(0,4) of Phib&"; "&Phib&";");
613   scantokens("numeric "&substring(0,4) of Phih&"; "&Phih&";");
614   vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
615   umin:=phib; umax:=phih; upas:=(phih-phib)/nb;
616   vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
617   apj:=0;
618   nbsp:=subh;
619   if creux=false:
620     Ferme.@:=true;
621     tcpt.@[apj]:=apj;
622     OTFc.@[apj].nb:=nbsp;
623     for l=1 upto nbsp:
624       OTFc.@[apj][l]:=Image(Famille(umin,vmax-l*vpas));
625     endfor;
626     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
627     apj:=apj+1;
628     tcpt.@[apj]:=apj;
629     OTFc.@[apj].nb:=subh;
630     for l=1 upto nbsp:
631       OTFc.@[apj][l]:=Image(Famille(umax,vmin+l*vpas));
632      endfor;
633     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
634     apj:=apj+1;
635   else:
636     Ferme.@:=false;
637   fi;
638   %On crée les facettes et on calcule la profondeur en Z.
639   %for k=umin step upas until umax-upas:
640   for k=0 upto (nb-1):
641     for l=0 upto (subh-1):
642       tcpt.@[apj]:=apj;
643       OTFc.@[apj].nb:=4;
644       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
645       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
646       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
647       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
648       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
649       apj:=apj+1;
650     endfor;
651   endfor;
652   apj:=apj-1;
653   for k=0 upto apj:
654     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
655     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
656       Vue.@[k]:=true;coul.@[k]:=outcolor;
657     else:
658       Vue.@[k]:=false;coul.@[k]:=incolor;
659     fi;
660   endfor;
661   apj.@:=apj;
662 enddef;
663
664 vardef Objetanneau[](expr Rn,rn,hn)=
665   Outcolor.@:=outcolor;
666   Incolor.@:=incolor;
667   if creux:Ferme.@:=false else:Ferme.@:=true fi;
668   scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
669   scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
670   scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
671   path sectionanneau;
672   sectionanneau=(R,0)--(R,h)--(r,h)--(r,0)--cycle;
673   vardef Famille(expr u,v)=((xpart(point(u) of sectionanneau)*cos(v),xpart(point(u) of sectionanneau)*sin(v),ypart(point(u) of sectionanneau))) enddef;
674   umin:=0; umax:=4; upas:=4/nb;
675   vmin:=-pi; vpas:=2*pi/subh; vmax:=2*pi;
676   apj:=0;
677   %On crée les facettes et on calcule la profondeur en Z.
678   for k=0 upto (nb-1):
679     for l=0 upto (subh-1):
680       tcpt.@[apj]:=apj;
681       OTFc.@[apj].nb:=4;
682       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
683       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
684       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
685       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
686       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
687       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
688       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
689         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
690       else:
691         Vue.@[apj]:=false;coul.@[apj]:=incolor;
692       fi;
693       apj:=apj+1;
694     endfor;
695   endfor;
696   apj.@:=apj-1;
697 enddef;
698
699 vardef ObjetAnneau[](expr nbpn,sectionanneau)=
700   Outcolor.@:=outcolor;
701   Incolor.@:=incolor;
702   scantokens("numeric "&substring(0,3) of nbpn&"; "&nbpn&";");
703   vardef Famille(expr u,v)=((xpart(point(u) of sectionanneau)*cos(v),xpart(point(u) of sectionanneau)*sin(v),ypart(point(u) of sectionanneau))) enddef;
704   umin:=0; umax:=nbp; upas:=1;
705   vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
706   apj:=0;
707   %On crée les facettes et on calcule la profondeur en Z.
708   for k=0 upto (nbp-1):
709     for l=0 upto (subh-1):
710       tcpt.@[apj]:=apj;
711       OTFc.@[apj].nb:=4;
712       OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
713       OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
714       OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
715       OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
716       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
717       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
718       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
719         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
720       else:
721         Vue.@[apj]:=false;coul.@[apj]:=incolor;
722       fi;
723       apj:=apj+1;
724     endfor;
725   endfor;
726   apj.@:=apj-1;
727 enddef;
728
729 vardef ObjetPrisme[](expr axen,hn)(text tn)=%pb avec certaines positions de l'observateur.->maillage vertical
730   Outcolor.@:=outcolor;
731   Incolor.@:=incolor;
732   scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
733   scantokens("color "&substring(0,3) of axen&"; "&axen&";");
734   nbsn:=0;%nb sommets total pour la base
735   for _p=tn:
736     Sommet[nbsn]:=_p;
737     nbsn:=nbsn+1;
738   endfor;
739   apj:=0;
740   if creux=false:
741     Ferme.@:=true;
742     tcpt.@[apj]:=apj;
743     OTFc.@[apj].nb:=nbsn;
744     for k=1 upto nbsn:
745       OTFc.@[apj][k]:=Image(Sommet[nbsn-k]);
746     endfor;
747     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
748     apj:=apj+1;
749     tcpt.@[apj]:=apj;
750     OTFc.@[apj].nb:=nbsn;
751     for k=1 upto nbsn:
752       OTFc.@[apj][k]:=Image(Sommet[k-1]+h*axe);
753     endfor;
754     OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
755     apj:=apj+1;
756   else:
757     Ferme.@:=false;
758   fi;
759   for k=1 upto nbsn:
760     for l=0 upto (subh-1):
761       for p=0 upto (nb-1):
762         tcpt.@[apj]:=apj;
763         OTFc.@[apj].nb:=4;
764         OTFc.@[apj][1]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe));
765         OTFc.@[apj][2]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe));
766         OTFc.@[apj][3]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe));
767         OTFc.@[apj][4]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe));
768         OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
769         apj:=apj+1;
770       endfor;
771     endfor;
772   endfor;
773   apj:=apj-1;
774   for k=0 upto apj:
775     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
776     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
777       Vue.@[k]:=true;coul.@[k]:=outcolor;
778     else:
779       Vue.@[k]:=false;coul.@[k]:=incolor;
780     fi;
781   endfor;
782   apj.@:=apj;
783 enddef;
784
785 vardef Objetcube[](expr ar)=
786   Outcolor.@:=outcolor;
787   Incolor.@:=incolor;
788   if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
789   scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
790   Sommet1:=(a/2,-a/2,-a/2);
791   Sommet2:=(a/2,a/2,-a/2);
792   Sommet3:=(-a/2,a/2,-a/2);
793   Sommet4:=(-a/2,-a/2,-a/2);
794   Sommet5:=(-a/2,-a/2,a/2);
795   Sommet6:=(a/2,-a/2,a/2);
796   Sommet7:=(a/2,a/2,a/2);
797   Sommet8:=(-a/2,a/2,a/2);
798 %%Faces
799   apj:=0;
800   for p=1 upto 4:
801     for l=0 upto (subh-1):
802       for k=0 upto (subh-1):
803         OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
804         OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
805         OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
806         OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
807         OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
808         apj:=apj+1;
809       endfor;
810     endfor;
811   endfor;
812   %face du dessous
813   for l=0 upto (subh-1):
814     for k=0 upto (subh-1):
815       OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
816       OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
817       OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
818       OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
819       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
820       apj:=apj+1;
821     endfor;
822   endfor;
823   %face du dessus
824   for l=0 upto (subh-1):
825     for k=0 upto (subh-1):
826       OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
827       OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
828       OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
829       OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
830       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
831       apj:=apj+1;
832     endfor;
833   endfor;
834   apj:=apj-1;
835   for k=0 upto apj:
836     OTFc.@[k].nb:=4;
837     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
838     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
839       Vue.@[k]:=true;coul.@[k]:=outcolor;
840     else:
841       Vue.@[k]:=false;coul.@[k]:=incolor;
842     fi;
843   endfor;
844   apj.@:=apj;
845 enddef;
846
847 vardef Objetpave[](expr Lln,Hhn,Ppn)=
848   Outcolor.@:=outcolor;
849   Incolor.@:=incolor;
850   if creux=true: Ferme.@:=true else: Ferme.@:=false fi;
851   scantokens("numeric "&substring(0,1) of Lln&"; "&Lln&";");
852   scantokens("numeric "&substring(0,1) of Hhn&"; "&Hhn&";");
853   scantokens("numeric "&substring(0,1) of Ppn&"; "&Ppn&";");
854   NbS:=8;
855   Sommet1:=(P/2,-L/2,-H/2);
856   Sommet2:=(P/2,L/2,-H/2);
857   Sommet3:=(-P/2,L/2,-H/2);
858   Sommet4:=(-P/2,-L/2,-H/2);
859   Sommet5:=(-P/2,-L/2,H/2);
860   Sommet6:=(P/2,-L/2,H/2);
861   Sommet7:=(P/2,L/2,H/2);
862   Sommet8:=(-P/2,L/2,H/2);
863 %%Faces
864   apj:=0;
865   for p=1 upto 4:
866     for l=0 upto (subh-1):
867       for k=0 upto (subh-1):
868         OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
869         OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
870         OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
871         OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
872         OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
873         apj:=apj+1;
874       endfor;
875     endfor;
876   endfor;
877   %face du dessous
878   for l=0 upto (subh-1):
879     for k=0 upto (subh-1):
880       OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
881       OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
882       OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
883       OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
884       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
885       apj:=apj+1;
886     endfor;
887   endfor;
888   %face du dessus
889   for l=0 upto (subh-1):
890     for k=0 upto (subh-1):
891       OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
892       OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
893       OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
894       OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
895       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
896       apj:=apj+1;
897     endfor;
898   endfor;
899   apj:=apj-1;
900   for k=0 upto apj:
901     OTFc.@[k].nb:=4;
902     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
903     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
904       Vue.@[k]:=true;coul.@[k]:=outcolor;
905     else:
906       Vue.@[k]:=false;coul.@[k]:=incolor;
907     fi;
908   endfor;
909   apj.@:=apj;
910 enddef;
911
912 vardef Objetgrille[](expr amn,ann,bmn,bnn)=
913   Outcolor.@:=outcolor;
914   Incolor.@:=incolor;
915   Ferme.@:=false;
916   scantokens("numeric "&substring(0,2) of amn&"; "&amn&";");
917   scantokens("numeric "&substring(0,2) of ann&"; "&ann&";");
918   scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";");
919   scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";");
920   apj:=0;
921   upas:=(an-am)/nb;
922   vpas:=(bn-bm)/subh;
923   for k=0 upto (nb-1):
924     for l=0 upto (subh-1):
925       tcpt.@[apj]:=apj;
926       OTFc.@[apj].nb:=4;
927       OTFc.@[apj][1]:=Image((am+k*upas,bm+l*vpas,0));
928       OTFc.@[apj][2]:=Image((am+(k+1)*upas,bm+l*vpas,0));
929       OTFc.@[apj][3]:=Image((am+(k+1)*upas,bm+(l+1)*vpas,0));
930       OTFc.@[apj][4]:=Image((am+k*upas,bm+(l+1)*vpas,0));
931       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
932       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
933       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
934         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
935       else:
936         Vue.@[apj]:=false;coul.@[apj]:=incolor;
937       fi;
938       apj:=apj+1;
939     endfor;
940   endfor;
941   apj.@:=apj-1;
942 enddef;
943
944 vardef ObjetRuban[](expr hn)(text tn)=
945   Outcolor.@:=outcolor;
946   Incolor.@:=incolor;
947   scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
948   nbsn:=0;%nb sommets total pour la base
949   for _p=tn:
950     Sommet[nbsn]:=_p;
951     nbsn:=nbsn+1;
952   endfor;
953   Ferme.@:=false;
954   apj:=0;
955   for k=1 upto (nbsn-1):
956     for l=0 upto (subh-1):
957       tcpt.@[apj]:=apj;
958       OTFc.@[apj].nb:=4;
959       OTFc.@[apj][1]:=Image(Sommet[k-1]+(l/subh)*(h*(0,0,1)));
960       OTFc.@[apj][2]:=Image(Sommet[k]+(l/subh)*(h*(0,0,1)));
961       OTFc.@[apj][3]:=Image(Sommet[k]+((l+1)/subh)*(h*(0,0,1)));
962       OTFc.@[apj][4]:=Image(Sommet[k-1]+((l+1)/subh)*(h*(0,0,1)));
963       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
964       apj:=apj+1;
965     endfor;
966   endfor;
967   apj:=apj-1;
968   for k=0 upto apj:
969     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
970     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
971       Vue.@[k]:=true;coul.@[k]:=outcolor;
972     else:
973       Vue.@[k]:=false;coul.@[k]:=incolor;
974     fi;
975   endfor;
976   apj.@:=apj;
977 enddef;
978
979 vardef ObjetBiface[](text tn)=
980   Outcolor.@:=outcolor;
981   Incolor.@:=incolor;
982   nbsn:=0;%nb sommets total pour la base
983   for _p=tn:
984     nbsn:=nbsn+1;
985     Sommet[nbsn]:=_p;
986   endfor;
987   Ferme.@:=true;
988   apj:=0;
989   tcpt.@[apj]:=apj;
990   OTFc.@[apj].nb:=nbsn;
991   for k=1 upto nbsn:
992     OTFc.@[apj][k]:=Image(Sommet[nbsn+1-k]);
993   endfor;
994   OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
995   apj:=apj+1;
996   tcpt.@[apj]:=apj;
997   OTFc.@[apj].nb:=nbsn;
998   for k=1 upto nbsn:
999     OTFc.@[apj][k]:=Image(Sommet[k]);
1000   endfor;
1001   OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
1002   for k=0 upto apj:
1003     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
1004     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
1005       Vue.@[k]:=true;coul.@[k]:=outcolor;
1006     else:
1007       Vue.@[k]:=false;coul.@[k]:=incolor;
1008     fi;
1009   endfor;
1010   apj.@:=apj;
1011 enddef;
1012
1013 lambda:=3;
1014 mu:=2;
1015
1016 vardef Objetplan[](expr Ann,Bnn,Cnn)=%à modifier mais pour l'instant ça marche pour les intersections;
1017   Outcolor.@:=outcolor;
1018   Incolor.@:=incolor;
1019   Ferme.@:=false;
1020   color PPP[];
1021   scantokens("color "&substring(0,2) of Ann&"; "&Ann&";");
1022   scantokens("color "&substring(0,2) of Bnn&"; "&Bnn&";");
1023   scantokens("color "&substring(0,2) of Cnn&"; "&Cnn&";");
1024   apj:=0;
1025   PPP[0]=Image(An-lambda*(Bn-An)-mu*(Cn-An));
1026   PPP[1]=Image(An+lambda*(Bn-An)-mu*(Cn-An));
1027   PPP[2]=Image(An+lambda*(Bn-An)+mu*(Cn-An));
1028   PPP[3]=Image(An-lambda*(Bn-An)+mu*(Cn-An));
1029   for k=0 upto (nb-1):
1030     for l=0 upto (subh-1):
1031       tcpt.@[apj]:=apj;
1032       OTFc.@[apj].nb:=4;
1033       OTFc.@[apj][1]:=Image((k/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0));
1034       OTFc.@[apj][2]:=Image(((k+1)/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0));
1035       OTFc.@[apj][3]:=Image(((k+1)/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0));
1036       OTFc.@[apj][4]:=Image((k/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0));
1037       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
1038       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
1039       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
1040         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
1041       else:
1042         Vue.@[apj]:=false;coul.@[apj]:=incolor;
1043       fi;
1044       apj:=apj+1;
1045     endfor;
1046   endfor;
1047   apj.@:=apj-1;
1048 enddef;
1049
1050 vardef Objettetraedre[](expr ar)=
1051   Outcolor.@:=outcolor;
1052   Incolor.@:=incolor;
1053   if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
1054   scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
1055   Sommet0:=a*(-0.81650,-0.47140,-1/3);
1056   Sommet1:=a*(0.81650,-0.471402,-1/3);
1057   Sommet2:=a*(0,0.94281,-1/3);
1058   Sommet3:=a*(0,0,1);
1059   tcpt.@[0]:=0;
1060   OTFc.@[0].nb:=3;
1061   OTFc.@[0][1]:=Image(Sommet0);
1062   OTFc.@[0][2]:=Image(Sommet2);
1063   OTFc.@[0][3]:=Image(Sommet1);
1064   OTFc.@[0].iso:=(OTFc.@[0][1]+OTFc.@[0][2]+OTFc.@[0][3])/3;
1065   tcpt.@[1]:=1;
1066   OTFc.@[1].nb:=3;
1067   OTFc.@[1][1]:=Image(Sommet0);
1068   OTFc.@[1][2]:=Image(Sommet1);
1069   OTFc.@[1][3]:=Image(Sommet3);
1070   OTFc.@[1].iso:=(OTFc.@[1][1]+OTFc.@[1][2]+OTFc.@[1][3])/3;
1071   tcpt.@[2]:=2;
1072   OTFc.@[2].nb:=3;
1073   OTFc.@[2][1]:=Image(Sommet1);
1074   OTFc.@[2][2]:=Image(Sommet2);
1075   OTFc.@[2][3]:=Image(Sommet3);
1076   OTFc.@[2].iso:=(OTFc.@[2][1]+OTFc.@[2][2]+OTFc.@[2][3])/3;
1077   tcpt.@[3]:=3;
1078   OTFc.@[3].nb:=3;
1079   OTFc.@[3][1]:=Image(Sommet2);
1080   OTFc.@[3][2]:=Image(Sommet0);
1081   OTFc.@[3][3]:=Image(Sommet3);
1082   OTFc.@[3].iso:=(OTFc.@[3][1]+OTFc.@[3][2]+OTFc.@[3][3])/3;
1083   for k=0 upto 3:
1084     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
1085     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
1086       Vue.@[k]:=true;coul.@[k]:=outcolor;
1087     else:
1088       Vue.@[k]:=false;coul.@[k]:=incolor;
1089     fi;
1090   endfor;
1091   apj.@:=3;
1092 enddef;
1093
1094 vardef Objetoctaedre[](expr ar)=
1095   Outcolor.@:=outcolor;
1096   Incolor.@:=incolor;
1097   if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
1098   scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
1099   AA=a*sqrt(2)/2;
1100   ObjetNew.@((0,0,-a),(-AA,-AA,0),(AA,-AA,0),(AA,AA,0),(-AA,AA,0),(0,0,a))(%
1101     3,0,2,1,%
1102     3,0,3,2,%
1103     3,0,4,3,%
1104     3,0,1,4,%
1105     3,5,1,2,%
1106     3,5,2,3,%
1107     3,5,3,4,%
1108     3,5,4,1%
1109     );
1110 enddef;
1111
1112 vardef Objeticosaedre[](expr ar)=
1113   Outcolor.@:=outcolor;
1114   Incolor.@:=incolor;
1115   if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
1116   scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
1117   aplus=sqrt((5+sqrt(5))/10);
1118   amoins=sqrt((5-sqrt(5))/10);
1119   bplus=(5+sqrt(5))/10;
1120   bmoins=(5-sqrt(5))/10;
1121   Cmp=sqrt(5)/5;
1122   ObjetNew.@(a*(0,1,0),a*(amoins,Cmp,-bplus),a*(-amoins,Cmp,-bplus),a*(-aplus,Cmp,bmoins),a*(0,Cmp,2*Cmp),a*(aplus,Cmp,bmoins),a*(amoins,-Cmp,bplus),a*(-amoins,-Cmp,bplus),a*(-aplus,-Cmp,-bmoins),a*(0,-Cmp,-2*Cmp),a*(aplus,-Cmp,-bmoins),a*(0,-1,0))(%
1123     3,1,5,6,%
1124     3,1,4,5,%
1125     3,1,3,4,%
1126     3,1,2,3,%
1127     3,1,6,2,%
1128     3,7,6,5,%
1129     3,8,5,4,%
1130     3,9,4,3,%
1131     3,10,3,2,%
1132     3,11,2,6,%
1133     3,6,7,11,%
1134     3,5,8,7,%
1135     3,4,9,8,%
1136     3,3,10,9,%
1137     3,2,11,10,%
1138     3,12,10,11,%
1139     3,12,9,10,%
1140     3,12,8,9,%
1141     3,12,7,8,%
1142     3,12,11,7);
1143 enddef;
1144
1145 vardef Objetdodecaedre[](expr ar)=
1146   Outcolor.@:=outcolor;
1147   Incolor.@:=incolor;
1148   if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
1149   scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
1150   Ap=a*sqrt((5+2*sqrt(5))/15);
1151   Bp=a*sqrt((10+2*sqrt(5))/15);
1152   Cp=a*sqrt((5+sqrt(5))/30);
1153   Dp=a*(sqrt(15)+sqrt(3))/6;
1154   Am=a*sqrt((5-2*sqrt(5))/15);
1155   Bm=a*sqrt((10-2*sqrt(5))/15);
1156   Cm=a*sqrt((5-sqrt(5))/30);
1157   Dm=a*(sqrt(15)-sqrt(3))/6;
1158   Ee:=a*sqrt(3)/3;
1159   ObjetNew.@((0,Ap,-Bm),(-Ee,Ap,-Am),(-Dm,Ap,Cp),(Dm,Ap,Cp),(Ee,Ap,-Am),(0,Am,-Bp),(-Dp,Am,-Cm),(-Ee,Am,Ap),(Ee,Am,Ap),(Dp,Am,-Cm),(0,-Am,Bp),(Dp,-Am,Cm),(Ee,-Am,-Ap),(-Ee,-Am,-Ap),(-Dp,-Am,Cm),(0,-Ap,Bm),(Ee,-Ap,Am),(Dm,-Ap,-Cp),(-Dm,-Ap,-Cp),(-Ee,-Ap,Am))(%
1160     5,5,1,2,3,4,%
1161     5,1,5,10,13,6,%
1162     5,2,1,6,14,7,%
1163     5,3,2,7,15,8,%
1164     5,4,3,8,11,9,%
1165     5,5,4,9,12,10,%
1166     5,6,13,18,19,14,%
1167     5,7,14,19,20,15,%
1168     5,8,15,20,16,11,%
1169     5,9,11,16,17,12,%
1170     5,10,12,17,18,13,%
1171     5,16,20,19,18,17%
1172     );
1173 enddef;
1174
1175 vardef ObjetNew[](text listesommets)(text listefaces)=
1176   Outcolor.@:=outcolor;
1177   Incolor.@:=incolor;
1178   color Sommet[];
1179   nbs:=0;
1180   mini:=min(listefaces);
1181   if mini=0:
1182     for _p=listesommets:
1183       Sommet[nbs]:=_p;
1184       nbs:=nbs+1;
1185     endfor;
1186   elseif mini=1:
1187     for _p=listesommets:
1188       nbs:=nbs+1;
1189       Sommet[nbs]:=_p;
1190     endfor;
1191   fi;
1192   apj:=0;
1193   j:=0;%pour compter le nombre de sommets à conserver
1194   for p_=listefaces:
1195     if j=0:
1196       OTFc.@[apj].nb:=p_;
1197       j:=1;
1198       k:=0;
1199     else:
1200       k:=k+1;
1201       if k<>OTFc.@[apj].nb:
1202         OTFc.@[apj][k]:=Image(Sommet[p_]);
1203       else:
1204         OTFc.@[apj][k]:=Image(Sommet[p_]);
1205         j:=0;
1206         apj:=apj+1;
1207       fi;
1208     fi;
1209   endfor;
1210   apj:=apj-1;
1211   for k=0 upto apj:
1212     OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb;
1213     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
1214     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
1215       Vue.@[k]:=true;coul.@[k]:=outcolor;
1216     else:
1217       Vue.@[k]:=false;coul.@[k]:=incolor;
1218     fi;
1219   endfor;
1220   apj.@:=apj;
1221 enddef;
1222
1223 %Objet lecture externe
1224
1225 vardef ObjetOFF[](expr nomfichier)=
1226   Outcolor.@:=outcolor;
1227   Incolor.@:=incolor;
1228   OFF:=true;
1229   string s_;
1230   s_=readfrom nomfichier;
1231   string ss[];
1232   if s_<>EOF:
1233     ss1 := loptok s_;
1234     t_ := if ss1="%": 0 else: 1 fi;
1235     forever:
1236       ss[incr t_] := loptok s_;
1237       exitif ss[t_]="";
1238     endfor
1239   else: false
1240   fi;
1241   NbS:=round(Mexp Mlog_str ss1);
1242   NF:=round(Mexp Mlog_str ss2);
1243   s_:=readfrom nomfichier;
1244   if debut=0:
1245     for k=0 upto NbS-1:
1246       s_:=readfrom nomfichier;
1247       if s_<>EOF:
1248         ss1 := loptok s_;
1249         n_ := if ss1="%": 0 else: 1 fi;
1250         forever:
1251           ss[incr n_] := loptok s_;
1252           exitif ss[n_]="";
1253         endfor
1254       else: false
1255       fi;
1256       Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1257      endfor;
1258   else:
1259     for k=1 upto NbS:
1260       s_:=readfrom nomfichier;
1261       if s_<>EOF:
1262         ss1 := loptok s_;
1263         n_ := if ss1="%": 0 else: 1 fi;
1264         forever:
1265           ss[incr n_] := loptok s_;
1266           exitif ss[n_]="";
1267         endfor
1268       else: false
1269       fi;
1270       Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1271     endfor;
1272   fi;
1273   apj:=0;
1274   for nf=-4000 upto (-4000+NF)-1:
1275     s_:=readfrom nomfichier;
1276      if s_<>EOF:
1277       ss1 := loptok s_;
1278       n_ := if ss1="%": 0 else: 1 fi;
1279       forever:
1280         ss[incr n_] := loptok s_;
1281         exitif ss[n_]="";
1282       endfor
1283     else: false
1284     fi;
1285     OTFc.@[apj].nb:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
1286     for nl=1 upto OTFc.@[apj].nb:
1287       if invnormale=1:
1288         OTFc.@[apj][nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
1289       else:
1290         OTFc.@[apj][OTFc.@[apj].nb+1-nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
1291       fi;
1292     endfor;
1293     OTFc.@[apj].iso:=(OTFc.@[apj][1] for l=2 upto OTFc.@[apj].nb:+OTFc.@[apj][l] endfor)/OTFc.@[apj].nb;
1294     ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
1295     if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
1296       Vue.@[apj]:=true;coul.@[apj]:=outcolor;
1297     else:
1298       Vue.@[apj]:=false;coul.@[apj]:=incolor;
1299     fi;
1300     apj:=apj+1;
1301   endfor;
1302   apj.@:=apj-1;
1303   closefrom nomfichier;
1304 enddef;
1305
1306 vardef ObjetOBJ[](expr nomfichier)=
1307   Outcolor.@:=outcolor;
1308   Incolor.@:=incolor;
1309   string s_;
1310   string ss[];
1311   nbss:=1;
1312   apj:=0;
1313   forever:
1314     s_:=readfrom nomfichier;
1315     if s_<>EOF:
1316       ss0 := loptok s_;
1317       if ss0="v":
1318         n_:=0;
1319         forever:
1320           ss[incr n_] := loptok s_;
1321           exitif ss[n_]="";
1322         endfor
1323         Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1324         nbss:=incr nbss;
1325       elseif ss0="f":
1326         n_:=0;
1327         forever:
1328           ss[incr n_] := loptok s_;
1329           exitif ss[n_]="";
1330         endfor;
1331         OTFc.@[apj].nb:=n_-1;
1332         for k=1 upto OTFc.@[apj].nb:
1333           if invnormale=1:
1334             OTFc.@[apj][OTFc.@[apj].nb-k+1] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
1335             %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
1336           %  show OTFc.@[apj][OTFc.@[apj].nb-k+1];
1337           %fi;
1338           else:
1339             OTFc.@[apj][k] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
1340             %if unknown OTFc.@[apj][k]:
1341           %  show OTFc.@[apj][k];
1342           %fi;
1343           fi;
1344           
1345         endfor;
1346         apj:=apj+1;
1347       fi;
1348     fi;
1349     exitif s_=EOF;
1350   endfor;
1351   apj:=apj-1;
1352   for k=0 upto apj:
1353     OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb;
1354     ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
1355     if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
1356       Vue.@[k]:=true;coul.@[k]:=outcolor;
1357     else:
1358       Vue.@[k]:=false;coul.@[k]:=incolor;
1359     fi;
1360   endfor;
1361   apj.@:=apj;
1362   closefrom nomfichier;
1363 enddef;
1364
1365
1366 %%%%%%%Objets travaillés
1367
1368 vardef ObjetEnleve[](text t)=%les numéros des faces sont données par ordre croissant.
1369   numeric numface[];
1370   nface:=0;
1371   numface[0]:=0;
1372   %récupérer les numéros des faces.
1373   forsuffixes _p=t:
1374     nface:=nface+1;
1375     numface[nface]=_p-(nface-1);%marchait :)
1376   endfor;
1377   numface[nface+1]:=apj.@-nface+1;
1378   %Mettre dans l'ordre ces numéros.<-déjà fait par l'utilisateur
1379   %enlever les numéros des faces
1380   apj:=0;
1381   for k=0 upto nface:
1382     for l=numface[k] upto (numface[k+1]-1):
1383       tcpt.@[apj]:=tcpt.@[apj+k];
1384       OTFc.@[apj].nb:=OTFc.@[apj+k].nb;
1385       for p=1 upto OTFc.@[apj].nb:
1386         OTFc.@[apj][p]:=OTFc.@[apj+k][p];
1387       endfor;
1388       OTFc.@[apj].iso:=OTFc.@[apj+k].iso;
1389       ALT.@[apj]:=ALT.@[apj+k];
1390       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
1391         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
1392       else:
1393         Vue.@[apj]:=false;coul.@[apj]:=incolor;
1394       fi;
1395       apj:=apj+1;
1396     endfor;
1397   endfor;
1398   apj.@:=apj-1;
1399 enddef;
1400
1401 vardef ObjetDeplacement[](text t)=
1402   %permet de déplacer un objet en donnant au préalable les angles de rotations et la translation. On peut également appliquer une transformation.
1403     Outcolor.@:=outcolor;
1404   Incolor.@:=incolor;
1405   apj:=0;
1406   forsuffixes p_=t:
1407     Ferme.@:=Ferme[p_];
1408     for k=0 upto apj[p_]:
1409       cpt.@[apj]:=cpt[p_][k];
1410       OTFc.@[apj].nb:=OTFc[p_][k].nb;
1411       for l=1 upto OTFc.@[apj].nb:
1412         OTFc.@[apj][l]:=Image(OTFc[p_][k][l]);
1413       endfor;
1414       OTFc.@[apj].iso:=Image(OTFc[p_][k].iso);
1415       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
1416       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
1417         Vue.@[apj]:=true;coul.@[apj]:=Outcolor[p_];
1418       else:
1419         if Ferme.@=false:
1420           Vue.@[apj]:=false;coul.@[apj]:=Incolor[p_];
1421         else:
1422           apj:=apj-1;
1423         fi;
1424       fi;
1425       apj:=apj+1;
1426     endfor;
1427   endfor;
1428   apj.@:=apj-1;
1429 enddef;
1430
1431 vardef ObjetFusion[](text t)=
1432   Outcolor.@:=outcolor;
1433   Incolor.@:=incolor;
1434   tapj:=0;
1435   Nbobj:=0;
1436   forsuffixes p_=t:
1437     for k=0 upto apj[p_]:
1438       cpt.@[tapj]:=tapj;
1439       OTFc.@[tapj].nb:=OTFc[p_][k].nb;
1440       for p=1 upto OTFc.@[tapj].nb:
1441         OTFc.@[tapj][p]:=OTFc[p_][k][p];
1442       endfor;
1443       OTFc.@[tapj].iso:=OTFc[p_][k].iso;
1444       ALT.@[tapj]:=-Zpart(GCoord(OTFc.@[tapj].iso));
1445       Vue.@[tapj]:=Vue[p_][k];
1446       coul.@[tapj]:=coul[p_][k];
1447       tapj:=tapj+1;
1448     endfor;
1449   endfor;
1450   apj.@:=tapj-1;
1451 enddef;
1452
1453 %les intersections d'objets
1454
1455 vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd)
1456   save di,vc;
1457   color va,vb,vc,vd;
1458   vd=Normal(bb,cc,dd);
1459   va=vd/Norm(vd);
1460   vb=aa-bb;
1461   di=-ProduitScalaire(vb,va);
1462   va:=di*va;
1463   vb:=vb+va;
1464   vc=bb+vb;
1465   vc
1466 enddef;
1467
1468 %%denis Roegel----------
1469 vardef IntersectionPlandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
1470   save Int;
1471   boolean Int;
1472   color gg,caaa[],Caaa[];
1473   caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc));
1474   caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi;
1475   caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi;
1476   ww:=ProduitScalaire(caaa2,caaa3);
1477   if ww<>0:
1478     %if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
1479       caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
1480       Int:=true;
1481     %else:
1482     %  Int:=false;
1483     %fi;
1484   else: % the line is parallel to the plane
1485     Int:=false;
1486   fi;
1487   Int
1488 enddef;
1489
1490 vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
1491   save Int;
1492   boolean Int;
1493   color gg,caaa[],Caaa[];
1494   caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc));
1495   caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi;
1496   caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi;
1497   ww:=ProduitScalaire(caaa2,caaa3);
1498   if ww<>0:
1499     if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
1500       %message("ww"&decimal(ww)&" PS"&decimal(ProduitScalaire(caaa1,caaa3))&"");      
1501       caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
1502       Int:=true;
1503     else:
1504       Int:=false;
1505     fi;
1506   else: % the line is parallel to the plane
1507     Int:=false;
1508   fi;
1509   Int
1510 enddef;
1511
1512 vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee)
1513   if Intersectionplandroite(aa,bb,cc,dd,ee):
1514     gg=dd+caaa4;
1515   fi;
1516   gg
1517 enddef;
1518
1519 vardef IPP(expr aa,bb,cc,dd,ee,ff)=
1520   %a vérifier
1521   %save da,db,dc;
1522   boolean int;
1523   da:=Norm(aa-ProjectionsurPlan(aa,dd,ee,ff));
1524   db:=Norm(bb-ProjectionsurPlan(bb,dd,ee,ff));
1525   dc:=Norm(cc-ProjectionsurPlan(cc,dd,ee,ff));
1526   if (da=db) and (db=dc): % the two planes are parallel
1527     int:=false;
1528   else:
1529     int:=true;
1530     nbi:=nbi+1;
1531   fi;
1532 enddef;
1533 %%---------------------
1534
1535 vardef ObjetIntersection[](text t)=%plan n°1 solide n°2
1536   color INTER[][][];%pour avoir les points d'intersection
1537   nbsol:=1;
1538   forsuffixes p_=t:
1539     pp_[nbsol]:=p_;
1540     nbsol:=nbsol+1;
1541   endfor;
1542   nbi:=0;
1543   for k=0 upto apj[pp_[2]]:
1544       IPP(OTFc[pp_[2]][k][1],OTFc[pp_[2]][k][2],OTFc[pp_[2]][k][3],PPP0,PPP1,PPP2);
1545       if int=true:
1546         nbint:=0;
1547         OTFc[pp_[2]][k][OTFc[pp_[2]][k].nb+1]=OTFc[pp_[2]][k][1];
1548         for l=1 upto (OTFc[pp_[2]][k].nb):
1549           if Intersectionplandroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]):
1550             nbint:=nbint+1;
1551             INTER[pp_2][k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]);
1552           fi;
1553         endfor;
1554         %%%Pas satisfaisant -> à travailler
1555         %show nbint;
1556         if nbint=2:
1557           draw Projette(INTER[pp_2][k][1])--Projette(INTER[pp_2][k][2]) withpen pencircle scaled2bp withcolor violet;
1558         fi;
1559       fi;
1560   endfor;
1561 enddef;
1562   
1563 vardef ObjetSepare[](expr nbd,nbD)=%nbd pour l'objet du dessous, nbD pour l'objet du dessus.
1564   Ferme[nbd]:=Ferme.@;
1565   Ferme[nbD]:=Ferme.@;
1566   Outcolor[nbd]:=outcolor;
1567   Incolor[nbd]:=incolor;
1568   Outcolor[nbD]:=outcolor;
1569   Incolor[nbD]:=incolor;
1570   color INTER[][][];
1571   color Nn;color PPP.iso;
1572   Nn=Normal(PPP0,PPP1,PPP3);
1573   PPP.iso=(PPP0+PPP1+PPP2)/3;
1574   apj:=0;bpj:=0;%bpj pour le 2eme solide
1575   for k=0 upto apj.@:
1576     if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)<=0:
1577       nbint:=0;
1578       OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1];
1579       for l=1 upto OTFc.@[k].nb:
1580         if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]):
1581           nbint:=nbint+1;
1582           INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]);
1583           prec.@[k][nbint]:=l;
1584           suiv.@[k][nbint]:=l+1;
1585         fi;
1586       endfor;
1587       if nbint=0:
1588         tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb;
1589         for l=1 upto OTFc[nbd][apj].nb:
1590           OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]);
1591         endfor;
1592         OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1593         ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1594         if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1595           Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1596         else:
1597           Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1598         fi;
1599         apj:=apj+1;
1600       fi;
1601       if nbint=2:
1602         tcpt[nbd][apj]:=apj;
1603         if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
1604           compt:=0;
1605           for l=1 upto prec.@[k][1]:
1606             compt:=compt+1;
1607             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1608           endfor;
1609           OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
1610           OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
1611           compt:=compt+2;
1612           for l=suiv.@[k][2] upto OTFc.@[k].nb:
1613             compt:=compt+1;
1614             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1615           endfor;
1616           OTFc[nbd][apj].nb:=compt;
1617           OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1618           ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1619           if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1620             Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1621           else:
1622             Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1623           fi;
1624           apj:=apj+1;
1625           %2eme solide
1626           compt:=1;
1627           OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
1628           for l=suiv.@[k][1] upto prec.@[k][2]:
1629             compt:=compt+1;
1630             OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1631           endfor;
1632           compt:=compt+1;
1633           OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]);
1634           OTFc[nbD][bpj].nb:=compt;
1635           OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
1636           ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
1637           if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
1638             Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
1639           else:
1640             Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1641           fi;
1642           bpj:=bpj+1;
1643           %fin 2eme solide
1644         else:
1645           compt:=1;
1646           OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
1647           for l=suiv.@[k][1] upto prec.@[k][2]:
1648             compt:=compt+1;
1649             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1650           endfor;
1651           compt:=compt+1;
1652           OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]);
1653           OTFc[nbd][apj].nb:=compt;
1654           OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1655           ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1656           if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1657             Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1658           else:
1659             Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1660           fi;
1661           apj:=apj+1;
1662           %2eme solide
1663           compt:=0;
1664           for l=1 upto prec.@[k][1]:
1665             compt:=compt+1;
1666             OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1667           endfor;
1668           OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
1669           OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
1670           compt:=compt+2;
1671           for l=suiv.@[k][2] upto OTFc.@[k].nb:
1672             compt:=compt+1;
1673             OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1674           endfor;
1675           OTFc[nbD][bpj].nb:=compt;
1676           OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
1677           ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
1678           if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
1679             Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
1680           else:
1681             Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1682           fi;
1683           bpj:=bpj+1;
1684           %fin 2eme solide
1685         fi;
1686       fi;
1687       if nbint=1:
1688         compt:=0;%compteur pour le nb de sommets
1689         comp:=0;%pour savoir où se situe le point à enlever
1690         for l=1 upto OTFc.@[k].nb:
1691           if ProduitScalaire(Nn,OTFc.@[k][l]-PPP.iso)>0:
1692             comp:=comp+1;
1693           fi;
1694         endfor;
1695         if comp=1:
1696           tcpt[nbd][apj]:=apj;
1697           for l=1 upto prec.@[k][1]-1:
1698             compt:=compt+1;
1699             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1700           endfor;
1701           compt:=compt+1;
1702           OTFc[nbd][apj][compt]:=Image(INTER.@[k][1]);
1703           for l=suiv.@[k][1] upto OTFc.@[k].nb:
1704             compt:=compt+1;
1705             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1706           endfor;
1707           OTFc[nbd][apj].nb:=compt;
1708           OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1709           ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1710           if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1711             Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1712           else:
1713             Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1714           fi;
1715           apj:=apj+1;
1716         else:
1717           tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb;
1718           for l=1 upto OTFc[nbd][apj].nb:
1719             OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]);
1720           endfor;
1721           OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1722           ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1723           if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1724             Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1725           else:
1726             Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1727           fi;
1728           apj:=apj+1;
1729         fi;
1730       fi;
1731     fi;
1732     if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)>0:
1733       nbint:=0;
1734       OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1];
1735       for l=1 upto OTFc.@[k].nb:
1736         if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]):
1737           nbint:=nbint+1;
1738           INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]);
1739           prec.@[k][nbint]:=l;
1740           suiv.@[k][nbint]:=l+1;
1741         fi;
1742       endfor;
1743       %2eme solide sans intersection
1744       if nbint=0:
1745         tcpt[nbD][bpj]:=bpj; OTFc[nbD][bpj].nb:=OTFc.@[k].nb;
1746         for l=1 upto OTFc[nbD][bpj].nb:
1747           OTFc[nbD][bpj][l]:=Image(OTFc.@[k][l]);
1748         endfor;
1749         OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
1750         ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
1751         if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
1752           Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
1753         else:
1754           Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1755         fi;
1756         bpj:=bpj+1;
1757       fi;
1758       %fin 2eme solide
1759       if nbint=2:
1760         tcpt[nbd][apj]:=apj;
1761         if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
1762           compt:=0;
1763           for l=1 upto prec.@[k][1]:
1764             compt:=compt+1;
1765             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1766           endfor;
1767           OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
1768           OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
1769           compt:=compt+2;
1770           for l=suiv.@[k][2] upto OTFc.@[k].nb:
1771             compt:=compt+1;
1772             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1773           endfor;
1774           OTFc[nbd][apj].nb:=compt;
1775           OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1776           ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1777           if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1778             Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1779           else:
1780             Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1781           fi;
1782           apj:=apj+1;
1783           %2eme solide
1784           compt:=1;
1785           OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
1786           for l=suiv.@[k][1] upto prec.@[k][2]:
1787             compt:=compt+1;
1788             OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1789           endfor;
1790           compt:=compt+1;
1791           OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]);
1792           OTFc[nbD][bpj].nb:=compt;
1793           OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
1794           ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
1795           if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
1796             Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
1797           else:
1798             Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1799           fi;
1800           bpj:=bpj+1;
1801           %fin 2eme solide
1802         else:
1803           compt:=1;
1804           OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
1805           for l=suiv.@[k][1] upto prec.@[k][2]:
1806             compt:=compt+1;
1807             OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1808           endfor;
1809           compt:=compt+1;
1810           OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]);
1811           OTFc[nbd][apj].nb:=compt;
1812           OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
1813           ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
1814           if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
1815             Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
1816           else:
1817             Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1818           fi;
1819           apj:=apj+1;
1820           %2eme solide
1821           compt:=0;
1822           for l=1 upto prec.@[k][1]:
1823             compt:=compt+1;
1824             OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1825           endfor;
1826           OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
1827           OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
1828           compt:=compt+2;
1829           for l=suiv.@[k][2] upto OTFc.@[k].nb:
1830             compt:=compt+1;
1831             OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1832           endfor;
1833           OTFc[nbD][bpj].nb:=compt;
1834           OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
1835           ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
1836           if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
1837             Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
1838           else:
1839             Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1840           fi;
1841           bpj:=bpj+1;
1842           %fin 2eme solide
1843         fi;
1844       fi;
1845     fi;
1846   endfor;
1847   apj[nbd]:=apj-1;
1848   apj[nbD]:=bpj-1;
1849 enddef;
1850
1851 %pour les lignes de niveaux.
1852 vardef ObjetSurfaceZ[](expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
1853   surfz:=true;
1854   Outcolor.@:=outcolor;
1855   Incolor.@:=incolor;
1856   scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
1857   apj:=0;
1858   IncX:=(xmax-xmin)/nbpoints;
1859   IncY:=(ymax-ymin)/nblignes;
1860   color Yc[][],Xc[][],Fc[][];
1861   for ligne=0 upto nblignes:
1862     y:=ymax-ligne*IncY;
1863     x:=xmin;
1864     Yc[ligne][0]=(x,y,Fz(x,y));
1865     for k=1 upto nbpoints:
1866       Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
1867     endfor;
1868   endfor;
1869   for k=(nblignes-1) downto 0:
1870     for l=(nbpoints-3) step -3 until 0: 
1871       cpt[apj]:=apj;
1872       OTFc.@[apj].nb:=4;
1873       OTFc.@[apj][1]:=Yc[k][l];
1874       OTFc.@[apj][2]:=Yc[k+1][l];
1875       OTFc.@[apj][3]:=Yc[k+1][l+3];
1876       OTFc.@[apj][4]:=Yc[k][l+3];
1877       OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
1878       ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
1879       if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
1880         Vue.@[apj]:=true;coul.@[apj]:=outcolor;
1881       else:
1882         Vue.@[apj]:=false;coul.@[apj]:=incolor;
1883       fi;
1884       apj:=apj+1;
1885     endfor;
1886   endfor;
1887   apj.@:=apj-1;
1888 enddef;
1889
1890 vardef GrilleSurfZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)=
1891   drawoptions(withcolor gris);
1892   for k=zmin upto zmax:
1893     draw Projette((-xmin,ymin,k))--Projette((-xmax,ymin,k))--Projette((-xmax,ymax,k));
1894   endfor;
1895   for k=ymin upto ymax:
1896     draw Projette((-xmin,k,zmin))--Projette((-xmax,k,zmin))--Projette((-xmax,k,zmax));
1897   endfor;
1898   for k=xmin upto xmax:
1899     draw Projette((-k,ymax,zmin))--Projette((-k,ymin,zmin))--Projette((-k,ymin,zmax));
1900   endfor;
1901   drawoptions();
1902   if Phi<>90:
1903     for k=zmin step zpas until zmax:
1904       label.lft(""&decimal(zechelle*k)&"",Projette((-xmin,ymin,k)));
1905     endfor;
1906     for k=ymin step ypas until ymax:
1907       label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
1908     endfor;
1909     for k=xmin step xpas until xmax:
1910       label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
1911     endfor;
1912     labeloffset:=8*labeloffset;
1913     label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin)));
1914     label.lft(btex $z$ etex,Projette((-xmin,ymin,(zmin+zmax)/2)));
1915     label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin)));
1916     labeloffset:=labeloffset/8;
1917   else:
1918     for k=ymin step ypas until ymax:
1919       label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
1920     endfor;
1921     for k=xmin step xpas until xmax:
1922       label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
1923     endfor;
1924     labeloffset:=8*labeloffset;
1925     label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin)));
1926     label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin)));
1927     labeloffset:=labeloffset/8;
1928   fi;
1929 enddef;
1930
1931 vardef GrilleSurfZZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)=
1932   drawoptions(withcolor gris);
1933   for k=zmin upto zmax:
1934     draw Projette((xmin,ymin,k))--Projette((xmin,ymax,k))--Projette((xmax,ymax,k));
1935   endfor;
1936   for k=ymin upto ymax:
1937     draw Projette((xmax,k,zmin))--Projette((xmin,k,zmin))--Projette((xmin,k,zmax));
1938   endfor;
1939   for k=xmin upto xmax:
1940     draw Projette((k,ymin,zmin))--Projette((k,ymax,zmin))--Projette((k,ymax,zmax));
1941   endfor;
1942   drawoptions();
1943   if Phi<>90:
1944     for k=zmin step zpas until zmax:
1945       label.lft(""&decimal(zechelle*k)&"",Projette((xmin,ymin,k)));
1946     endfor;
1947     for k=ymin step ypas until ymax:
1948       label.rt(""&decimal(k)&"",Projette((xmax,k,zmin)));
1949     endfor;
1950     for k=xmin step xpas until xmax:
1951       label.bot(""&decimal(k)&"",Projette((k,ymin,zmin)));
1952     endfor;
1953     labeloffset:=8*labeloffset;
1954     label.rt(btex $y$ etex,Projette((xmax,(ymin+ymax)/2,zmin)));
1955     label.lft(btex $z$ etex,Projette((xmin,ymin,(zmin+zmax)/2)));
1956     label.bot(btex $x$ etex,Projette(((xmin+xmax)/2,ymin,zmin)));
1957     labeloffset:=labeloffset/8;
1958   else:
1959     for k=ymin step ypas until ymax:
1960       label.bot(""&decimal(k)&"",Projette((xmin,k,zmin)));
1961     endfor;
1962     for k=xmin step xpas until xmax:
1963       label.rt(""&decimal(k)&"",Projette((k,ymax,zmin)));
1964     endfor;
1965     labeloffset:=8*labeloffset;
1966     label.bot(btex $y$ etex,Projette((xmin,(ymin+ymax)/2,zmin)));
1967     label.rt(btex $x$ etex,Projette(((xmin+xmax)/2,ymax,zmin)));
1968     labeloffset:=labeloffset/8;
1969   fi;
1970 enddef;
1971
1972 vardef Legende(expr xmax,ymax,nbplan,zechelle)=
1973   path legende[];
1974   for k=1 upto nbplan+1:
1975     legende[k]=Projette((-xmax,ymax+1,k-0.5))--Projette((-xmax,ymax+1,k))--Projette((-xmax,ymax+2,k))--Projette((-xmax,ymax+2,k-0.5))--cycle;
1976   endfor;
1977   for k=1 upto nbplan+1:
1978     fill legende[k] withcolor Outcolor[k];
1979     draw legende[k];
1980     label.rt(""&decimal(zechelle*(k-1))&" - "&decimal(zechelle*k)&"",Projette((-xmax,ymax+2,k-0.25)));
1981   endfor;
1982 enddef;
1983
1984 vardef MaillageZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
1985   traits:=true;
1986   scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
1987   IncX:=(xmax-xmin)/nbpoints;
1988   IncY:=(ymax-ymin)/nblignes;
1989   color Yc[][],Xc[][];
1990   for ligne=0 upto nblignes:
1991     y:=ymax-ligne*IncY;
1992     x:=xmin;
1993     Yc[ligne][0]=(x,y,Fz(x,y));
1994     for k=1 upto nbpoints:
1995       Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
1996     endfor;
1997   endfor;
1998   for l=0 upto nbpoints:
1999     x:=xmax-l*IncX;
2000     y:=ymin;
2001     Xc[l][0]:=(x,y,Fz(x,y));
2002     for k=1 upto nblignes:
2003       Xc[l][k]=(x,ymin+k*IncY,Fz(x,ymin+k*IncY));
2004     endfor;
2005   endfor;
2006   for k=nblignes downto 0:
2007     draw Projette(Yc[k][nbpoints])
2008     for l=(nbpoints-1) downto 0:
2009       ..Projette(Yc[k][l])
2010     endfor;
2011   endfor;
2012   for l=nbpoints downto 0:
2013     draw Projette(Xc[l][nblignes])
2014     for k=nblignes-1 downto 0:
2015       ..Projette(Xc[l][k])
2016     endfor;
2017   endfor;
2018 enddef;
2019
2020 endinput;

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.