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;
259 %add by cp 22/08/2011
261 draw for l=1 upto Fc[cpt[k]].nb:
262 Projette(Fc[cpt[k]][l])--
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;
273 vardef Objettore[](expr Rn,rn)=
274 Outcolor.@:=outcolor;
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;
287 %On crée les facettes et on calcule la profondeur en Z.
289 for l=0 upto (subh-1):
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;
301 Vue.@[apj]:=false;coul.@[apj]:=incolor;
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;
312 scantokens("vardef F(expr t)="&Fn&" enddef;");
313 scantokens("vardef Fp(expr t)="&dp&" enddef;");
317 %pour gérer le "flip" aux points d'inflexion
319 VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
324 G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
332 OTFc.@[apj].nb:=nbsp;
334 OTFc.@[apj][k]:=Image(G[0][nbsp+1-k]);
336 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
339 OTFc.@[apj].nb:=nbsp;
341 OTFc.@[apj][k]:=Image(G[NB][k]);
343 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
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;
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;
366 Vue.@[k]:=false;coul.@[k]:=incolor;
372 vardef ObjetCylindre[](expr fn,umin,umax,vmin,vmax)=
373 Outcolor.@:=outcolor;
375 scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
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:
382 for l=0 upto (subh-1):
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;
394 Vue.@[apj]:=false;coul.@[apj]:=incolor;
402 vardef Objetcylindre[](expr rn,hn)=
403 Outcolor.@:=outcolor;
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;
415 OTFc.@[apj].nb:=nbsp;
417 OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
419 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
422 OTFc.@[apj].nb:=nbsp;
424 OTFc.@[apj][k]:=Image(Famille(umin+(nbsp-k)*upas,vmax));
426 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
431 %On crée les facettes et on calcule la profondeur en Z.
433 for l=0 upto (subh-1):
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;
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;
450 Vue.@[k]:=false;coul.@[k]:=incolor;
456 vardef ObjetCone[](expr fn,umin,umax,zbas,orign)=
457 Outcolor.@:=outcolor;
459 scantokens("vardef Famille(expr u)="&fn&" enddef;");
460 scantokens("color "&substring(0,4) of orign&"; "&orign&";");
462 upas:=(umax-umin)/nb;vpas:=2*abs(zbas)/subh;
463 %On crée les facettes et on calcule la profondeur en Z.
465 for l=0 upto (2*subh-1):
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;
477 Vue.@[apj]:=false;coul.@[apj]:=incolor;
487 vardef Objetcone[](expr rn,hn)=
488 Outcolor.@:=outcolor;
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;
501 OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
503 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
508 %On crée les facettes et on calcule la profondeur en Z.
510 for l=0 upto (subh-1):
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;
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;
527 Vue.@[k]:=false;coul.@[k]:=incolor;
533 vardef Objettronccone[](expr rn,hn,Hn)=
534 Outcolor.@:=outcolor;
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;
548 OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
550 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
555 OTFc.@[apj][nb-k]:=Image(Famille(umin+k*upas,vmax));
557 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
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):
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;
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;
581 Vue.@[k]:=false;coul.@[k]:=incolor;
587 vardef Objetsphere[](expr Rn)=
588 Outcolor.@:=outcolor;
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;
596 %On crée les facettes et on calcule la profondeur en Z.
598 for l=0 upto (subh-1):
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;
610 Vue.@[apj]:=false;coul.@[apj]:=incolor;
618 vardef Objetcalotte[](expr Rn,Phib,Phih)=
619 Outcolor.@:=outcolor;
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;
632 OTFc.@[apj].nb:=nbsp;
634 OTFc.@[apj][l]:=Image(Famille(umin,vmax-l*vpas));
636 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
639 OTFc.@[apj].nb:=subh;
641 OTFc.@[apj][l]:=Image(Famille(umax,vmin+l*vpas));
643 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
648 %On crée les facettes et on calcule la profondeur en Z.
649 %for k=umin step upas until umax-upas:
651 for l=0 upto (subh-1):
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;
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;
668 Vue.@[k]:=false;coul.@[k]:=incolor;
674 vardef Objetanneau[](expr Rn,rn,hn)=
675 Outcolor.@:=outcolor;
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&";");
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;
687 %On crée les facettes et on calcule la profondeur en Z.
689 for l=0 upto (subh-1):
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;
701 Vue.@[apj]:=false;coul.@[apj]:=incolor;
709 vardef ObjetAnneau[](expr nbpn,sectionanneau)=
710 Outcolor.@:=outcolor;
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;
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):
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;
731 Vue.@[apj]:=false;coul.@[apj]:=incolor;
739 vardef ObjetPrisme[](expr axen,hn)(text tn)=%pb avec certaines positions de l'observateur.->maillage vertical
740 Outcolor.@:=outcolor;
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
753 OTFc.@[apj].nb:=nbsn;
755 OTFc.@[apj][k]:=Image(Sommet[nbsn-k]);
757 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
760 OTFc.@[apj].nb:=nbsn;
762 OTFc.@[apj][k]:=Image(Sommet[k-1]+h*axe);
764 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
770 for l=0 upto (subh-1):
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;
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;
789 Vue.@[k]:=false;coul.@[k]:=incolor;
795 vardef Objetcube[](expr ar)=
796 Outcolor.@:=outcolor;
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);
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;
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;
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;
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;
851 Vue.@[k]:=false;coul.@[k]:=incolor;
857 vardef Objetpave[](expr Lln,Hhn,Ppn)=
858 Outcolor.@:=outcolor;
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&";");
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);
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;
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;
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;
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;
916 Vue.@[k]:=false;coul.@[k]:=incolor;
922 vardef Objetgrille[](expr amn,ann,bmn,bnn)=
923 Outcolor.@:=outcolor;
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&";");
934 for l=0 upto (subh-1):
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;
946 Vue.@[apj]:=false;coul.@[apj]:=incolor;
954 vardef ObjetRuban[](expr hn)(text tn)=
955 Outcolor.@:=outcolor;
957 scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
958 nbsn:=0;%nb sommets total pour la base
965 for k=1 upto (nbsn-1):
966 for l=0 upto (subh-1):
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;
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;
983 Vue.@[k]:=false;coul.@[k]:=incolor;
989 vardef ObjetBiface[](text tn)=
990 Outcolor.@:=outcolor;
992 nbsn:=0;%nb sommets total pour la base
1000 OTFc.@[apj].nb:=nbsn;
1002 OTFc.@[apj][k]:=Image(Sommet[nbsn+1-k]);
1004 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
1007 OTFc.@[apj].nb:=nbsn;
1009 OTFc.@[apj][k]:=Image(Sommet[k]);
1011 OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
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;
1017 Vue.@[k]:=false;coul.@[k]:=incolor;
1026 vardef Objetplan[](expr Ann,Bnn,Cnn)=%à modifier mais pour l'instant ça marche pour les intersections;
1027 Outcolor.@:=outcolor;
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&";");
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):
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;
1052 Vue.@[apj]:=false;coul.@[apj]:=incolor;
1060 vardef Objettetraedre[](expr ar)=
1061 Outcolor.@:=outcolor;
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);
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;
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;
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;
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;
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;
1098 Vue.@[k]:=false;coul.@[k]:=incolor;
1104 vardef Objetoctaedre[](expr ar)=
1105 Outcolor.@:=outcolor;
1107 if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
1108 scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
1110 ObjetNew.@((0,0,-a),(-AA,-AA,0),(AA,-AA,0),(AA,AA,0),(-AA,AA,0),(0,0,a))(%
1122 vardef Objeticosaedre[](expr ar)=
1123 Outcolor.@:=outcolor;
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;
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))(%
1155 vardef Objetdodecaedre[](expr ar)=
1156 Outcolor.@:=outcolor;
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;
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))(%
1185 vardef ObjetNew[](text listesommets)(text listefaces)=
1186 Outcolor.@:=outcolor;
1190 mini:=min(listefaces);
1192 for _p=listesommets:
1197 for _p=listesommets:
1203 j:=0;%pour compter le nombre de sommets à conserver
1211 if k<>OTFc.@[apj].nb:
1212 OTFc.@[apj][k]:=Image(Sommet[p_]);
1214 OTFc.@[apj][k]:=Image(Sommet[p_]);
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;
1227 Vue.@[k]:=false;coul.@[k]:=incolor;
1233 %Objet lecture externe
1235 vardef ObjetOFF[](expr nomfichier)=
1236 Outcolor.@:=outcolor;
1240 s_=readfrom nomfichier;
1244 t_ := if ss1="%": 0 else: 1 fi;
1246 ss[incr t_] := loptok s_;
1251 NbS:=round(Mexp Mlog_str ss1);
1252 NF:=round(Mexp Mlog_str ss2);
1253 s_:=readfrom nomfichier;
1256 s_:=readfrom nomfichier;
1259 n_ := if ss1="%": 0 else: 1 fi;
1261 ss[incr n_] := loptok s_;
1266 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1270 s_:=readfrom nomfichier;
1273 n_ := if ss1="%": 0 else: 1 fi;
1275 ss[incr n_] := loptok s_;
1280 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1284 for nf=-4000 upto (-4000+NF)-1:
1285 s_:=readfrom nomfichier;
1288 n_ := if ss1="%": 0 else: 1 fi;
1290 ss[incr n_] := loptok s_;
1295 OTFc.@[apj].nb:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
1296 for nl=1 upto OTFc.@[apj].nb:
1298 OTFc.@[apj][nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
1300 OTFc.@[apj][OTFc.@[apj].nb+1-nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
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;
1308 Vue.@[apj]:=false;coul.@[apj]:=incolor;
1313 closefrom nomfichier;
1316 vardef ObjetOBJ[](expr nomfichier)=
1317 Outcolor.@:=outcolor;
1324 s_:=readfrom nomfichier;
1330 ss[incr n_] := loptok s_;
1333 Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
1338 ss[incr n_] := loptok s_;
1341 OTFc.@[apj].nb:=n_-1;
1342 for k=1 upto OTFc.@[apj].nb:
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];
1349 OTFc.@[apj][k] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
1350 %if unknown OTFc.@[apj][k]:
1351 % show OTFc.@[apj][k];
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;
1368 Vue.@[k]:=false;coul.@[k]:=incolor;
1372 closefrom nomfichier;
1376 %%%%%%%Objets travaillés
1378 vardef ObjetEnleve[](text t)=%les numéros des faces sont données par ordre croissant.
1382 %récupérer les numéros des faces.
1385 numface[nface]=_p-(nface-1);%marchait :)
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
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];
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;
1403 Vue.@[apj]:=false;coul.@[apj]:=incolor;
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;
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]);
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_];
1430 Vue.@[apj]:=false;coul.@[apj]:=Incolor[p_];
1441 vardef ObjetFusion[](text t)=
1442 Outcolor.@:=outcolor;
1447 for k=0 upto apj[p_]:
1449 OTFc.@[tapj].nb:=OTFc[p_][k].nb;
1450 for p=1 upto OTFc.@[tapj].nb:
1451 OTFc.@[tapj][p]:=OTFc[p_][k][p];
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];
1463 %les intersections d'objets
1465 vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd)
1468 vd=Normal(bb,cc,dd);
1471 di=-ProduitScalaire(vb,va);
1478 %%denis Roegel----------
1479 vardef IntersectionPlandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
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);
1488 %if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
1489 caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
1494 else: % the line is parallel to the plane
1500 vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
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);
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);
1516 else: % the line is parallel to the plane
1522 vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee)
1523 if Intersectionplandroite(aa,bb,cc,dd,ee):
1529 vardef IPP(expr aa,bb,cc,dd,ee,ff)=
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
1543 %%---------------------
1545 vardef ObjetIntersection[](text t)=%plan n°1 solide n°2
1546 color INTER[][][];%pour avoir les points d'intersection
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);
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]):
1561 INTER[pp_2][k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]);
1564 %%%Pas satisfaisant -> à travailler
1567 draw Projette(INTER[pp_2][k][1])--Projette(INTER[pp_2][k][2]) withpen pencircle scaled2bp withcolor violet;
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;
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
1586 if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)<=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]):
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;
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]);
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;
1607 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1612 tcpt[nbd][apj]:=apj;
1613 if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
1615 for l=1 upto prec.@[k][1]:
1617 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1619 OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
1620 OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
1622 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1624 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1632 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1637 OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
1638 for l=suiv.@[k][1] upto prec.@[k][2]:
1640 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1650 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1656 OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
1657 for l=suiv.@[k][1] upto prec.@[k][2]:
1659 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1669 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1674 for l=1 upto prec.@[k][1]:
1676 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1678 OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
1679 OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
1681 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1683 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1691 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
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:
1706 tcpt[nbd][apj]:=apj;
1707 for l=1 upto prec.@[k][1]-1:
1709 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1712 OTFc[nbd][apj][compt]:=Image(INTER.@[k][1]);
1713 for l=suiv.@[k][1] upto OTFc.@[k].nb:
1715 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1723 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
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]);
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;
1736 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1742 if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)>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]):
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;
1753 %2eme solide sans intersection
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]);
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;
1764 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1770 tcpt[nbd][apj]:=apj;
1771 if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
1773 for l=1 upto prec.@[k][1]:
1775 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
1777 OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
1778 OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
1780 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1782 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1790 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1795 OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
1796 for l=suiv.@[k][1] upto prec.@[k][2]:
1798 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1808 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1814 OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
1815 for l=suiv.@[k][1] upto prec.@[k][2]:
1817 OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
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;
1827 Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
1832 for l=1 upto prec.@[k][1]:
1834 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
1836 OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
1837 OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
1839 for l=suiv.@[k][2] upto OTFc.@[k].nb:
1841 OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
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;
1849 Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
1861 %pour les lignes de niveaux.
1862 vardef ObjetSurfaceZ[](expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
1864 Outcolor.@:=outcolor;
1866 scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
1868 IncX:=(xmax-xmin)/nbpoints;
1869 IncY:=(ymax-ymin)/nblignes;
1870 color Yc[][],Xc[][],Fc[][];
1871 for ligne=0 upto nblignes:
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)));
1879 for k=(nblignes-1) downto 0:
1880 for l=(nbpoints-3) step -3 until 0:
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;
1892 Vue.@[apj]:=false;coul.@[apj]:=incolor;
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));
1905 for k=ymin upto ymax:
1906 draw Projette((-xmin,k,zmin))--Projette((-xmax,k,zmin))--Projette((-xmax,k,zmax));
1908 for k=xmin upto xmax:
1909 draw Projette((-k,ymax,zmin))--Projette((-k,ymin,zmin))--Projette((-k,ymin,zmax));
1913 for k=zmin step zpas until zmax:
1914 label.lft(""&decimal(zechelle*k)&"",Projette((-xmin,ymin,k)));
1916 for k=ymin step ypas until ymax:
1917 label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
1919 for k=xmin step xpas until xmax:
1920 label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
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;
1928 for k=ymin step ypas until ymax:
1929 label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
1931 for k=xmin step xpas until xmax:
1932 label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
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;
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));
1946 for k=ymin upto ymax:
1947 draw Projette((xmax,k,zmin))--Projette((xmin,k,zmin))--Projette((xmin,k,zmax));
1949 for k=xmin upto xmax:
1950 draw Projette((k,ymin,zmin))--Projette((k,ymax,zmin))--Projette((k,ymax,zmax));
1954 for k=zmin step zpas until zmax:
1955 label.lft(""&decimal(zechelle*k)&"",Projette((xmin,ymin,k)));
1957 for k=ymin step ypas until ymax:
1958 label.rt(""&decimal(k)&"",Projette((xmax,k,zmin)));
1960 for k=xmin step xpas until xmax:
1961 label.bot(""&decimal(k)&"",Projette((k,ymin,zmin)));
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;
1969 for k=ymin step ypas until ymax:
1970 label.bot(""&decimal(k)&"",Projette((xmin,k,zmin)));
1972 for k=xmin step xpas until xmax:
1973 label.rt(""&decimal(k)&"",Projette((k,ymax,zmin)));
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;
1982 vardef Legende(expr xmax,ymax,nbplan,zechelle)=
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;
1987 for k=1 upto nbplan+1:
1988 fill legende[k] withcolor Outcolor[k];
1990 label.rt(""&decimal(zechelle*(k-1))&" - "&decimal(zechelle*k)&"",Projette((-xmax,ymax+2,k-0.25)));
1994 vardef MaillageZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
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:
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)));
2008 for l=0 upto nbpoints:
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));
2016 for k=nblignes downto 0:
2017 draw Projette(Yc[k][nbpoints])
2018 for l=(nbpoints-1) downto 0:
2019 ..Projette(Yc[k][l])
2022 for l=nbpoints downto 0:
2023 draw Projette(Xc[l][nblignes])
2024 for k=nblignes-1 downto 0:
2025 ..Projette(Xc[l][k])