2 %Gestion des couleurs dans l'objet Deplacement.
5 %Manque plusieurs : dans la définition de ObjetNew
8 color OTFc[][][];%pour mémoriser les différents sommets de chaque objet;
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
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
28 vardef Image(expr dep)=
40 vardef AffichageObjet[]=
43 color Fc[][];color cou[];
47 Fc[tapj].nb:=OTFc.@[k].nb;
48 for l=1 upto Fc[tapj].nb:
49 Fc[tapj][l]:=OTFc.@[k][l];
51 Fc[tapj].iso:=OTFc.@[k].iso;
52 cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
62 fill for l=1 upto Fc[cpt[k]].nb:
63 Projette(Fc[cpt[k]][l])--
65 cycle withcolor abs(lumin(cpt[k]))*cou[cpt[k]];
67 draw for l=1 upto Fc[cpt[k]].nb:
68 Projette(Fc[cpt[k]][l])--
70 cycle dashed evenly withpen pencircle scaled0.25bp;
76 transparence for l=1 upto Fc[cpt[k]].nb:
77 Projette(Fc[cpt[k]][l])--
81 draw for l=1 upto Fc[cpt[k]].nb:
82 Projette(Fc[cpt[k]][l])--
84 cycle withpen pencircle scaled0.25bp;
92 fill for l=1 upto Fc[cpt[k]].nb:
93 Projette(Fc[cpt[k]][l])--
97 lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
99 lumin(cpt[k])*cou[cpt[k]]
102 draw for l=1 upto Fc[cpt[k]].nb:
103 Projette(Fc[cpt[k]][l])--
105 cycle withpen pencircle scaled0.25bp;
108 draw for l=1 upto Fc[cpt[k]].nb:
109 Projette(Fc[cpt[k]][l])--
113 lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
115 lumin(cpt[k])*cou[cpt[k]]
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])--
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;
131 draw for l=1 upto Fc[cpt[k]].nb:
132 Projette(Fc[cpt[k]][l])--
134 cycle withpen pencircle scaled0.25bp;
135 %add by cp 01/08/2011
137 draw for l=1 upto Fc[cpt[k]].nb:
138 Projette(Fc[cpt[k]][l])--
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;
149 if numeroteface=true:
152 label(""&decimal(k)&"",Projette(Fc[k].iso));
159 vardef AffichageObjetold[]=
162 color Fc[][];color cou[];
166 Fc[tapj].nb:=OTFc.@[k].nb;
167 for l=1 upto Fc[tapj].nb:
168 Fc[tapj][l]:=OTFc.@[k][l];
170 Fc[tapj].iso:=OTFc.@[k].iso;
171 cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
181 fill for l=1 upto Fc[cpt[k]].nb:
182 Projette(Fc[cpt[k]][l])--
186 lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
188 lumin(cpt[k])*cou[cpt[k]]
190 draw for l=1 upto Fc[cpt[k]].nb:
191 Projette(Fc[cpt[k]][l])--
193 cycle withpen pencircle scaled0.25bp;
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])--
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])--
208 cycle withpen pencircle scaled0.25bp;
211 if numeroteface=true:
214 label(""&decimal(k)&"",Projette(Fc[k].iso));
220 vardef DessineFusion=
224 color Fc[][];color cou[];
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];
233 Fc[tapj].iso:=OTFc[l][k].iso;
234 ALT[tapj]:=ALT[l][k];
235 Vue[tapj]:=Vue[l][k];
247 fill for l=1 upto Fc[cpt[k]].nb:
248 Projette(Fc[cpt[k]][l])--
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;
255 draw for l=1 upto Fc[cpt[k]].nb:
256 Projette(Fc[cpt[k]][l])--
258 cycle withpen pencircle scaled0.25bp;
263 vardef Objettore[](expr Rn,rn)=
264 Outcolor.@:=outcolor;
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;
277 %On crée les facettes et on calcule la profondeur en Z.
279 for l=0 upto (subh-1):
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;
291 Vue.@[apj]:=false;coul.@[apj]:=incolor;
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;
302 scantokens("vardef F(expr t)="&Fn&" enddef;");
303 scantokens("vardef Fp(expr t)="&dp&" enddef;");
307 %pour gérer le "flip" aux points d'inflexion
309 VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
314 G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
322 OTFc.@[apj].nb:=nbsp;
324 OTFc.@[apj][k]:=Image(G[0][nbsp+1-k]);
326 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
329 OTFc.@[apj].nb:=nbsp;
331 OTFc.@[apj][k]:=Image(G[NB][k]);
333 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
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;
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;
356 Vue.@[k]:=false;coul.@[k]:=incolor;
362 vardef ObjetCylindre[](expr fn,umin,umax,vmin,vmax)=
363 Outcolor.@:=outcolor;
365 scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
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:
372 for l=0 upto (subh-1):
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;
384 Vue.@[apj]:=false;coul.@[apj]:=incolor;
392 vardef Objetcylindre[](expr rn,hn)=
393 Outcolor.@:=outcolor;
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;
405 OTFc.@[apj].nb:=nbsp;
407 OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
409 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
412 OTFc.@[apj].nb:=nbsp;
414 OTFc.@[apj][k]:=Image(Famille(umin+(nbsp-k)*upas,vmax));
416 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
421 %On crée les facettes et on calcule la profondeur en Z.
423 for l=0 upto (subh-1):
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;
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;
440 Vue.@[k]:=false;coul.@[k]:=incolor;
446 vardef ObjetCone[](expr fn,umin,umax,zbas,orign)=
447 Outcolor.@:=outcolor;
449 scantokens("vardef Famille(expr u)="&fn&" enddef;");
450 scantokens("color "&substring(0,4) of orign&"; "&orign&";");
452 upas:=(umax-umin)/nb;vpas:=2*abs(zbas)/subh;
453 %On crée les facettes et on calcule la profondeur en Z.
455 for l=0 upto (2*subh-1):
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;
467 Vue.@[apj]:=false;coul.@[apj]:=incolor;
477 vardef Objetcone[](expr rn,hn)=
478 Outcolor.@:=outcolor;
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;
491 OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
493 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
498 %On crée les facettes et on calcule la profondeur en Z.
500 for l=0 upto (subh-1):
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;
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;
517 Vue.@[k]:=false;coul.@[k]:=incolor;
523 vardef Objettronccone[](expr rn,hn,Hn)=
524 Outcolor.@:=outcolor;
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;
538 OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
540 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
545 OTFc.@[apj][nb-k]:=Image(Famille(umin+k*upas,vmax));
547 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
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):
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;
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;
571 Vue.@[k]:=false;coul.@[k]:=incolor;
577 vardef Objetsphere[](expr Rn)=
578 Outcolor.@:=outcolor;
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;
586 %On crée les facettes et on calcule la profondeur en Z.
588 for l=0 upto (subh-1):
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;
600 Vue.@[apj]:=false;coul.@[apj]:=incolor;
608 vardef Objetcalotte[](expr Rn,Phib,Phih)=
609 Outcolor.@:=outcolor;
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;
622 OTFc.@[apj].nb:=nbsp;
624 OTFc.@[apj][l]:=Image(Famille(umin,vmax-l*vpas));
626 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
629 OTFc.@[apj].nb:=subh;
631 OTFc.@[apj][l]:=Image(Famille(umax,vmin+l*vpas));
633 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
638 %On crée les facettes et on calcule la profondeur en Z.
639 %for k=umin step upas until umax-upas:
641 for l=0 upto (subh-1):
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;
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;
658 Vue.@[k]:=false;coul.@[k]:=incolor;
664 vardef Objetanneau[](expr Rn,rn,hn)=
665 Outcolor.@:=outcolor;
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&";");
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;
677 %On crée les facettes et on calcule la profondeur en Z.
679 for l=0 upto (subh-1):
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;
691 Vue.@[apj]:=false;coul.@[apj]:=incolor;
699 vardef ObjetAnneau[](expr nbpn,sectionanneau)=
700 Outcolor.@:=outcolor;
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;
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):
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;
721 Vue.@[apj]:=false;coul.@[apj]:=incolor;
729 vardef ObjetPrisme[](expr axen,hn)(text tn)=%pb avec certaines positions de l'observateur.->maillage vertical
730 Outcolor.@:=outcolor;
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
743 OTFc.@[apj].nb:=nbsn;
745 OTFc.@[apj][k]:=Image(Sommet[nbsn-k]);
747 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
750 OTFc.@[apj].nb:=nbsn;
752 OTFc.@[apj][k]:=Image(Sommet[k-1]+h*axe);
754 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
760 for l=0 upto (subh-1):
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;
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;
779 Vue.@[k]:=false;coul.@[k]:=incolor;
785 vardef Objetcube[](expr ar)=
786 Outcolor.@:=outcolor;
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);
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;
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;
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;
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;
841 Vue.@[k]:=false;coul.@[k]:=incolor;
847 vardef Objetpave[](expr Lln,Hhn,Ppn)=
848 Outcolor.@:=outcolor;
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&";");
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);
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;
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;
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;
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;
906 Vue.@[k]:=false;coul.@[k]:=incolor;
912 vardef Objetgrille[](expr amn,ann,bmn,bnn)=
913 Outcolor.@:=outcolor;
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&";");
924 for l=0 upto (subh-1):
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;
936 Vue.@[apj]:=false;coul.@[apj]:=incolor;
944 vardef ObjetRuban[](expr hn)(text tn)=
945 Outcolor.@:=outcolor;
947 scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
948 nbsn:=0;%nb sommets total pour la base
955 for k=1 upto (nbsn-1):
956 for l=0 upto (subh-1):
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;
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;
973 Vue.@[k]:=false;coul.@[k]:=incolor;
979 vardef ObjetBiface[](text tn)=
980 Outcolor.@:=outcolor;
982 nbsn:=0;%nb sommets total pour la base
990 OTFc.@[apj].nb:=nbsn;
992 OTFc.@[apj][k]:=Image(Sommet[nbsn+1-k]);
994 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
997 OTFc.@[apj].nb:=nbsn;
999 OTFc.@[apj][k]:=Image(Sommet[k]);
1001 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
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;
1007 Vue.@[k]:=false;coul.@[k]:=incolor;
1016 vardef Objetplan[](expr Ann,Bnn,Cnn)=%à modifier mais pour l'instant ça marche pour les intersections;
1017 Outcolor.@:=outcolor;
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&";");
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):
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;
1042 Vue.@[apj]:=false;coul.@[apj]:=incolor;
1050 vardef Objettetraedre[](expr ar)=
1051 Outcolor.@:=outcolor;
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);
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;
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;
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;
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;
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;
1088 Vue.@[k]:=false;coul.@[k]:=incolor;
1094 vardef Objetoctaedre[](expr ar)=
1095 Outcolor.@:=outcolor;
1097 if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
1098 scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
1100 ObjetNew.@((0,0,-a),(-AA,-AA,0),(AA,-AA,0),(AA,AA,0),(-AA,AA,0),(0,0,a))(%
1112 vardef Objeticosaedre[](expr ar)=
1113 Outcolor.@:=outcolor;
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;
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))(%
1145 vardef Objetdodecaedre[](expr ar)=
1146 Outcolor.@:=outcolor;
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;
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))(%
1175 vardef ObjetNew[](text listesommets)(text listefaces)=
1176 Outcolor.@:=outcolor;
1180 mini:=min(listefaces);
1182 for _p=listesommets:
1187 for _p=listesommets:
1193 j:=0;%pour compter le nombre de sommets à conserver
1201 if k<>OTFc.@[apj].nb:
1202 OTFc.@[apj][k]:=Image(Sommet[p_]);
1204 OTFc.@[apj][k]:=Image(Sommet[p_]);
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;
1217 Vue.@[k]:=false;coul.@[k]:=incolor;
1223 %Objet lecture externe
1225 vardef ObjetOFF[](expr nomfichier)=
1226 Outcolor.@:=outcolor;
1230 s_=readfrom nomfichier;
1234 t_ := if ss1="%": 0 else: 1 fi;
1236 ss[incr t_] := loptok s_;
1241 NbS:=round(Mexp Mlog_str ss1);
1242 NF:=round(Mexp Mlog_str ss2);
1243 s_:=readfrom nomfichier;
1246 s_:=readfrom nomfichier;
1249 n_ := if ss1="%": 0 else: 1 fi;
1251 ss[incr n_] := loptok s_;
1256 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1260 s_:=readfrom nomfichier;
1263 n_ := if ss1="%": 0 else: 1 fi;
1265 ss[incr n_] := loptok s_;
1270 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1274 for nf=-4000 upto (-4000+NF)-1:
1275 s_:=readfrom nomfichier;
1278 n_ := if ss1="%": 0 else: 1 fi;
1280 ss[incr n_] := loptok s_;
1285 OTFc.@[apj].nb:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
1286 for nl=1 upto OTFc.@[apj].nb:
1288 OTFc.@[apj][nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
1290 OTFc.@[apj][OTFc.@[apj].nb+1-nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
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;
1298 Vue.@[apj]:=false;coul.@[apj]:=incolor;
1303 closefrom nomfichier;
1306 vardef ObjetOBJ[](expr nomfichier)=
1307 Outcolor.@:=outcolor;
1314 s_:=readfrom nomfichier;
1320 ss[incr n_] := loptok s_;
1323 Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1328 ss[incr n_] := loptok s_;
1331 OTFc.@[apj].nb:=n_-1;
1332 for k=1 upto OTFc.@[apj].nb:
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];
1339 OTFc.@[apj][k] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
1340 %if unknown OTFc.@[apj][k]:
1341 % show OTFc.@[apj][k];
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;
1358 Vue.@[k]:=false;coul.@[k]:=incolor;
1362 closefrom nomfichier;
1366 %%%%%%%Objets travaillés
1368 vardef ObjetEnleve[](text t)=%les numéros des faces sont données par ordre croissant.
1372 %récupérer les numéros des faces.
1375 numface[nface]=_p-(nface-1);%marchait :)
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
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];
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;
1393 Vue.@[apj]:=false;coul.@[apj]:=incolor;
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;
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]);
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_];
1420 Vue.@[apj]:=false;coul.@[apj]:=Incolor[p_];
1431 vardef ObjetFusion[](text t)=
1432 Outcolor.@:=outcolor;
1437 for k=0 upto apj[p_]:
1439 OTFc.@[tapj].nb:=OTFc[p_][k].nb;
1440 for p=1 upto OTFc.@[tapj].nb:
1441 OTFc.@[tapj][p]:=OTFc[p_][k][p];
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];
1453 %les intersections d'objets
1455 vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd)
1458 vd=Normal(bb,cc,dd);
1461 di=-ProduitScalaire(vb,va);
1468 %%denis Roegel----------
1469 vardef IntersectionPlandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
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);
1478 %if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
1479 caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
1484 else: % the line is parallel to the plane
1490 vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
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);
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);
1506 else: % the line is parallel to the plane
1512 vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee)
1513 if Intersectionplandroite(aa,bb,cc,dd,ee):
1519 vardef IPP(expr aa,bb,cc,dd,ee,ff)=
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
1533 %%---------------------
1535 vardef ObjetIntersection[](text t)=%plan n°1 solide n°2
1536 color INTER[][][];%pour avoir les points d'intersection
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);
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]):
1551 INTER[pp_2][k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]);
1554 %%%Pas satisfaisant -> à travailler
1557 draw Projette(INTER[pp_2][k][1])--Projette(INTER[pp_2][k][2]) withpen pencircle scaled2bp withcolor violet;
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;
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
1576 if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)<=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]):
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;
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]);
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;
1597 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1602 tcpt[nbd][apj]:=apj;
1603 if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
1605 for l=1 upto prec.@[k][1]:
1607 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1609 OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
1610 OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
1612 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1614 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1622 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1627 OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
1628 for l=suiv.@[k][1] upto prec.@[k][2]:
1630 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1640 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1646 OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
1647 for l=suiv.@[k][1] upto prec.@[k][2]:
1649 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1659 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1664 for l=1 upto prec.@[k][1]:
1666 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1668 OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
1669 OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
1671 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1673 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1681 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
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:
1696 tcpt[nbd][apj]:=apj;
1697 for l=1 upto prec.@[k][1]-1:
1699 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1702 OTFc[nbd][apj][compt]:=Image(INTER.@[k][1]);
1703 for l=suiv.@[k][1] upto OTFc.@[k].nb:
1705 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1713 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
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]);
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;
1726 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1732 if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)>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]):
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;
1743 %2eme solide sans intersection
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]);
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;
1754 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1760 tcpt[nbd][apj]:=apj;
1761 if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
1763 for l=1 upto prec.@[k][1]:
1765 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1767 OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
1768 OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
1770 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1772 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1780 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1785 OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
1786 for l=suiv.@[k][1] upto prec.@[k][2]:
1788 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1798 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1804 OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
1805 for l=suiv.@[k][1] upto prec.@[k][2]:
1807 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1817 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1822 for l=1 upto prec.@[k][1]:
1824 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1826 OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
1827 OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
1829 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1831 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1839 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1851 %pour les lignes de niveaux.
1852 vardef ObjetSurfaceZ[](expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
1854 Outcolor.@:=outcolor;
1856 scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
1858 IncX:=(xmax-xmin)/nbpoints;
1859 IncY:=(ymax-ymin)/nblignes;
1860 color Yc[][],Xc[][],Fc[][];
1861 for ligne=0 upto nblignes:
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)));
1869 for k=(nblignes-1) downto 0:
1870 for l=(nbpoints-3) step -3 until 0:
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;
1882 Vue.@[apj]:=false;coul.@[apj]:=incolor;
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));
1895 for k=ymin upto ymax:
1896 draw Projette((-xmin,k,zmin))--Projette((-xmax,k,zmin))--Projette((-xmax,k,zmax));
1898 for k=xmin upto xmax:
1899 draw Projette((-k,ymax,zmin))--Projette((-k,ymin,zmin))--Projette((-k,ymin,zmax));
1903 for k=zmin step zpas until zmax:
1904 label.lft(""&decimal(zechelle*k)&"",Projette((-xmin,ymin,k)));
1906 for k=ymin step ypas until ymax:
1907 label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
1909 for k=xmin step xpas until xmax:
1910 label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
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;
1918 for k=ymin step ypas until ymax:
1919 label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
1921 for k=xmin step xpas until xmax:
1922 label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
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;
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));
1936 for k=ymin upto ymax:
1937 draw Projette((xmax,k,zmin))--Projette((xmin,k,zmin))--Projette((xmin,k,zmax));
1939 for k=xmin upto xmax:
1940 draw Projette((k,ymin,zmin))--Projette((k,ymax,zmin))--Projette((k,ymax,zmax));
1944 for k=zmin step zpas until zmax:
1945 label.lft(""&decimal(zechelle*k)&"",Projette((xmin,ymin,k)));
1947 for k=ymin step ypas until ymax:
1948 label.rt(""&decimal(k)&"",Projette((xmax,k,zmin)));
1950 for k=xmin step xpas until xmax:
1951 label.bot(""&decimal(k)&"",Projette((k,ymin,zmin)));
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;
1959 for k=ymin step ypas until ymax:
1960 label.bot(""&decimal(k)&"",Projette((xmin,k,zmin)));
1962 for k=xmin step xpas until xmax:
1963 label.rt(""&decimal(k)&"",Projette((k,ymax,zmin)));
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;
1972 vardef Legende(expr xmax,ymax,nbplan,zechelle)=
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;
1977 for k=1 upto nbplan+1:
1978 fill legende[k] withcolor Outcolor[k];
1980 label.rt(""&decimal(zechelle*(k-1))&" - "&decimal(zechelle*k)&"",Projette((-xmax,ymax+2,k-0.25)));
1984 vardef MaillageZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
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:
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)));
1998 for l=0 upto nbpoints:
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));
2006 for k=nblignes downto 0:
2007 draw Projette(Yc[k][nbpoints])
2008 for l=(nbpoints-1) downto 0:
2009 ..Projette(Yc[k][l])
2012 for l=nbpoints downto 0:
2013 draw Projette(Xc[l][nblignes])
2014 for k=nblignes-1 downto 0:
2015 ..Projette(Xc[l][k])