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