summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-11-03 20:07:39 +0000
committerKarl Berry <karl@freefriends.org>2022-11-03 20:07:39 +0000
commit654cb3481ea252f3724075fc259cd962633b61e7 (patch)
treec31b498d1a6027b92f5588628cc1add8212a4575 /Master/texmf-dist/metapost
parentf4e2da07d0c309f40d8fe138a30443f66d5636de (diff)
profcollege (3nov22)
git-svn-id: svn://tug.org/texlive/trunk@64918 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r--Master/texmf-dist/metapost/profcollege/PfCObjets.mp2085
-rw-r--r--Master/texmf-dist/metapost/profcollege/PfCPseudo.mp4
-rw-r--r--Master/texmf-dist/metapost/profcollege/PfCScratch.mp85
-rw-r--r--Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp68
-rw-r--r--Master/texmf-dist/metapost/profcollege/PfCSolid.mp991
-rw-r--r--Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp98
6 files changed, 3324 insertions, 7 deletions
diff --git a/Master/texmf-dist/metapost/profcollege/PfCObjets.mp b/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
new file mode 100644
index 00000000000..96daf3d3bc9
--- /dev/null
+++ b/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
@@ -0,0 +1,2085 @@
+%01/08/2011
+%Ajout de l'option trait dans le tracé des surfaces.
+
+%24/01/2011
+%Gestion des couleurs dans l'objet Deplacement.
+
+%27/11/2010
+%Manque plusieurs : dans la définition de ObjetNew
+
+%07/02/2009
+color OTFc[][][];%pour mémoriser les différents sommets de chaque objet;
+color OTFc[][].iso;
+color coul[][];%pour memoriser la couleur de chacune des faces de l'objet;
+color Outcolor[],Incolor[];%Permet de gérer la gestion des couleurs d'un objet lors d'un déplacement de cet objet
+boolean Vue[][];
+
+boolean creux; creux=false;%pour gérer les solides creux
+boolean transformation; transformation=false;%pour gérer les transformations
+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
+boolean perso[];%pour gérer les gestions personnelles des couleurs
+for k=0 upto 100:
+ perso[k]=false;
+endfor;
+boolean numeroteface;
+numeroteface:=false;
+
+string couleurperso;
+
+defaultfont:="cmr5";
+
+vardef Image(expr dep)=
+ if transformation:
+ Transform(dep)
+ else:
+ RotXYZ(dep)
+ fi
+ +TR
+enddef;
+
+boolean Transparence;
+Transparence:=false;
+boolean couleurz;%pour gérer l'affichage "des lignes" de niveaux
+couleurz:=false;
+
+vardef AffichageObjet[]=
+ save _affi;
+ picture _affi;
+ color Fc[][];color cou[];
+ tapj:=0;
+ for k=0 upto apj.@:
+ cpt[tapj]:=tapj;
+ Fc[tapj].nb:=OTFc.@[k].nb;
+ for l=1 upto Fc[tapj].nb:
+ Fc[tapj][l]:=OTFc.@[k][l];
+ endfor;
+ Fc[tapj].iso:=OTFc.@[k].iso;
+ cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
+ ALT[tapj]:=ALT.@[k];
+ Vue[tapj]:=Vue.@[k];
+ tapj:=tapj+1;
+ endfor;
+ tapj:=tapj-1;
+ QS(0,tapj);
+ if Transparence :
+ for k=0 upto tapj:
+ if Vue[cpt[k]]=false:
+ fill for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor abs(lumin(cpt[k]))*cou[cpt[k]];
+ if traits=true:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle dashed evenly withpen pencircle scaled0.25bp;
+ fi;
+ fi;
+ endfor;
+ for k=0 upto tapj:
+ if Vue[cpt[k]]:
+ transparence for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle;
+ if traits=true:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ fi;
+ fi;
+ endfor;
+ else:
+ if Ferme.@:
+ for k=0 upto tapj:
+ if Vue[cpt[k]]=true:
+ fill for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor
+ if couleurz:
+ if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+ else:
+ ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+ fi
+ elseif arcenciel=true:
+ lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:
+ lumin(cpt[k])*cou[cpt[k]]
+ fi;
+ if traits:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ %add by cp 01/08/11
+ else:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor
+ if couleurz:
+ if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+ else:
+ ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+ fi
+ elseif arcenciel=true:
+ lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:
+ lumin(cpt[k])*cou[cpt[k]]
+ fi;
+ %fin add
+ fi;
+ fi;
+ endfor;
+ else:
+ for k=0 upto tapj:%apj downto 1:
+ fill for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if couleurz:
+ if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+ else:
+ ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+ fi
+ elseif arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:lumin(cpt[k])*cou[cpt[k]] fi
+ else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+ if traits:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ %add by cp 01/08/2011
+ else:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:lumin(cpt[k])*cou[cpt[k]] fi
+ else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+ %fin add
+ fi;
+ endfor;
+ fi;
+ fi;
+ if numeroteface=true:
+ for k=0 upto tapj:
+ if Vue[k]:
+ label(""&decimal(k)&"",Projette(Fc[k].iso));
+ fi;
+ endfor;
+ fi;
+enddef;
+
+
+vardef AffichageObjetold[]=
+ save _affi;
+ picture _affi;
+ color Fc[][];color cou[];
+ tapj:=0;
+ for k=0 upto apj.@:
+ cpt[tapj]:=tapj;
+ Fc[tapj].nb:=OTFc.@[k].nb;
+ for l=1 upto Fc[tapj].nb:
+ Fc[tapj][l]:=OTFc.@[k][l];
+ endfor;
+ Fc[tapj].iso:=OTFc.@[k].iso;
+ cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
+ ALT[tapj]:=ALT.@[k];
+ Vue[tapj]:=Vue.@[k];
+ tapj:=tapj+1;
+ endfor;
+ tapj:=tapj-1;
+ QS(0,tapj);
+ if Ferme.@:
+ for k=0 upto tapj:
+ if Vue[cpt[k]]=true:
+ fill for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor
+ if arcenciel=true:
+ lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:
+ lumin(cpt[k])*cou[cpt[k]]
+ fi;
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ fi;
+ endfor;
+ else:
+ for k=0 upto tapj:%apj downto 1:
+ fill for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:lumin(cpt[k])*cou[cpt[k]] fi
+ else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ endfor;
+ fi;
+ if numeroteface=true:
+ for k=0 upto tapj:
+ if Vue[k]:
+ label(""&decimal(k)&"",Projette(Fc[k].iso));
+ fi;
+ endfor;
+ fi;
+enddef;
+
+vardef DessineFusion=
+ save _fusion;
+ picture _fusion;
+ tapj:=0;
+ color Fc[][];color cou[];
+ for l=1 upto nbobj:
+ for k=0 upto apj[l]:
+ cpt[tapj]:=tapj;
+ cou[tapj]:=if perso[l]:scantokens(couleurperso) else: coul[l][k] fi;
+ Fc[tapj].nb:=OTFc[l][k].nb;
+ for p=1 upto Fc[tapj].nb:
+ Fc[tapj][p]:=OTFc[l][k][p];
+ endfor;
+ Fc[tapj].iso:=OTFc[l][k].iso;
+ ALT[tapj]:=ALT[l][k];
+ Vue[tapj]:=Vue[l][k];
+ if Ferme[l]:
+ if Vue[tapj]=false:
+ tapj:=tapj-1;
+ fi;
+ fi;
+ tapj:=tapj+1;
+ endfor;
+ endfor;
+ tapj:=tapj-1;
+ QS(0,tapj);
+ for k=0 upto tapj:
+ fill for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:lumin(cpt[k])*cou[cpt[k]] fi
+ else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+ if traits:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ %add by cp 22/08/2011
+ else:
+ draw for l=1 upto Fc[cpt[k]].nb:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+ else:lumin(cpt[k])*cou[cpt[k]] fi
+ else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+ %fin add
+ fi;
+ endfor;
+enddef;
+
+vardef Objettore[](expr Rn,rn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux:
+ Ferme.@:=false
+ else:
+ Ferme.@:=true;
+ fi;
+ scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+ scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+ vardef Famille(expr u,v)=((R+r*cos(u))*cos(v),(R+r*cos(u))*sin(v),r*sin(u)) enddef;
+ umin:=-pi; umax:=pi; upas:=2*pi/nb;
+ vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+ apj:=0;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetTube[](expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("vardef F(expr t)="&Fn&" enddef;");
+ scantokens("vardef Fp(expr t)="&dp&" enddef;");
+ color G[][];
+ NB:=nbp;%nb de pas
+ nn:=pas;
+ %pour gérer le "flip" aux points d'inflexion
+ color VNbisprec[];
+ VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
+ %
+ ang:=360/nb;
+ for l=0 upto NB:
+ for k=0 upto nb:
+ G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
+ endfor;
+ endfor;
+ apj:=0;
+ if creux=false:
+ Ferme.@:=true;
+ nbsp:=nb;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsp;
+ for k=1 upto nbsp:
+ OTFc.@[apj][k]:=Image(G[0][nbsp+1-k]);
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+ apj:=apj+1;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsp;
+ for k=nbsp downto 1:
+ OTFc.@[apj][k]:=Image(G[NB][k]);
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+ apj:=apj+1;
+ else:
+ Ferme.@:=false;
+ fi;
+ for l=0 upto (NB-1):
+ for k=0 upto nb-1:
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(G[l][k]);
+ OTFc.@[apj][2]:=Image(G[l][k+1]);
+ OTFc.@[apj][3]:=Image(G[l+1][k+1]);
+ OTFc.@[apj][4]:=Image(G[l+1][k]);
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef ObjetCylindre[](expr fn,umin,umax,vmin,vmax)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
+ apj:=0;
+ upas:=(umax-umin)/nb;vpas:=(vmax-vmin)/subh;
+ %On crée les facettes et on calcule la profondeur en Z.
+ %for k=umin step upas until umax:
+ % for l=vmin step vpas until vmax:
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef Objetcylindre[](expr rn,hn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+ scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+ vardef Famille(expr u,v)=(r*cos(u),r*sin(u),v) enddef;
+ umin:=pi; umax:=-pi; upas:=-2*pi/nb;
+ vmin:=0; vmax:=h; vpas:=h/subh;
+ nbsp:=nb;
+ apj:=0;
+ if creux=false:
+ Ferme.@:=true;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsp;
+ for k=1 upto nb:
+ OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+ apj:=apj+1;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsp;
+ for k=1 upto nbsp:
+ OTFc.@[apj][k]:=Image(Famille(umin+(nbsp-k)*upas,vmax));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+ apj:=apj+1;
+ else:
+ Ferme.@:=false;
+ fi;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image((Famille(umin+k*upas,vmin+l*vpas)));
+ OTFc.@[apj][3]:=Image((Famille(umin+k*upas,vmin+(l+1)*vpas)));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef ObjetCone[](expr fn,umin,umax,zbas,orign)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("vardef Famille(expr u)="&fn&" enddef;");
+ scantokens("color "&substring(0,4) of orign&"; "&orign&";");
+ apj:=0;
+ upas:=(umax-umin)/nb;vpas:=2*abs(zbas)/subh;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):
+ for l=0 upto (2*subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas)+(l/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas));
+ OTFc.@[apj][4]:=Image(Famille(umin+k*upas)+(l/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas)+((l+1)/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas));
+ OTFc.@[apj][2]:=Image(Famille(umin+(k+1)*upas)+((l+1)/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+subh:=12;
+
+vardef Objetcone[](expr rn,hn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+ scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+ vardef Famille(expr u,v)=(r*(1-(v/h))*cos(u),r*(1-(v/h))*sin(u),v) enddef;
+ umin:=pi; umax:=-pi; upas:=-2*pi/nb;
+ vmin:=0; vpas:=h/subh; vmax:=h-vpas;
+ apj:=0;
+ Zmin:=0;
+ Zmax:=h;
+ if creux=false:
+ Ferme.@:=true;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nb;
+ for k=0 upto nb:
+ OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
+ apj:=apj+1;
+ else:
+ Ferme.@:=false;
+ fi;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef Objettronccone[](expr rn,hn,Hn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+ scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+ scantokens("numeric "&substring(0,1) of Hn&"; "&Hn&";");
+ vardef Famille(expr u,v)=(r*(1-v/H)*cos(u),r*(1-v/H)*sin(u),v) enddef;
+ umin:=pi; umax:=-pi; upas:=-2*pi/nb;
+ vmin:=0; vpas:=h/subh; vmax:=h;
+ apj:=0;
+ if creux=false:
+ Ferme.@:=true;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nb;
+ for k=0 upto nb:
+ OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
+ apj:=apj+1;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nb;
+ for k=0 upto nb:
+ OTFc.@[apj][nb-k]:=Image(Famille(umin+k*upas,vmax));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
+ apj:=apj+1;
+ else:
+ Ferme.@:=false;
+ fi;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):%umin step upas until umax-upas:
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef Objetsphere[](expr Rn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux:Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+ vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
+ umin:=-pi/2; umax:=pi/2; upas:=pi/nb;
+ vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+ apj:=0;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef Objetcalotte[](expr Rn,Phib,Phih)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+ scantokens("numeric "&substring(0,4) of Phib&"; "&Phib&";");
+ scantokens("numeric "&substring(0,4) of Phih&"; "&Phih&";");
+ vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
+ umin:=phib; umax:=phih; upas:=(phih-phib)/nb;
+ vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+ apj:=0;
+ nbsp:=subh;
+ if creux=false:
+ Ferme.@:=true;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsp;
+ for l=1 upto nbsp:
+ OTFc.@[apj][l]:=Image(Famille(umin,vmax-l*vpas));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+ apj:=apj+1;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=subh;
+ for l=1 upto nbsp:
+ OTFc.@[apj][l]:=Image(Famille(umax,vmin+l*vpas));
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+ apj:=apj+1;
+ else:
+ Ferme.@:=false;
+ fi;
+ %On crée les facettes et on calcule la profondeur en Z.
+ %for k=umin step upas until umax-upas:
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef Objetanneau[](expr Rn,rn,hn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux:Ferme.@:=false else:Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+ scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+ scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+ path sectionanneau;
+ sectionanneau=(R,0)--(R,h)--(r,h)--(r,0)--cycle;
+ 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;
+ umin:=0; umax:=4; upas:=4/nb;
+ vmin:=-pi; vpas:=2*pi/subh; vmax:=2*pi;
+ apj:=0;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetAnneau[](expr nbpn,sectionanneau)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,3) of nbpn&"; "&nbpn&";");
+ 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;
+ umin:=0; umax:=nbp; upas:=1;
+ vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+ apj:=0;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=0 upto (nbp-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+ OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+ OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetPrisme[](expr axen,hn)(text tn)=%pb avec certaines positions de l'observateur.->maillage vertical
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+ scantokens("color "&substring(0,3) of axen&"; "&axen&";");
+ nbsn:=0;%nb sommets total pour la base
+ for _p=tn:
+ Sommet[nbsn]:=_p;
+ nbsn:=nbsn+1;
+ endfor;
+ apj:=0;
+ if creux=false:
+ Ferme.@:=true;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsn;
+ for k=1 upto nbsn:
+ OTFc.@[apj][k]:=Image(Sommet[nbsn-k]);
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+ apj:=apj+1;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsn;
+ for k=1 upto nbsn:
+ OTFc.@[apj][k]:=Image(Sommet[k-1]+h*axe);
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+ apj:=apj+1;
+ else:
+ Ferme.@:=false;
+ fi;
+ for k=1 upto nbsn:
+ for l=0 upto (subh-1):
+ for p=0 upto (nb-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe));
+ OTFc.@[apj][2]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe));
+ OTFc.@[apj][3]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe));
+ OTFc.@[apj][4]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef Objetcube[](expr ar)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+ Sommet1:=(a/2,-a/2,-a/2);
+ Sommet2:=(a/2,a/2,-a/2);
+ Sommet3:=(-a/2,a/2,-a/2);
+ Sommet4:=(-a/2,-a/2,-a/2);
+ Sommet5:=(-a/2,-a/2,a/2);
+ Sommet6:=(a/2,-a/2,a/2);
+ Sommet7:=(a/2,a/2,a/2);
+ Sommet8:=(-a/2,a/2,a/2);
+%%Faces
+ apj:=0;
+ for p=1 upto 4:
+ for l=0 upto (subh-1):
+ for k=0 upto (subh-1):
+ OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ endfor;
+ %face du dessous
+ for l=0 upto (subh-1):
+ for k=0 upto (subh-1):
+ OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ %face du dessus
+ for l=0 upto (subh-1):
+ for k=0 upto (subh-1):
+ OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ OTFc.@[k].nb:=4;
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef Objetpave[](expr Lln,Hhn,Ppn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux=true: Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of Lln&"; "&Lln&";");
+ scantokens("numeric "&substring(0,1) of Hhn&"; "&Hhn&";");
+ scantokens("numeric "&substring(0,1) of Ppn&"; "&Ppn&";");
+ NbS:=8;
+ Sommet1:=(P/2,-L/2,-H/2);
+ Sommet2:=(P/2,L/2,-H/2);
+ Sommet3:=(-P/2,L/2,-H/2);
+ Sommet4:=(-P/2,-L/2,-H/2);
+ Sommet5:=(-P/2,-L/2,H/2);
+ Sommet6:=(P/2,-L/2,H/2);
+ Sommet7:=(P/2,L/2,H/2);
+ Sommet8:=(-P/2,L/2,H/2);
+%%Faces
+ apj:=0;
+ for p=1 upto 4:
+ for l=0 upto (subh-1):
+ for k=0 upto (subh-1):
+ OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ endfor;
+ %face du dessous
+ for l=0 upto (subh-1):
+ for k=0 upto (subh-1):
+ OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ %face du dessus
+ for l=0 upto (subh-1):
+ for k=0 upto (subh-1):
+ OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ OTFc.@[k].nb:=4;
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef Objetgrille[](expr amn,ann,bmn,bnn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ Ferme.@:=false;
+ scantokens("numeric "&substring(0,2) of amn&"; "&amn&";");
+ scantokens("numeric "&substring(0,2) of ann&"; "&ann&";");
+ scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";");
+ scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";");
+ apj:=0;
+ upas:=(an-am)/nb;
+ vpas:=(bn-bm)/subh;
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image((am+k*upas,bm+l*vpas,0));
+ OTFc.@[apj][2]:=Image((am+(k+1)*upas,bm+l*vpas,0));
+ OTFc.@[apj][3]:=Image((am+(k+1)*upas,bm+(l+1)*vpas,0));
+ OTFc.@[apj][4]:=Image((am+k*upas,bm+(l+1)*vpas,0));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetgrilleYZ[](expr amn,ann,bmn,bnn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ Ferme.@:=false;
+ scantokens("numeric "&substring(0,2) of amn&"; "&amn&";");
+ scantokens("numeric "&substring(0,2) of ann&"; "&ann&";");
+ scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";");
+ scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";");
+ apj:=0;
+ upas:=(an-am)/nb;
+ vpas:=(bn-bm)/subh;
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image((0,am+k*upas,bm+l*vpas));
+ OTFc.@[apj][2]:=Image((0,am+(k+1)*upas,bm+l*vpas));
+ OTFc.@[apj][3]:=Image((0,am+(k+1)*upas,bm+(l+1)*vpas));
+ OTFc.@[apj][4]:=Image((0,am+k*upas,bm+(l+1)*vpas));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetRuban[](expr hn)(text tn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+ nbsn:=0;%nb sommets total pour la base
+ for _p=tn:
+ Sommet[nbsn]:=_p;
+ nbsn:=nbsn+1;
+ endfor;
+ Ferme.@:=false;
+ apj:=0;
+ for k=1 upto (nbsn-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image(Sommet[k-1]+(l/subh)*(h*(0,0,1)));
+ OTFc.@[apj][2]:=Image(Sommet[k]+(l/subh)*(h*(0,0,1)));
+ OTFc.@[apj][3]:=Image(Sommet[k]+((l+1)/subh)*(h*(0,0,1)));
+ OTFc.@[apj][4]:=Image(Sommet[k-1]+((l+1)/subh)*(h*(0,0,1)));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+vardef ObjetBiface[](text tn)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ nbsn:=0;%nb sommets total pour la base
+ for _p=tn:
+ nbsn:=nbsn+1;
+ Sommet[nbsn]:=_p;
+ endfor;
+ %Ferme.@:=true;
+ apj:=0;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsn;
+ for k=1 upto nbsn:
+ OTFc.@[apj][k]:=Image(Sommet[nbsn+1-k]);
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+ apj:=apj+1;
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=nbsn;
+ for k=1 upto nbsn:
+ OTFc.@[apj][k]:=Image(Sommet[k]);
+ endfor;
+ OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+ for k=0 upto apj:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+lambda:=3;
+mu:=2;
+
+vardef Objetplan[](expr Ann,Bnn,Cnn)=%à modifier mais pour l'instant ça marche pour les intersections;
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ Ferme.@:=false;
+ color PPP[];
+ scantokens("color "&substring(0,2) of Ann&"; "&Ann&";");
+ scantokens("color "&substring(0,2) of Bnn&"; "&Bnn&";");
+ scantokens("color "&substring(0,2) of Cnn&"; "&Cnn&";");
+ apj:=0;
+ PPP[0]=Image(An-lambda*(Bn-An)-mu*(Cn-An));
+ PPP[1]=Image(An+lambda*(Bn-An)-mu*(Cn-An));
+ PPP[2]=Image(An+lambda*(Bn-An)+mu*(Cn-An));
+ PPP[3]=Image(An-lambda*(Bn-An)+mu*(Cn-An));
+ for k=0 upto (nb-1):
+ for l=0 upto (subh-1):
+ tcpt.@[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Image((k/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0));
+ OTFc.@[apj][2]:=Image(((k+1)/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0));
+ OTFc.@[apj][3]:=Image(((k+1)/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0));
+ OTFc.@[apj][4]:=Image((k/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0));
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef Objettetraedre[](expr ar)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+ Sommet0:=a*(-0.81650,-0.47140,-1/3);
+ Sommet1:=a*(0.81650,-0.471402,-1/3);
+ Sommet2:=a*(0,0.94281,-1/3);
+ Sommet3:=a*(0,0,1);
+ tcpt.@[0]:=0;
+ OTFc.@[0].nb:=3;
+ OTFc.@[0][1]:=Image(Sommet0);
+ OTFc.@[0][2]:=Image(Sommet2);
+ OTFc.@[0][3]:=Image(Sommet1);
+ OTFc.@[0].iso:=(OTFc.@[0][1]+OTFc.@[0][2]+OTFc.@[0][3])/3;
+ tcpt.@[1]:=1;
+ OTFc.@[1].nb:=3;
+ OTFc.@[1][1]:=Image(Sommet0);
+ OTFc.@[1][2]:=Image(Sommet1);
+ OTFc.@[1][3]:=Image(Sommet3);
+ OTFc.@[1].iso:=(OTFc.@[1][1]+OTFc.@[1][2]+OTFc.@[1][3])/3;
+ tcpt.@[2]:=2;
+ OTFc.@[2].nb:=3;
+ OTFc.@[2][1]:=Image(Sommet1);
+ OTFc.@[2][2]:=Image(Sommet2);
+ OTFc.@[2][3]:=Image(Sommet3);
+ OTFc.@[2].iso:=(OTFc.@[2][1]+OTFc.@[2][2]+OTFc.@[2][3])/3;
+ tcpt.@[3]:=3;
+ OTFc.@[3].nb:=3;
+ OTFc.@[3][1]:=Image(Sommet2);
+ OTFc.@[3][2]:=Image(Sommet0);
+ OTFc.@[3][3]:=Image(Sommet3);
+ OTFc.@[3].iso:=(OTFc.@[3][1]+OTFc.@[3][2]+OTFc.@[3][3])/3;
+ for k=0 upto 3:
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=3;
+enddef;
+
+vardef Objetoctaedre[](expr ar)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+ AA=a*sqrt(2)/2;
+ ObjetNew.@((0,0,-a),(-AA,-AA,0),(AA,-AA,0),(AA,AA,0),(-AA,AA,0),(0,0,a))(%
+ 3,0,2,1,%
+ 3,0,3,2,%
+ 3,0,4,3,%
+ 3,0,1,4,%
+ 3,5,1,2,%
+ 3,5,2,3,%
+ 3,5,3,4,%
+ 3,5,4,1%
+ );
+enddef;
+
+vardef Objeticosaedre[](expr ar)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+ aplus=sqrt((5+sqrt(5))/10);
+ amoins=sqrt((5-sqrt(5))/10);
+ bplus=(5+sqrt(5))/10;
+ bmoins=(5-sqrt(5))/10;
+ Cmp=sqrt(5)/5;
+ 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))(%
+ 3,1,5,6,%
+ 3,1,4,5,%
+ 3,1,3,4,%
+ 3,1,2,3,%
+ 3,1,6,2,%
+ 3,7,6,5,%
+ 3,8,5,4,%
+ 3,9,4,3,%
+ 3,10,3,2,%
+ 3,11,2,6,%
+ 3,6,7,11,%
+ 3,5,8,7,%
+ 3,4,9,8,%
+ 3,3,10,9,%
+ 3,2,11,10,%
+ 3,12,10,11,%
+ 3,12,9,10,%
+ 3,12,8,9,%
+ 3,12,7,8,%
+ 3,12,11,7);
+enddef;
+
+vardef Objetdodecaedre[](expr ar)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+ scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+ Ap=a*sqrt((5+2*sqrt(5))/15);
+ Bp=a*sqrt((10+2*sqrt(5))/15);
+ Cp=a*sqrt((5+sqrt(5))/30);
+ Dp=a*(sqrt(15)+sqrt(3))/6;
+ Am=a*sqrt((5-2*sqrt(5))/15);
+ Bm=a*sqrt((10-2*sqrt(5))/15);
+ Cm=a*sqrt((5-sqrt(5))/30);
+ Dm=a*(sqrt(15)-sqrt(3))/6;
+ Ee:=a*sqrt(3)/3;
+ 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))(%
+ 5,5,1,2,3,4,%
+ 5,1,5,10,13,6,%
+ 5,2,1,6,14,7,%
+ 5,3,2,7,15,8,%
+ 5,4,3,8,11,9,%
+ 5,5,4,9,12,10,%
+ 5,6,13,18,19,14,%
+ 5,7,14,19,20,15,%
+ 5,8,15,20,16,11,%
+ 5,9,11,16,17,12,%
+ 5,10,12,17,18,13,%
+ 5,16,20,19,18,17%
+ );
+enddef;
+
+vardef ObjetNew[](text listesommets)(text listefaces)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ color Sommet[];
+ nbs:=0;
+ mini:=min(listefaces);
+ if mini=0:
+ for _p=listesommets:
+ Sommet[nbs]:=_p;
+ nbs:=nbs+1;
+ endfor;
+ elseif mini=1:
+ for _p=listesommets:
+ nbs:=nbs+1;
+ Sommet[nbs]:=_p;
+ endfor;
+ fi;
+ apj:=0;
+ j:=0;%pour compter le nombre de sommets à conserver
+ for p_=listefaces:
+ if j=0:
+ OTFc.@[apj].nb:=p_;
+ j:=1;
+ k:=0;
+ else:
+ k:=k+1;
+ if k<>OTFc.@[apj].nb:
+ OTFc.@[apj][k]:=Image(Sommet[p_]);
+ else:
+ OTFc.@[apj][k]:=Image(Sommet[p_]);
+ j:=0;
+ apj:=apj+1;
+ fi;
+ fi;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb;
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+enddef;
+
+%Objet lecture externe
+
+vardef ObjetOFF[](expr nomfichier)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ OFF:=true;
+ string s_;
+ s_=readfrom nomfichier;
+ string ss[];
+ if s_<>EOF:
+ ss1 := loptok s_;
+ t_ := if ss1="%": 0 else: 1 fi;
+ forever:
+ ss[incr t_] := loptok s_;
+ exitif ss[t_]="";
+ endfor;
+ %else: false
+ show ss1;
+ fi;
+% NbS:=round(Mexp Mlog_str ss1);
+% NF:=round(Mexp Mlog_str ss2);
+% s_:=readfrom nomfichier;
+% if debut=0:
+% for k=0 upto NbS-1:
+% s_:=readfrom nomfichier;
+% if s_<>EOF:
+% ss1 := loptok s_;
+% n_ := if ss1="%": 0 else: 1 fi;
+% forever:
+% ss[incr n_] := loptok s_;
+% exitif ss[n_]="";
+% endfor
+% else: false
+% fi;
+% Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+% endfor;
+% else:
+% for k=1 upto NbS:
+% s_:=readfrom nomfichier;
+% if s_<>EOF:
+% ss1 := loptok s_;
+% n_ := if ss1="%": 0 else: 1 fi;
+% forever:
+% ss[incr n_] := loptok s_;
+% exitif ss[n_]="";
+% endfor
+% else: false
+% fi;
+% Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+% endfor;
+% fi;
+% apj:=0;
+% for nf=-4000 upto (-4000+NF)-1:
+% s_:=readfrom nomfichier;
+% if s_<>EOF:
+% ss1 := loptok s_;
+% n_ := if ss1="%": 0 else: 1 fi;
+% forever:
+% ss[incr n_] := loptok s_;
+% exitif ss[n_]="";
+% endfor
+% else: false
+% fi;
+% OTFc.@[apj].nb:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
+% for nl=1 upto OTFc.@[apj].nb:
+% if invnormale=1:
+% OTFc.@[apj][nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
+% else:
+% OTFc.@[apj][OTFc.@[apj].nb+1-nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
+ % fi;
+ % endfor;
+ % OTFc.@[apj].iso:=(OTFc.@[apj][1] for l=2 upto OTFc.@[apj].nb:+OTFc.@[apj][l] endfor)/OTFc.@[apj].nb;
+ % ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ % if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ % Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ % else:
+ % Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ % fi;
+ % apj:=apj+1;
+ %endfor;
+ %apj.@:=apj-1;
+ closefrom nomfichier;
+enddef;
+
+vardef ObjetOBJ[](expr nomfichier)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ string s_;
+ string ss[];
+ nbss:=1;
+ apj:=0;
+ forever:
+ s_:=readfrom nomfichier;
+ if s_<>EOF:
+ ss0 := loptok s_;
+ if ss0="v":
+ n_:=0;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor
+ Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+ nbss:=incr nbss;
+ elseif ss0="f":
+ n_:=0;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor;
+ OTFc.@[apj].nb:=n_-1;
+ for k=1 upto OTFc.@[apj].nb:
+ if invnormale=1:
+ OTFc.@[apj][OTFc.@[apj].nb-k+1] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
+ %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
+ % show OTFc.@[apj][OTFc.@[apj].nb-k+1];
+ %fi;
+ else:
+ OTFc.@[apj][k] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
+ %if unknown OTFc.@[apj][k]:
+ % show OTFc.@[apj][k];
+ %fi;
+ fi;
+
+ endfor;
+ apj:=apj+1;
+ fi;
+ fi;
+ exitif s_=EOF;
+ endfor;
+ apj:=apj-1;
+ for k=0 upto apj:
+ OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb;
+ ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+ if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+ Vue.@[k]:=true;coul.@[k]:=outcolor;
+ else:
+ Vue.@[k]:=false;coul.@[k]:=incolor;
+ fi;
+ endfor;
+ apj.@:=apj;
+ closefrom nomfichier;
+enddef;
+
+
+%%%%%%%Objets travaillés
+
+vardef ObjetEnleve[](text t)=%les numéros des faces sont données par ordre croissant.
+ numeric numface[];
+ nface:=0;
+ numface[0]:=0;
+ %récupérer les numéros des faces.
+ forsuffixes _p=t:
+ nface:=nface+1;
+ numface[nface]=_p-(nface-1);%marchait :)
+ endfor;
+ numface[nface+1]:=apj.@-nface+1;
+ %Mettre dans l'ordre ces numéros.<-déjà fait par l'utilisateur
+ %enlever les numéros des faces
+ apj:=0;
+ for k=0 upto nface:
+ for l=numface[k] upto (numface[k+1]-1):
+ tcpt.@[apj]:=tcpt.@[apj+k];
+ OTFc.@[apj].nb:=OTFc.@[apj+k].nb;
+ for p=1 upto OTFc.@[apj].nb:
+ OTFc.@[apj][p]:=OTFc.@[apj+k][p];
+ endfor;
+ OTFc.@[apj].iso:=OTFc.@[apj+k].iso;
+ ALT.@[apj]:=ALT.@[apj+k];
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetDeplacement[](text t)=
+ %permet de déplacer un objet en donnant au préalable les angles de rotations et la translation. On peut également appliquer une transformation.
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ apj:=0;
+ forsuffixes p_=t:
+ Ferme.@:=Ferme[p_];
+ for k=0 upto apj[p_]:
+ cpt.@[apj]:=cpt[p_][k];
+ OTFc.@[apj].nb:=OTFc[p_][k].nb;
+ for l=1 upto OTFc.@[apj].nb:
+ OTFc.@[apj][l]:=Image(OTFc[p_][k][l]);
+ endfor;
+ OTFc.@[apj].iso:=Image(OTFc[p_][k].iso);
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=Outcolor[p_];
+ else:
+ %if Ferme.@=false:
+ Vue.@[apj]:=false;coul.@[apj]:=Incolor[p_];
+ %else:
+ % apj:=apj-1;
+ %fi;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef ObjetFusion[](text t)=
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ tapj:=0;
+ Nbobj:=0;
+ forsuffixes p_=t:
+ for k=0 upto apj[p_]:
+ cpt.@[tapj]:=tapj;
+ OTFc.@[tapj].nb:=OTFc[p_][k].nb;
+ for p=1 upto OTFc.@[tapj].nb:
+ OTFc.@[tapj][p]:=Image(OTFc[p_][k][p]);
+ endfor;
+ OTFc.@[tapj].iso:=Image(OTFc[p_][k].iso);
+ ALT.@[tapj]:=-Zpart(GCoord(OTFc.@[tapj].iso));
+ Vue.@[tapj]:=Vue[p_][k];
+ coul.@[tapj]:=coul[p_][k];
+ tapj:=tapj+1;
+ endfor;
+ endfor;
+ apj.@:=tapj-1;
+enddef;
+
+%les intersections d'objets
+
+vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd)
+ save di,vc;
+ color va,vb,vc,vd;
+ vd=Normal(bb,cc,dd);
+ va=vd/Norm(vd);
+ vb=aa-bb;
+ di=-ProduitScalaire(vb,va);
+ va:=di*va;
+ vb:=vb+va;
+ vc=bb+vb;
+ vc
+enddef;
+
+%%denis Roegel----------
+vardef IntersectionPlandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
+ save Int;
+ boolean Int;
+ color gg,caaa[],Caaa[];
+ caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc));
+ caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi;
+ caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi;
+ ww:=ProduitScalaire(caaa2,caaa3);
+ if ww<>0:
+ %if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
+ caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
+ Int:=true;
+ %else:
+ % Int:=false;
+ %fi;
+ else: % the line is parallel to the plane
+ Int:=false;
+ fi;
+ Int
+enddef;
+
+vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
+ save Int;
+ boolean Int;
+ color gg,caaa[],Caaa[];
+ caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc));
+ caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi;
+ caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi;
+ ww:=ProduitScalaire(caaa2,caaa3);
+ if ww<>0:
+ if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
+ %message("ww"&decimal(ww)&" PS"&decimal(ProduitScalaire(caaa1,caaa3))&"");
+ caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
+ Int:=true;
+ else:
+ Int:=false;
+ fi;
+ else: % the line is parallel to the plane
+ Int:=false;
+ fi;
+ Int
+enddef;
+
+vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee)
+ if Intersectionplandroite(aa,bb,cc,dd,ee):
+ gg=dd+caaa4;
+ fi;
+ gg
+enddef;
+
+vardef IPP(expr aa,bb,cc,dd,ee,ff)=
+ %a vérifier
+ %save da,db,dc;
+ boolean int;
+ da:=Norm(aa-ProjectionsurPlan(aa,dd,ee,ff));
+ db:=Norm(bb-ProjectionsurPlan(bb,dd,ee,ff));
+ dc:=Norm(cc-ProjectionsurPlan(cc,dd,ee,ff));
+ if (da=db) and (db=dc): % the two planes are parallel
+ int:=false;
+ else:
+ int:=true;
+ nbi:=nbi+1;
+ fi;
+enddef;
+%%---------------------
+
+vardef ObjetIntersection[](text t)=%plan n°1 solide n°2
+ color INTER[][][];%pour avoir les points d'intersection
+ nbsol:=1;
+ forsuffixes p_=t:
+ pp_[nbsol]:=p_;
+ nbsol:=nbsol+1;
+ endfor;
+ nbi:=0;
+ for k=0 upto apj[pp_[2]]:
+ IPP(OTFc[pp_[2]][k][1],OTFc[pp_[2]][k][2],OTFc[pp_[2]][k][3],PPP0,PPP1,PPP2);
+ if int=true:
+ nbint:=0;
+ OTFc[pp_[2]][k][OTFc[pp_[2]][k].nb+1]=OTFc[pp_[2]][k][1];
+ for l=1 upto (OTFc[pp_[2]][k].nb):
+ if Intersectionplandroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]):
+ nbint:=nbint+1;
+ INTER[pp_2][k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]);
+ fi;
+ endfor;
+ %%%Pas satisfaisant -> à travailler
+ %show nbint;
+ if nbint=2:
+ draw Projette(INTER[pp_2][k][1])--Projette(INTER[pp_2][k][2]) withpen pencircle scaled2bp withcolor violet;
+ fi;
+ fi;
+ endfor;
+enddef;
+
+vardef ObjetSepare[](expr nbd,nbD)=%nbd pour l'objet du dessous, nbD pour l'objet du dessus.
+ Ferme[nbd]:=Ferme.@;
+ Ferme[nbD]:=Ferme.@;
+ Outcolor[nbd]:=outcolor;
+ Incolor[nbd]:=incolor;
+ Outcolor[nbD]:=outcolor;
+ Incolor[nbD]:=incolor;
+ color INTER[][][];
+ color Nn;color PPP.iso;
+ Nn=Normal(PPP0,PPP1,PPP3);
+ PPP.iso=(PPP0+PPP1+PPP2)/3;
+ apj:=0;bpj:=0;%bpj pour le 2eme solide
+ for k=0 upto apj.@:
+ if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)<=0:
+ nbint:=0;
+ OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1];
+ for l=1 upto OTFc.@[k].nb:
+ if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]):
+ nbint:=nbint+1;
+ INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]);
+ prec.@[k][nbint]:=l;
+ suiv.@[k][nbint]:=l+1;
+ fi;
+ endfor;
+ if nbint=0:
+ tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb;
+ for l=1 upto OTFc[nbd][apj].nb:
+ OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]);
+ endfor;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ fi;
+ if nbint=2:
+ tcpt[nbd][apj]:=apj;
+ if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
+ compt:=0;
+ for l=1 upto prec.@[k][1]:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
+ OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
+ compt:=compt+2;
+ for l=suiv.@[k][2] upto OTFc.@[k].nb:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbd][apj].nb:=compt;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ %2eme solide
+ compt:=1;
+ OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
+ for l=suiv.@[k][1] upto prec.@[k][2]:
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]);
+ OTFc[nbD][bpj].nb:=compt;
+ 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;
+ ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+ Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+ else:
+ Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+ fi;
+ bpj:=bpj+1;
+ %fin 2eme solide
+ else:
+ compt:=1;
+ OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
+ for l=suiv.@[k][1] upto prec.@[k][2]:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]);
+ OTFc[nbd][apj].nb:=compt;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ %2eme solide
+ compt:=0;
+ for l=1 upto prec.@[k][1]:
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
+ OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
+ compt:=compt+2;
+ for l=suiv.@[k][2] upto OTFc.@[k].nb:
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbD][bpj].nb:=compt;
+ 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;
+ ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+ Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+ else:
+ Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+ fi;
+ bpj:=bpj+1;
+ %fin 2eme solide
+ fi;
+ fi;
+ if nbint=1:
+ compt:=0;%compteur pour le nb de sommets
+ comp:=0;%pour savoir où se situe le point à enlever
+ for l=1 upto OTFc.@[k].nb:
+ if ProduitScalaire(Nn,OTFc.@[k][l]-PPP.iso)>0:
+ comp:=comp+1;
+ fi;
+ endfor;
+ if comp=1:
+ tcpt[nbd][apj]:=apj;
+ for l=1 upto prec.@[k][1]-1:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(INTER.@[k][1]);
+ for l=suiv.@[k][1] upto OTFc.@[k].nb:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbd][apj].nb:=compt;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ else:
+ tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb;
+ for l=1 upto OTFc[nbd][apj].nb:
+ OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]);
+ endfor;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ fi;
+ fi;
+ fi;
+ if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)>0:
+ nbint:=0;
+ OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1];
+ for l=1 upto OTFc.@[k].nb:
+ if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]):
+ nbint:=nbint+1;
+ INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]);
+ prec.@[k][nbint]:=l;
+ suiv.@[k][nbint]:=l+1;
+ fi;
+ endfor;
+ %2eme solide sans intersection
+ if nbint=0:
+ tcpt[nbD][bpj]:=bpj; OTFc[nbD][bpj].nb:=OTFc.@[k].nb;
+ for l=1 upto OTFc[nbD][bpj].nb:
+ OTFc[nbD][bpj][l]:=Image(OTFc.@[k][l]);
+ endfor;
+ 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;
+ ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+ Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+ else:
+ Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+ fi;
+ bpj:=bpj+1;
+ fi;
+ %fin 2eme solide
+ if nbint=2:
+ tcpt[nbd][apj]:=apj;
+ if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
+ compt:=0;
+ for l=1 upto prec.@[k][1]:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
+ OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
+ compt:=compt+2;
+ for l=suiv.@[k][2] upto OTFc.@[k].nb:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbd][apj].nb:=compt;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ %2eme solide
+ compt:=1;
+ OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
+ for l=suiv.@[k][1] upto prec.@[k][2]:
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]);
+ OTFc[nbD][bpj].nb:=compt;
+ 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;
+ ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+ Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+ else:
+ Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+ fi;
+ bpj:=bpj+1;
+ %fin 2eme solide
+ else:
+ compt:=1;
+ OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
+ for l=suiv.@[k][1] upto prec.@[k][2]:
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ compt:=compt+1;
+ OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]);
+ OTFc[nbd][apj].nb:=compt;
+ 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;
+ ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+ Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+ else:
+ Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ %2eme solide
+ compt:=0;
+ for l=1 upto prec.@[k][1]:
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
+ OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
+ compt:=compt+2;
+ for l=suiv.@[k][2] upto OTFc.@[k].nb:
+ compt:=compt+1;
+ OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+ endfor;
+ OTFc[nbD][bpj].nb:=compt;
+ 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;
+ ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+ if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+ Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+ else:
+ Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+ fi;
+ bpj:=bpj+1;
+ %fin 2eme solide
+ fi;
+ fi;
+ fi;
+ endfor;
+ apj[nbd]:=apj-1;
+ apj[nbD]:=bpj-1;
+enddef;
+
+%pour les lignes de niveaux.
+vardef ObjetSurfaceZ[](expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
+ surfz:=true;
+ Outcolor.@:=outcolor;
+ Incolor.@:=incolor;
+ scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
+ apj:=0;
+ IncX:=(xmax-xmin)/nbpoints;
+ IncY:=(ymax-ymin)/nblignes;
+ color Yc[][],Xc[][],Fc[][];
+ for ligne=0 upto nblignes:
+ y:=ymax-ligne*IncY;
+ x:=xmin;
+ Yc[ligne][0]=(x,y,Fz(x,y));
+ for k=1 upto nbpoints:
+ Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
+ endfor;
+ endfor;
+ for k=(nblignes-1) downto 0:
+ for l=(nbpoints-3) step -3 until 0:
+ cpt[apj]:=apj;
+ OTFc.@[apj].nb:=4;
+ OTFc.@[apj][1]:=Yc[k][l];
+ OTFc.@[apj][2]:=Yc[k+1][l];
+ OTFc.@[apj][3]:=Yc[k+1][l+3];
+ OTFc.@[apj][4]:=Yc[k][l+3];
+ OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+ ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+ if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+ Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+ else:
+ Vue.@[apj]:=false;coul.@[apj]:=incolor;
+ fi;
+ apj:=apj+1;
+ endfor;
+ endfor;
+ apj.@:=apj-1;
+enddef;
+
+vardef GrilleSurfZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)=
+ drawoptions(withcolor gris);
+ for k=zmin upto zmax:
+ draw Projette((-xmin,ymin,k))--Projette((-xmax,ymin,k))--Projette((-xmax,ymax,k));
+ endfor;
+ for k=ymin upto ymax:
+ draw Projette((-xmin,k,zmin))--Projette((-xmax,k,zmin))--Projette((-xmax,k,zmax));
+ endfor;
+ for k=xmin upto xmax:
+ draw Projette((-k,ymax,zmin))--Projette((-k,ymin,zmin))--Projette((-k,ymin,zmax));
+ endfor;
+ drawoptions();
+ if Phi<>90:
+ for k=zmin step zpas until zmax:
+ label.lft(""&decimal(zechelle*k)&"",Projette((-xmin,ymin,k)));
+ endfor;
+ for k=ymin step ypas until ymax:
+ label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
+ endfor;
+ for k=xmin step xpas until xmax:
+ label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
+ endfor;
+ labeloffset:=8*labeloffset;
+ label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin)));
+ label.lft(btex $z$ etex,Projette((-xmin,ymin,(zmin+zmax)/2)));
+ label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin)));
+ labeloffset:=labeloffset/8;
+ else:
+ for k=ymin step ypas until ymax:
+ label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
+ endfor;
+ for k=xmin step xpas until xmax:
+ label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
+ endfor;
+ labeloffset:=8*labeloffset;
+ label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin)));
+ label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin)));
+ labeloffset:=labeloffset/8;
+ fi;
+enddef;
+
+vardef GrilleSurfZZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)=
+ drawoptions(withcolor gris);
+ for k=zmin upto zmax:
+ draw Projette((xmin,ymin,k))--Projette((xmin,ymax,k))--Projette((xmax,ymax,k));
+ endfor;
+ for k=ymin upto ymax:
+ draw Projette((xmax,k,zmin))--Projette((xmin,k,zmin))--Projette((xmin,k,zmax));
+ endfor;
+ for k=xmin upto xmax:
+ draw Projette((k,ymin,zmin))--Projette((k,ymax,zmin))--Projette((k,ymax,zmax));
+ endfor;
+ drawoptions();
+ if Phi<>90:
+ for k=zmin step zpas until zmax:
+ label.lft(""&decimal(zechelle*k)&"",Projette((xmin,ymin,k)));
+ endfor;
+ for k=ymin step ypas until ymax:
+ label.rt(""&decimal(k)&"",Projette((xmax,k,zmin)));
+ endfor;
+ for k=xmin step xpas until xmax:
+ label.bot(""&decimal(k)&"",Projette((k,ymin,zmin)));
+ endfor;
+ labeloffset:=8*labeloffset;
+ label.rt(btex $y$ etex,Projette((xmax,(ymin+ymax)/2,zmin)));
+ label.lft(btex $z$ etex,Projette((xmin,ymin,(zmin+zmax)/2)));
+ label.bot(btex $x$ etex,Projette(((xmin+xmax)/2,ymin,zmin)));
+ labeloffset:=labeloffset/8;
+ else:
+ for k=ymin step ypas until ymax:
+ label.bot(""&decimal(k)&"",Projette((xmin,k,zmin)));
+ endfor;
+ for k=xmin step xpas until xmax:
+ label.rt(""&decimal(k)&"",Projette((k,ymax,zmin)));
+ endfor;
+ labeloffset:=8*labeloffset;
+ label.bot(btex $y$ etex,Projette((xmin,(ymin+ymax)/2,zmin)));
+ label.rt(btex $x$ etex,Projette(((xmin+xmax)/2,ymax,zmin)));
+ labeloffset:=labeloffset/8;
+ fi;
+enddef;
+
+vardef Legende(expr xmax,ymax,nbplan,zechelle)=
+ path legende[];
+ for k=1 upto nbplan+1:
+ 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;
+ endfor;
+ for k=1 upto nbplan+1:
+ fill legende[k] withcolor Outcolor[k];
+ draw legende[k];
+ label.rt(""&decimal(zechelle*(k-1))&" - "&decimal(zechelle*k)&"",Projette((-xmax,ymax+2,k-0.25)));
+ endfor;
+enddef;
+
+vardef MaillageZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
+ traits:=true;
+ scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
+ IncX:=(xmax-xmin)/nbpoints;
+ IncY:=(ymax-ymin)/nblignes;
+ color Yc[][],Xc[][];
+ for ligne=0 upto nblignes:
+ y:=ymax-ligne*IncY;
+ x:=xmin;
+ Yc[ligne][0]=(x,y,Fz(x,y));
+ for k=1 upto nbpoints:
+ Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
+ endfor;
+ endfor;
+ for l=0 upto nbpoints:
+ x:=xmax-l*IncX;
+ y:=ymin;
+ Xc[l][0]:=(x,y,Fz(x,y));
+ for k=1 upto nblignes:
+ Xc[l][k]=(x,ymin+k*IncY,Fz(x,ymin+k*IncY));
+ endfor;
+ endfor;
+ for k=nblignes downto 0:
+ draw Projette(Yc[k][nbpoints])
+ for l=(nbpoints-1) downto 0:
+ ..Projette(Yc[k][l])
+ endfor;
+ endfor;
+ for l=nbpoints downto 0:
+ draw Projette(Xc[l][nblignes])
+ for k=nblignes-1 downto 0:
+ ..Projette(Xc[l][k])
+ endfor;
+ endfor;
+enddef;
+
+endinput;
diff --git a/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp b/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp
index 7b98805397b..66d7fae82a2 100644
--- a/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp
+++ b/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp
@@ -1436,7 +1436,7 @@ vardef FinBlocRepeter=
drawoptions();
texto=image(
labeloffset:=0;
- label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\barre Titi titi titi tit itit tit it it ti}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+ label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
labeloffset:=3;
);
path cadre;
@@ -1778,7 +1778,7 @@ vardef FinNouveauBloc=%
drawoptions();
texto=image(
labeloffset:=0;
- label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\phantom{\barre fin du bloc}}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+ label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
labeloffset:=3;
);
path cadre;
diff --git a/Master/texmf-dist/metapost/profcollege/PfCScratch.mp b/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
index 2f2db0ee741..10a8972ef85 100644
--- a/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
+++ b/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
@@ -52,7 +52,11 @@ enddef;
%%%%Alias
def Place expr o =
- if path o: draw o else: draw o fi
+ if path o: draw o else: draw o fi
+enddef;
+
+def Placer expr o =
+ if path o: draw o else: draw o fi
enddef;
%impression
@@ -1654,7 +1658,7 @@ vardef FinBlocRepeter=
drawoptions();
texto=image(
labeloffset:=0;
- label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{~~}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+ label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
labeloffset:=3;
);
path cadre;
@@ -1742,7 +1746,7 @@ vardef FinBlocSi=
drawoptions();
texto=image(
labeloffset:=0;
- label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\phantom{\barre fin du bloc}}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+ label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
labeloffset:=3;
);
path cadre;
@@ -1792,6 +1796,7 @@ fi;
$=image(
fill cadre withcolor if print : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
draw cadre withcolor if print : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
+ draw texto;
if BlocStopAvant=false:
draw (coindebutbloc[numblocrep]+(0.0625+0.5cm,0)+(eb,0)){dir180}..
{dir-90}(coindebutbloc[numblocrep]+(0.5cm,0)+(0,-eb))--
@@ -1853,7 +1858,7 @@ vardef Sinon=
drawoptions();
texto=image(
labeloffset:=0;
- label.lrt(TEX("\, \hbox to"&decimal(LongRep[numblocrep])&"pt{\bfseries\barre sinon}"),if unknown _coinprec: (0,0) else:_coinprec fi) if print=false : withcolor blanc fi;
+ label.lrt(TEX("\barre\,\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi) if print=false : withcolor blanc fi;
labeloffset:=3;
);
path cadre;
@@ -1901,7 +1906,9 @@ vardef Sinon=
$=image(
fill cadre withcolor if print=true : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
draw cadre withcolor if print=true : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
- draw texto;
+ drawoptions(withcolor white);
+ label.rt(TEX("\longbarre\sffamily\bfseries sinon"),(xpart(llcorner texto),ypart(center texto)));
+ drawoptions();
if BlocStopAvant=false:
draw (coindebutbloc[numblocrep]+(0.0625+0.5cm,0)+(eb,0.125)){dir180}..
{dir-90}(coindebutbloc[numblocrep]+(0.5cm,0)+(0,-eb))--
@@ -3370,3 +3377,71 @@ vardef ListeLongueur(expr nbpas)=
$
enddef;
+vardef Boussole(expr nbpas)=
+ save $; picture $;
+ picture Bouss[];
+ Bouss1=image(
+ draw Orienter("90");
+ );
+ Bouss2=image(
+ _coinprec:=(0,0);
+ draw Orienter("0");
+ );
+ Bouss3=image(
+ _coinprec:=(0,0);
+ draw Orienter("-90");
+ );
+ Bouss4=image(
+ _coinprec:=(0,0);
+ draw Orienter("180");
+ );
+ $=image(
+ draw Bouss1 rotatedabout(center Bouss1,-90) shifted ((2cm,0)-(center Bouss1));
+ draw Bouss2 shifted ((0,2cm)-(center Bouss2));
+ draw Bouss3 rotatedabout(center Bouss3,90) shifted((-2cm,0)-(center Bouss3));
+ draw Bouss4 rotatedabout(center Bouss4,180) shifted((0,-2cm)-(center Bouss4));
+ pair PtBous[];
+ PtBous1=(-1.2cm,-1.2cm);
+ PtBous2-PtBous1=(2*1.2cm,0);
+ PtBous3-PtBous2=(0,2*1.2cm);
+ PtBous4-PtBous3=PtBous1-PtBous2;
+ path CadreBous;
+ CadreBous=(PtBous1+(0,eb)){dir-90}..{dir0}(PtBous1+(eb,0)) if nbpas="180":--0.4[PtBous1,PtBous2]--(1/2[PtBous1,PtBous2]+(0,-0.3cm))--0.6[PtBous1,PtBous2] fi--(PtBous2+(-eb,0)){dir 0}..{dir 90}(PtBous2+(0,eb)) if nbpas="90":--0.4[PtBous2,PtBous3]--(1/2[PtBous2,PtBous3]+(0.3cm,0))--0.6[PtBous2,PtBous3] fi--(PtBous3+(0,-eb)){dir90}..{dir180}(PtBous3+(-eb,0)) if nbpas="0":--0.4[PtBous3,PtBous4]--(1/2[PtBous3,PtBous4]+(0,0.3cm))--0.6[PtBous3,PtBous4] fi--(PtBous4+(eb,0)){dir 180}..{dir -90}(PtBous4-(0,eb)) if nbpas="-90":--0.4[PtBous4,PtBous1]--(1/2[PtBous4,PtBous1]+(-0.3cm,0))--0.6[PtBous4,PtBous1] fi
+ --cycle;
+ fill CadreBous withcolor BleuMouvTrois;
+ draw CadreBous;
+ path CercleBouss;
+ CercleBouss=fullcircle scaled (0.55*sqrt(2)*2.4cm);
+ fill CercleBouss withcolor 0.2[BleuMouvTrois,white];
+ trace CercleBouss withcolor dBleuMouvTrois;
+ if nbpas="0":
+ fill ((0,0)--(subpath(0,2) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+ draw (point(2) of CercleBouss)--(0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ if nbpas="90":
+ draw (0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ if nbpas="180":
+ fill ((0,0)--(subpath(6,8) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+ draw (point(6) of CercleBouss)--(0,0)--(point(8) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ if nbpas="-90":
+ fill ((0,0)--(subpath(0,4) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+ draw (point(0) of CercleBouss)--(0,0)--(point(4) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ for k=0 upto 17:
+ draw 0.6[(0,0),point ((k/18)*length CercleBouss) of CercleBouss]--0.8[(0,0),point ((k/18)*length CercleBouss) of CercleBouss] withcolor white;
+ endfor;
+ picture FlecheBouss;
+ FlecheBouss=image(
+ fill fullcircle scaled 4mm withcolor white;
+ draw fullcircle scaled 4mm;
+ drawarrow (-1mm,0)--(1mm,0) withpen pencircle scaled 2 withcolor BleuMouvTrois;
+ );
+ draw FlecheBouss shifted (point(0) of CercleBouss);
+ draw (FlecheBouss rotated 90) shifted (point(2) of CercleBouss);
+ draw (FlecheBouss rotated 180) shifted (point(4) of CercleBouss);
+ draw (FlecheBouss rotated -90) shifted (point(6) of CercleBouss);
+ );
+ $
+enddef;
diff --git a/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp b/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp
index f96556d0327..f3acd75d3db 100644
--- a/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp
+++ b/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp
@@ -3402,3 +3402,71 @@ vardef ListeLongueur(expr nbpas)=
$
enddef;
+vardef Boussole(expr nbpas)=
+ save $; picture $;
+ picture Bouss[];
+ Bouss1=image(
+ draw Orienter("90");
+ );
+ Bouss2=image(
+ _coinprec:=(0,0);
+ draw Orienter("0");
+ );
+ Bouss3=image(
+ _coinprec:=(0,0);
+ draw Orienter("-90");
+ );
+ Bouss4=image(
+ _coinprec:=(0,0);
+ draw Orienter("180");
+ );
+ $=image(
+ draw Bouss1 rotatedabout(center Bouss1,-90) shifted ((2cm,0)-(center Bouss1));
+ draw Bouss2 shifted ((0,2cm)-(center Bouss2));
+ draw Bouss3 rotatedabout(center Bouss3,90) shifted((-2cm,0)-(center Bouss3));
+ draw Bouss4 rotatedabout(center Bouss4,180) shifted((0,-2cm)-(center Bouss4));
+ pair PtBous[];
+ PtBous1=(-1.2cm,-1.2cm);
+ PtBous2-PtBous1=(2*1.2cm,0);
+ PtBous3-PtBous2=(0,2*1.2cm);
+ PtBous4-PtBous3=PtBous1-PtBous2;
+ path CadreBous;
+ CadreBous=(PtBous1+(0,eb)){dir-90}..{dir0}(PtBous1+(eb,0)) if nbpas="180":--0.4[PtBous1,PtBous2]--(1/2[PtBous1,PtBous2]+(0,-0.3cm))--0.6[PtBous1,PtBous2] fi--(PtBous2+(-eb,0)){dir 0}..{dir 90}(PtBous2+(0,eb)) if nbpas="90":--0.4[PtBous2,PtBous3]--(1/2[PtBous2,PtBous3]+(0.3cm,0))--0.6[PtBous2,PtBous3] fi--(PtBous3+(0,-eb)){dir90}..{dir180}(PtBous3+(-eb,0)) if nbpas="0":--0.4[PtBous3,PtBous4]--(1/2[PtBous3,PtBous4]+(0,0.3cm))--0.6[PtBous3,PtBous4] fi--(PtBous4+(eb,0)){dir 180}..{dir -90}(PtBous4-(0,eb)) if nbpas="-90":--0.4[PtBous4,PtBous1]--(1/2[PtBous4,PtBous1]+(-0.3cm,0))--0.6[PtBous4,PtBous1] fi
+ --cycle;
+ fill CadreBous withcolor BleuMouvTrois;
+ draw CadreBous;
+ path CercleBouss;
+ CercleBouss=fullcircle scaled (0.55*sqrt(2)*2.4cm);
+ fill CercleBouss withcolor 0.2[BleuMouvTrois,white];
+ trace CercleBouss withcolor dBleuMouvTrois;
+ if nbpas="0":
+ fill ((0,0)--(subpath(0,2) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+ draw (point(2) of CercleBouss)--(0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ if nbpas="90":
+ draw (0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ if nbpas="180":
+ fill ((0,0)--(subpath(6,8) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+ draw (point(6) of CercleBouss)--(0,0)--(point(8) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ if nbpas="-90":
+ fill ((0,0)--(subpath(0,4) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+ draw (point(0) of CercleBouss)--(0,0)--(point(4) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+ fi;
+ for k=0 upto 17:
+ draw 0.6[(0,0),point ((k/18)*length CercleBouss) of CercleBouss]--0.8[(0,0),point ((k/18)*length CercleBouss) of CercleBouss] withcolor white;
+ endfor;
+ picture FlecheBouss;
+ FlecheBouss=image(
+ fill fullcircle scaled 4mm withcolor white;
+ draw fullcircle scaled 4mm;
+ drawarrow (-1mm,0)--(1mm,0) withpen pencircle scaled 2 withcolor BleuMouvTrois;
+ );
+ draw FlecheBouss shifted (point(0) of CercleBouss);
+ draw (FlecheBouss rotated 90) shifted (point(2) of CercleBouss);
+ draw (FlecheBouss rotated 180) shifted (point(4) of CercleBouss);
+ draw (FlecheBouss rotated -90) shifted (point(6) of CercleBouss);
+ );
+ $
+enddef;
diff --git a/Master/texmf-dist/metapost/profcollege/PfCSolid.mp b/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
new file mode 100644
index 00000000000..829fad5d306
--- /dev/null
+++ b/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
@@ -0,0 +1,991 @@
+prologues:=2;
+
+%Constantes
+u:=1cm;
+pi:=3.141592654;
+c:=57.29578; % conversion d'un radian en degrés
+color rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,cielfonce,orangevif,gris,marron;
+rouge=(1,0,0);
+bleu=(0,0,1);
+noir=(0,0,0);
+blanc=(1,1,1);
+orange=(1,0.5,0);
+violet=blanc-vert;
+rose=(1,0.7,0.7);
+cielfonce=0.9*(0.25,1,1);
+ciel=bleu+vert;
+orangevif=(1,0.25,0.1);
+vert=(0,1,0);
+jaune=blanc-bleu;
+gris=0.8*white;
+
+color CouleurTraits;
+CouleurTraits=black;
+
+input marith;
+input sarith;
+input PfCObjets;
+
+color Sommet[];
+
+%Anthony Phan
+vardef Norm primary z =
+ abs (abs(Xpart z, Ypart z), Zpart z)
+enddef;
+
+let Xpart = redpart;
+let Ypart = greenpart;
+let Zpart = bluepart;
+%
+
+string typerepre,pointilles;
+typerepre:="persp";
+
+vardef Initialisation(expr r,t,p,d)=
+ Rho:=r;
+ Theta:=t;
+ Phi:=p;
+ DE:=d;
+ Aux1:=sind(Theta);
+ Aux2:=sind(Phi);
+ Aux3:=cosd(Theta);
+ Aux4:=cosd(Phi);
+ Aux5:=Aux3*Aux2;
+ Aux6:=Aux1*Aux2;
+ Aux7:=Aux3*Aux4;
+ Aux8:=Aux1*Aux4;
+ pointilles:="oui";
+ Lumiere:=Oeil;
+enddef;
+
+vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2)
+enddef;
+
+vardef sin(expr t) = sind(c*t) enddef;
+
+vardef cos(expr t) = cosd(c*t) enddef;
+
+vardef tan(expr t) = sin(t)/cos(t) enddef;
+
+vardef exp(expr x) = mexp(256)**x enddef;
+
+vardef Exp primary x = mexp(256)**x enddef;
+
+vardef ln(expr t) = mlog(t)/256 enddef;
+
+vardef log(expr t) = ln(t)/ln(10) enddef;
+
+vardef ch(expr x)=(exp(x)+exp (-x))/2 enddef;
+
+vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
+
+vardef th(expr x)=sh(x)/ch(x) enddef;
+
+vardef arcsin(expr x)=%Définition mathématique en radian
+ pi*angle((sqrt(1-x**2),x))/180
+enddef;
+
+vardef arccos(expr x)=%Définition mathématique en radian
+ pi*angle((x,sqrt(1-x**2)))/180
+enddef;
+
+vardef arctan(expr x)=arcsin(x/(1++x))
+enddef;
+
+numeric satu,lum;
+satu:=0.45;
+lum:=1;
+
+%Coordonnées dans le repère Oeil
+vardef GCoord(expr N)=
+ (-Xpart(N)*Aux1+Ypart(N)*Aux3,-Xpart(N)*Aux5-Ypart(N)*Aux6+Zpart(N)*Aux4,-Xpart(N)*Aux7-Ypart(N)*Aux8-Zpart(N)*Aux2+Rho)
+enddef;
+
+unit:=1;%pour les mises à l'échelle :) Merci pst-solides3d
+
+vardef Projette(expr M)=
+ %if typerepre="proj":
+ % unit*(DE*(Xpart(GCoord(M)/Zpart(GCoord(M))),(Ypart(GCoord(M))/Zpart(GCoord(M)))))
+ %elseif typerepre="persp":
+ unit*(DE*(Xpart(GCoord(M)),Ypart(GCoord(M))))
+ %fi
+enddef;
+
+vardef TraceAxes=
+ color Origine,Unitex,Unitey,Unitez;
+ Origine=(0,0,0);
+ Unitex=(5,0,0);
+ Unitey=(0,5,0);
+ Unitez=(0,0,5);
+ drawoptions(dashed dashpattern(on 12bp off 6bp on 3bp off 6bp));
+ drawarrow Projette(Origine)--Projette(Unitex) withcolor blue;
+ drawarrow Projette(Origine)--Projette(Unitey) withcolor vert;
+ drawarrow Projette(Origine)--Projette(Unitez);
+ drawoptions();
+enddef;
+
+vardef TraceAxesD(expr xd,yd,zd)=
+ drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp));;
+ drawarrow Projette((0,0,0))--Projette((xd,0,0));
+ drawarrow Projette((0,0,0))--Projette((0,yd,0));
+ drawarrow Projette((0,0,0))--Projette((0,0,zd));
+ drawoptions();
+ label(btex $x$ etex,Projette((xd+0.3,0,0)));
+ label(btex $y$ etex,Projette((0,yd+0.3,0)));
+ label(btex $z$ etex,Projette((0,0,zd+0.3)));
+enddef;
+
+vardef TraceAxesDD(expr xd,yd,zd,xf,yf,zf)=
+ drawoptions(dashed evenly);
+ draw Projette((0,0,0))--Projette((xd,0,0));
+ draw Projette((0,0,0))--Projette((0,yd,0));
+ draw Projette((0,0,0))--Projette((0,0,zd));
+ drawoptions();
+ drawarrow Projette((xd,0,0))--Projette((xf,0,0));
+ drawarrow Projette((0,yd,0))--Projette((0,yf,0));
+ drawarrow Projette((0,0,zd))--Projette((0,0,zf));
+ label(btex $x$ etex,Projette((xf+0.3,0,0)));
+ label(btex $y$ etex,Projette((0,yf+0.3,0)));
+ label(btex $z$ etex,Projette((0,0,zf+0.3)));
+enddef;
+
+vardef TraceGrille(expr NB)=
+ color ppt[];
+ for k=0 upto NB:
+ ppt[k]:=(k,0,0);
+ draw Projette(ppt[k]+(0,0,NB))--Projette(ppt[k])--Projette(ppt[k]+(0,NB,0));
+ ppt[k]:=(0,k,0);
+ draw Projette(ppt[k]+(NB,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,0,NB));
+ ppt[k]:=(0,0,k);
+ draw Projette(ppt[k]+(NB,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,NB,0));
+ endfor;
+enddef;
+
+primarydef u Vectprod v =
+ (Ypart u * Zpart v - Zpart u * Ypart v,
+ Zpart u * Xpart v - Xpart u * Zpart v,
+ Xpart u * Ypart v - Ypart u * Xpart v)
+enddef;
+
+vardef Normal(expr vecun,vecde,vectr)=
+ save aa;
+ color aa;
+ P1:=redpart(vecde-vecun);
+ P2:=greenpart(vecde-vecun);
+ P3:=bluepart(vecde-vecun);
+ Q1:=redpart(vectr-vecun);
+ Q2:=greenpart(vectr-vecun);
+ Q3:=bluepart(vectr-vecun);
+ aa=(P2*Q3-Q2*P3,P3*Q1-Q3*P1,P1*Q2-Q1*P2);
+ aa
+enddef;
+
+vardef ProduitScalaire(expr wec,mor)=
+ %Mexp(Mlog redpart(wec) Mmul Mlog redpart(mor))+Mexp(Mlog greenpart(wec) Mmul Mlog greenpart(mor))+Mexp(Mlog bluepart(wec) Mmul Mlog bluepart(mor))
+ Xpart(wec)*Xpart(mor)+Ypart(wec)*Ypart(mor)+Zpart(wec)*Zpart(mor)
+enddef;
+%pour les rotations et translations
+
+vardef RotX(expr ptx)=
+ (Xpart(ptx),Ypart(ptx)*cosd(angx)-Zpart(ptx)*sind(angx),Ypart(ptx)*sind(angx)+Zpart(ptx)*cosd(angx))
+enddef;
+
+vardef RotY(expr ptx)=
+ (Xpart(ptx)*cosd(angy)+Zpart(ptx)*sind(angy),Ypart(ptx),-Xpart(ptx)*sind(angy)+Zpart(ptx)*cosd(angy))
+enddef;
+
+vardef RotZ(expr ptx)=
+ (Xpart(ptx)*cosd(angz)-Ypart(ptx)*sind(angz),Xpart(ptx)*sind(angz)+Ypart(ptx)*cosd(angz),Zpart(ptx))
+enddef;
+
+vardef RotXYZ(expr ptx)=
+ RotZ(RotY(RotX(ptx)))
+enddef;
+
+angx:=0;
+angy:=0;
+angz:=0;
+color TR;
+TR:=(0,0,0);
+%pour les tubes
+vardef VT(expr t)=Fp(t)/Norm(Fp(t))
+enddef;
+
+vardef VN(expr t)=Fd(t)/Norm(Fd(t))
+enddef;
+
+vardef VBN(expr t)=VT(t) Vectprod VN(t)
+enddef;
+
+path feuillet;
+numeric _tfig,_nfig;
+pair coinbg,coinbd,coinhd,coinhg;
+_nfig:=0;
+
+def feuille(expr xa,ya,xb,yb) =
+ feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle;
+ coinbg := (xa,ya);
+ coinbd := (xb,ya);
+ coinhd := (xb,yb);
+ coinhg := (xa,yb);
+ %modifié le 29.09.04
+ z.so=(xpart(coinbg/1cm),ypart(coinbg/1cm));
+ z.ne=(xpart(coinhd/1cm),ypart(coinhd/1cm));
+ %fin modification
+ extra_endfig := "clip currentpicture to feuillet;" & extra_endfig;
+enddef;
+
+def figureespace(expr xa,ya,xb,yb) =
+ _nfig:=_nfig+1;
+ beginfig(_nfig);
+ feuille(xa,ya,xb,yb);
+ _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi;
+ _tfig:=2*_tfig;
+enddef;
+
+def finespace=
+endfig;
+enddef;
+
+def QS(expr ndeb,nfin)=
+ begingroup
+ save v,m,x;
+ if ndeb<nfin:
+ v:=ALT[cpt[ndeb]];
+ m:=ndeb;
+ for i=(ndeb+1) upto nfin:
+ if ALT[cpt[i]]<v:
+ m:=m+1;
+ x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x;
+ fi
+ endfor;
+ x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x;
+ QS(ndeb,m-1);
+ QS(m+1,nfin);
+ fi
+ endgroup
+enddef;
+
+boolean Pointilles;
+Pointilles:=false;
+
+boolean Vue[];
+color Fc[].iso;
+boolean Creux;
+Creux:=false;
+
+vardef DessineObjetNew=
+ numeric ALT[];
+ %on détermine les zmax dans le repère spatial de l'écran
+ for k=1 upto apj:
+ Fc[k].iso:=(0,0,0) for l=1 upto ns[k][0]:
+ +Fc[k][l]
+ endfor;
+ Fc[k].iso:=Fc[k].iso/ns[k][0];
+ endfor;
+ for k=1 upto apj:
+ %ALT[k]=-Zpart(GCoord(Fc[k].iso));
+ zmax:=infinity;
+ for l=1 upto ns[k][0]:
+ t:=-Zpart(GCoord(Fc[k][l]));
+ if t<zmax:
+ zmax:=t;
+ fi;
+ endfor;
+ ALT[k]=zmax;
+ cpt[k]:=k;
+ endfor;
+ %On trie suivant les zmax
+ QS(1,apj);
+ %On dessine
+ if Pointilles:
+ for k=1 upto apj:
+ draw for l=1 upto ns[cpt[k]][0]:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle if Vue[cpt[k]]=false: dashed evenly fi;
+ endfor;
+ else:
+ for k=1 upto apj:
+ if Creux=false:
+ if Vue[cpt[k]]:
+ fill for l=1 upto ns[cpt[k]][0]:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor
+ if arcenciel:
+ lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
+ else:
+ lumin(cpt[k])*outcolor
+ fi;
+ if traits:
+ draw for l=1 upto ns[cpt[k]][0]:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle;
+ fi;
+ fi;
+ else:
+ fill for l=1 upto ns[cpt[k]][0]:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor
+ if Vue[cpt[k]]:
+ if arcenciel:
+ lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
+ else:
+ lumin(cpt[k])*outcolor
+ fi
+ else:
+ lumin(cpt[k])*incolor
+ fi;
+ if traits:
+ draw for l=1 upto ns[cpt[k]][0]:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle;
+ fi;
+ fi;
+ endfor;
+ fi;
+enddef;
+
+color Fc[][];%représente les sommets des différentes faces;
+
+invnormale:=1;%Parfois dans la lecture des fichiers OFF, il est nécessaire d'opposer la normale pour obtenir un bon intérieur-extérieur
+boolean OFF,OBJ;%pour utiliser la lumière "correctement"
+OFF:=false;
+OBJ:=false;
+
+vardef LectureOFF(expr nomsolide)=
+ OFF:=true;
+ %Détermination du nombre de sommets et de faces.
+ string s_;
+ s_=readfrom nomsolide;
+ string ss[];
+ if s_<>EOF:
+ ss1 := loptok s_;
+ t_ := if ss1="%": 0 else: 1 fi;
+ forever:
+ ss[incr t_] := loptok s_;
+ exitif ss[t_]="";
+ endfor
+ else: false
+ fi;
+ NbS:=round(Mexp Mlog_str ss1);
+ NF:=round(Mexp Mlog_str ss2);
+ message("Il y a "&decimal(NbS)&" sommets.");
+ message("Il y a "&decimal(NF)&" faces au total.");
+ %Détermination des coordonnées des sommets
+ message("Création des sommets.");
+ s_:=readfrom nomsolide;
+ if debut=0:
+ for k=0 upto NbS-1:
+ s_:=readfrom nomsolide;
+ if s_<>EOF:
+ ss1 := loptok s_;
+ n_ := if ss1="%": 0 else: 1 fi;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor
+ else: false
+ fi;
+ Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+ %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
+ %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
+ endfor;
+ else:
+ for k=1 upto NbS:
+ s_:=readfrom nomsolide;
+ if s_<>EOF:
+ ss1 := loptok s_;
+ n_ := if ss1="%": 0 else: 1 fi;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor
+ else: false
+ fi;
+ Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+ %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
+ %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
+ endfor;
+ fi;
+ message("Création des faces.");
+ %Détermination des faces
+ apj:=0;color cc,dd;
+ nbfvues:=0;
+ for nf=-4000 upto (-4000+NF)-1:
+ s_:=readfrom nomsolide;
+ if s_<>EOF:
+ ss1 := loptok s_;
+ n_ := if ss1="%": 0 else: 1 fi;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor
+ else: false
+ fi;
+ apj:=apj+1;
+ ns[apj][0]:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
+ for nl=1 upto ns[apj][0]:
+ Fc[apj][nl]:=Sommet[round(Mexp Mlog_str ss[nl+1])];
+ endfor;
+ dd:=Oeil-Fc[apj][1];
+ cc:=invnormale*Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]);
+ if (ProduitScalaire(dd,cc)>=0):
+ Vue[apj]:=true;
+ nbfvues:=nbfvues+1;
+ else:
+ if Creux=true:
+ Vue[apj]:=false;
+ else:
+ apj:=apj-1;
+ fi;
+ fi;
+ endfor;
+ message("Faces vues déterminees : il y en a "&decimal(nbfvues)&".");
+ closefrom nomsolide;
+ DessineObjetNew;
+enddef;
+
+vardef LectureOBJ(expr nomfichier)=
+ OBJ:=true;
+ string s_;
+ string ss[];
+ nbss:=1;
+ apj:=0;
+ forever:
+ s_:=readfrom nomfichier;
+ if s_<>EOF:
+ ss0 := loptok s_;
+ if ss0="v":
+ n_:=0;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor
+ Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+ nbss:=incr nbss;
+ elseif ss0="f":
+ n_:=0;
+ forever:
+ ss[incr n_] := loptok s_;
+ exitif ss[n_]="";
+ endfor;
+ ns[apj][0]:=n_-1;
+ for k=1 upto ns[apj][0]:
+ if invnormale=1:
+ Fc[apj][ns[apj][0]-k+1] := Sommet[round(Mexp(Mlog_str ss[k]))]
+ %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
+ % show OTFc.@[apj][OTFc.@[apj].nb-k+1];
+ %fi;
+ else:
+ Fc[apj][k] := Sommet[round(Mexp(Mlog_str ss[k]))]
+ %if unknown OTFc.@[apj][k]:
+ % show OTFc.@[apj][k];
+ %fi;
+ fi;
+ endfor;
+ if ProduitScalaire(Oeil-Fc[apj][1],Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]))>=0:
+ Vue[apj]:=true;
+ apj:=apj+1;
+ else:
+ if Creux=true:
+ Vue[apj]:=false;
+ apj:=apj+1;
+ fi;
+ fi;
+ fi;
+ fi;
+ exitif s_=EOF;
+ endfor;
+ apj:=apj-1;
+ closefrom nomfichier;
+ DessineObjetNew
+enddef;
+
+nb:=8;
+
+%tube
+vardef Tube(expr Fn,dp,ds,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
+ save _tube;
+ picture _tube;
+ scantokens("vardef F(expr t)="&Fn&" enddef;");
+ scantokens("vardef Fp(expr t)="&dp&" enddef;");
+ scantokens("vardef Fd(expr t)="&ds&" enddef;");
+ color G[][];
+%nb point sur le cercle
+ NB:=nbp;%nb de pas
+ for l=0 upto NB:
+ for k=0 upto nb:
+ G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*(360/nb))*VN(tmin+l*pas)+sind(k*(360/nb))*VBN(tmin+l*pas));
+ endfor;
+ endfor;
+ apj:=0;
+ for l=0 upto (NB-1):
+ for k=0 upto nb-1:
+ apj:=apj+1;
+ cpt[apj]:=apj;
+ Fc[apj][1]:=G[l][k];
+ Fc[apj][2]:=G[l][k+1];
+ Fc[apj][3]:=G[l+1][k+1];
+ Fc[apj][4]:=G[l+1][k];
+ Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+ ALT[apj]:=-Zpart(GCoord(Fc[apj][1]));
+ endfor;
+ endfor;
+ QS(1,apj);
+ _tube=image(
+ for k=1 upto apj:
+ fill for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+ else: lumin(cpt[k])*outcolor fi;
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ endfor;
+ );
+ _tube
+enddef;
+
+%Tube new :)
+%pour les tubes new :)
+vardef T(expr t)=Fp(t)
+enddef;
+
+vardef VTn(expr t)=if Norm(T(t))=0:
+ T(t)
+ else:
+ T(t)/Norm(T(t))
+ fi
+enddef;
+
+vardef VNn(expr t)=
+ save _VNBis,__VN;
+ color _VNBis,__VN;
+ __VN=T(t) Vectprod ((T(t+nn)-T(t-nn))/2);
+ if __VN=(0,0,0):
+ _VNBis=(0,0,1);
+ else:
+ __VN:=__VN/Norm(__VN);
+ if ProduitScalaire(VNbisprec[t-nn],__VN)>0:
+ _VNBis=__VN/Norm(__VN)
+ else:
+ _VNBis=-(__VN/Norm(__VN))
+ fi;
+ fi;
+ VNbisprec[t]=_VNBis;
+ _VNBis
+enddef;
+
+vardef VBNn(expr t)=VTn(t) Vectprod VNn(t)
+enddef;
+
+vardef Tuben(expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
+ save _tuben;
+ picture _tuben;
+ scantokens("vardef F(expr t)="&Fn&" enddef;");
+ scantokens("vardef Fp(expr t)="&dp&" enddef;");
+ color G[][];
+%nb point sur le cercle
+ NB:=nbp;%nb de pas
+ nn:=pas;
+ %pour gérer le "flip" aux points d'inflexion
+ color VNbisprec[];
+ VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
+ %
+ ang:=360/nb;
+ for l=0 upto NB:
+ for k=0 upto nb:
+ G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
+ endfor;
+ endfor;
+ apj:=0;
+ for l=0 upto (NB-1):
+ for k=0 upto nb-1:
+ apj:=apj+1;
+ cpt[apj]:=apj;
+ Fc[apj][1]:=G[l][k];
+ Fc[apj][2]:=G[l][k+1];
+ Fc[apj][3]:=G[l+1][k+1];
+ Fc[apj][4]:=G[l+1][k];
+ Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+ ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+ endfor;
+ endfor;
+ QS(1,apj);
+ _tuben=image(
+ for k=1 upto apj:
+ fill for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+ else: lumin(cpt[k])*outcolor fi;
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withpen pencircle scaled0.25bp;
+ endfor;
+ );
+ _tuben
+enddef;
+
+
+vardef Fonction(expr fn,tmin,tmax,pas)=%fonction
+ scantokens("vardef F(expr t)="&fn&" enddef;");
+ save _f;
+ path _f;
+ _f=Projette(F(tmin))
+ for k=tmin+pas step pas until tmax:
+ --Projette(F(k))
+ endfor;
+ _f
+enddef;
+
+color outcolor,incolor,outcolorbis;
+
+boolean Spar;
+Spar:=false;
+
+vardef Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)=%fonction
+ Spar:=true;
+ save _Sparam;
+ scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
+ apj:=0;
+ picture _Sparam;
+ %On crée les facettes et on calcule la profondeur en Z.
+ for k=umin step upas until umax:
+ for l=vmin step vpas until vmax:
+ apj:=apj+1;
+ cpt[apj]:=apj;
+ Fc[apj][1]:=Image(Famille(k+upas,l));
+ Fc[apj][2]:=Image(Famille(k,l));
+ Fc[apj][3]:=Image(Famille(k,l+vpas));
+ Fc[apj][4]:=Image(Famille(k+upas,l+vpas));
+ Fc[apj].iso:=(Fc[apj][1]+Fc[apj][3])/2;%(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+ ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+ if ProduitScalaire(Oeil-Fc[apj].iso,invnormale*Normal(Fc[apj].iso,Fc[apj][1],Fc[apj][2]))>=0:
+ Vue[apj]:=true
+ else:
+ Vue[apj]:=false
+ fi;
+ endfor;
+ endfor;
+ %On range les faces par un QS en fonction de leur profondeur
+ QS(1,apj);
+ %On affiche toutes les faces par ordre décroissant de profondeur.
+ _Sparam=image(
+ for k=1 upto apj:
+ fill for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+ else: lumin(cpt[k])*outcolor fi
+ else:lumin(cpt[k])*incolor fi;
+ if traits=true:
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor CouleurTraits;
+ else:
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+ else: lumin(cpt[k])*outcolor fi
+ else:lumin(cpt[k])*incolor fi;
+ fi;
+ endfor;
+ );
+ Spar:=false;
+ _Sparam
+enddef;
+
+vardef Revolution(expr fn,umin,umax,upas,vmin,vmax,vpas)=
+ Sparam("(xpart(point(u) of "&fn&")*cos(v),xpart(point(u) of "&fn&")*sin(v),ypart(point(u) of "&fn&"))",umin,umax,upas,vmin,vmax,vpas)
+enddef;
+
+boolean traits;%sur une idée d'Herbert Voss à propos de pst-solides :)
+%sert à désactiver le tracer des traits
+%15/07/08:pour l'instant implanter uniquement pour les surfaces en z
+traits=true;
+
+boolean arcenciel;%pour essayer d'obtenir des dégradés tels que pst-solides :)
+arcenciel=false;
+
+boolean surfz;
+surfz:=false;
+boolean couleurz;
+couleurz=false;
+color cz[];
+boolean Mcir;
+Mcir:=false;
+rayd:=0;%sauf si division par 0 :(
+%ajout de angtotal et angd pour les cas dans les différents cadrans
+angtotal:=360;
+angd:=0;
+
+vardef SurfZ(text t_)=
+ surfz:=true;
+ save _SurfZ;
+ picture _SurfZ;
+ color alt[];
+ nbargument:=0;
+ for p_=t_ :
+ if string p_:
+ scantokens("vardef Fz(expr X,Y)="&p_&" enddef;");
+ else:
+ nbargument:=nbargument+1;
+ NN[nbargument]:=p_;
+ fi;
+ endfor;
+ apj:=0;sign:=0;
+ Zmax:=-infinity;
+ Zmin:=infinity;
+ if nbargument=6:
+ xmin:=NN1;
+ xmax:=NN2;
+ ymin:=NN3;
+ ymax:=NN4;
+ nblignes:=NN5;
+ nbpoints:=NN6;
+ IncX:=(xmax-xmin)/nbpoints;
+ IncY:=(ymax-ymin)/nblignes;
+ color Yc[][],Xc[][],Fc[][];
+ for ligne=0 upto nblignes:
+ y:=ymax-ligne*IncY;
+ x:=xmin;
+ Yc[ligne][0]=(x,y,Fz(x,y));
+ for k=1 upto nbpoints:
+ Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
+ endfor;
+ endfor;
+ for k=0 upto (nblignes-1):
+ for l=0 step 3 until (nbpoints-3):
+ apj:=apj+1;
+ cpt[apj]:=apj;
+ Fc[apj][1]:=Yc[k][l];
+ Fc[apj][2]:=Yc[k][l+3];
+ Fc[apj][3]:=Yc[k+1][l+3];
+ Fc[apj][4]:=Yc[k+1][l];
+ Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+ ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+ if Zpart(Fc[apj].iso)>Zmax:
+ Zmax:=Zpart(Fc[apj].iso);
+ fi;
+ if Zpart(Fc[apj].iso)<Zmin:
+ Zmin:=Zpart(Fc[apj].iso);
+ fi;
+ if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
+ Vue[apj]:=true;
+ else:
+ Vue[apj]:=false
+ fi;
+ endfor;
+ endfor;
+ else:
+ raymax:=NN1;
+ pray:=NN2;
+ nblignes:=NN3;
+ for r=rayd step pray until (raymax-pray):
+ for y=0 step 1 until (nblignes-1):
+ apj:=apj+1;
+ cpt[apj]:=apj;
+ Fc[apj][1]:=(r*cosd(angd+y*(angtotal/nblignes)),r*sind(angd+y*(angtotal/nblignes)),Fz(r*cosd(angd+y*(angtotal/nblignes)),r*sind(angd+y*(angtotal/nblignes))));
+ Fc[apj][2]:=(r*cosd(angd+(y+1)*(angtotal/nblignes)),r*sind(angd+(y+1)*(angtotal/nblignes)),Fz(r*cosd(angd+(y+1)*(angtotal/nblignes)),r*sind(angd+(y+1)*(angtotal/nblignes))));
+ Fc[apj][3]:=((r+pray)*cosd(angd+(y+1)*(angtotal/nblignes)),(r+pray)*sind(angd+(y+1)*(angtotal/nblignes)),Fz((r+pray)*cosd(angd+(y+1)*(angtotal/nblignes)),(r+pray)*sind(angd+(y+1)*(angtotal/nblignes))));
+ Fc[apj][4]:=((r+pray)*cosd(angd+y*(angtotal/nblignes)),(r+pray)*sind(angd+y*(angtotal/nblignes)),Fz((r+pray)*cosd(angd+y*(angtotal/nblignes)),(r+pray)*sind(angd+y*(angtotal/nblignes))));
+ Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+ if Zpart(Fc[apj].iso)>Zmax:
+ Zmax:=Zpart(Fc[apj].iso);
+ fi;
+ if Zpart(Fc[apj].iso)<Zmin:
+ Zmin:=Zpart(Fc[apj].iso);
+ fi;
+ ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+ if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
+ Vue[apj]:=true;
+ else:
+ Vue[apj]:=false
+ fi;
+ endfor;
+ endfor;
+ fi;
+ %On range les faces par un QS en fonction de leur profondeur
+ QS(1,apj);
+ %On affiche toutes les faces par ordre décroissant de profondeur.
+ _SurfZ=image(
+ pickup pencircle scaled 0.25bp;
+ for k=1 upto apj:
+ fill for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle withcolor if couleurz:
+ if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+ else:
+ ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+ fi;
+ else:
+ if Vue[cpt[k]]:
+ if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+ else:lumin(cpt[k])*outcolor fi
+ else: lumin(cpt[k])*incolor fi;
+ if traits=true:
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle;
+ fi;
+ fi;
+ if traits=true:
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle;
+ fi;
+ endfor;
+ );
+ surfz:=false;
+ _SurfZ
+enddef;
+
+%Objet prédéfinis
+vardef ObjetCube(expr ar)=
+ NbS:=8;
+ Sommet1:=(ar,0,0);
+ Sommet2:=(ar,ar,0);
+ Sommet3:=(0,ar,0);
+ Sommet4:=(0,0,0);
+ Sommet5:=(0,0,ar);
+ Sommet6:=(ar,0,ar);
+ Sommet7:=(ar,ar,ar);
+ Sommet8:=(0,ar,ar);
+%%Faces
+ NF:=6;
+ ns[1][0]:=4;Fc[1][1]:=Sommet1;Fc[1][2]:=Sommet2;Fc[1][3]:=Sommet3;Fc[1][4]:=Sommet4;
+ ns[2][0]:=4;Fc[2][1]:=Sommet4;Fc[2][2]:=Sommet3;Fc[2][3]:=Sommet8;Fc[2][4]:=Sommet5;
+ ns[3][0]:=4;Fc[3][1]:=Sommet1;Fc[3][2]:=Sommet4;Fc[3][3]:=Sommet5;Fc[3][4]:=Sommet6;
+ ns[4][0]:=4;Fc[4][1]:=Sommet5;Fc[4][2]:=Sommet8;Fc[4][3]:=Sommet7;Fc[4][4]:=Sommet6;
+ ns[5][0]:=4;Fc[5][1]:=Sommet2;Fc[5][2]:=Sommet7;Fc[5][3]:=Sommet8;Fc[5][4]:=Sommet3;
+ ns[6][0]:=4;Fc[6][1]:=Sommet1;Fc[6][2]:=Sommet6;Fc[6][3]:=Sommet7;Fc[6][4]:=Sommet2;
+ %
+ %Détermination des faces
+ apj:=0;color cc,dd;
+ for nf=1 upto NF:
+ apj:=apj+1;
+ dd:=Oeil-Fc[nf][1];
+ cc:=invnormale*Normal(Fc[nf][1],Fc[nf][2],Fc[nf][3]);
+ if (ProduitScalaire(dd,cc)>=0):
+ Vue[apj]=true
+ else:
+ Vue[apj]=false;
+ fi;
+ endfor;
+enddef;
+
+%coloriage et lumière
+vardef Hsvtorgb(expr CC)=%CC couleur donnée en hsv d'après http://en.wikipedia.org/wiki/HSL_color_space
+ save $;
+ color $;
+ SSw:=floor(Xpart(CC)/60);
+ SSh:=SSw mod 6;
+ SSf:=(Xpart(CC)/60)-floor(SSw);
+ SSs:=Ypart((CC));
+ SSv:=Zpart((CC));
+ SSp:=SSv*(1-SSs);
+ SSq:=SSv*(1-SSf*SSs);
+ SSt:=SSv*(1-(1-SSf)*SSs);
+ if SSh=0: $=(SSv,SSt,SSp) elseif SSh=1:$=(SSq,SSv,SSp) elseif SSh=2:$=(SSp,SSv,SSt) elseif SSh=3:$=(SSp,SSq,SSv) elseif SSh=4:$=(SSt,SSp,SSv) elseif SSh=5:$=(SSv,SSp,SSq) fi;
+ $
+enddef;
+
+marron=Hsvtorgb((60,1,0.3));
+
+intensite:=2;
+boolean eclairage;
+eclairage:=true;
+
+color Lumiere;
+
+invnormalelum:=1;
+
+vardef lumin(expr nbt)=
+ save $;
+ numeric $;
+ if eclairage=false:
+ $=1;
+ else:
+ color uu,vv;
+ uu=Lumiere-Fc[nbt].iso;
+ uu:=uu/Norm(uu);
+ vv=invnormalelum*Normal(Fc[nbt].iso,Fc[nbt][1],Fc[nbt][2]);
+ if Norm(vv)<>0:
+ vv:=vv/Norm(vv)
+ fi;
+ if (surfz) or (Spar) or (OFF) or (OBJ):
+ $=intensite*abs(ProduitScalaire(vv,uu))
+ else:
+ $=intensite*(ProduitScalaire(vv,uu));
+ fi;
+ if $>1:
+ $:=1;
+ fi;
+ fi;
+ $
+enddef;
+
+
+%%sucre
+
+%%Transparence fait par Anthony Phan
+picture alphapict_; alphapict_=nullpicture;
+color fillcolor; fillcolor=gris;
+fgalpha := 0.5; % usual alpha parameter
+bgalpha:= 1; % alpha parameter with respect to the background
+
+vardef transparence expr c =
+ alphapict_ := nullpicture;
+ alphafill_(currentpicture, c);
+ addto currentpicture also alphapict_;
+enddef;
+
+def alphafill_(expr p, c) =
+ begingroup
+ save p_, xmax_, xmin_, ymax_, ymin_; picture p_;
+ p_ = nullpicture;
+ (xmin_, ymin_) = llcorner c; (xmax_, ymax_) = urcorner c;
+ addto p_ contour c withcolor bgalpha[background, fillcolor];
+ for p__ within p:
+ numeric xmin__, xmax__, ymin__, ymax__;
+ (xmin__, ymin__) = llcorner p__; (xmax__, ymax__) = urcorner p__;
+ if (xmax__<= xmin_) or (xmin__ >= xmax_):
+ else:
+ if (ymax__<= ymin_) or (ymin__ >= ymax_):
+ else:
+ if (not clipped p__) and (not bounded p__):
+ addto p_ also p__ withcolor
+ fgalpha[(redpart p__, greenpart p__, bluepart p__),
+ fillcolor];
+ else:
+ begingroup save alphapict_;
+ picture alphapict_; alphapict_ = nullpicture;
+ alphafill_(p__, pathpart p__);
+ addto p_ also alphapict_;
+ endgroup;
+ fi
+ fi
+ fi
+ endfor
+ clip p_ to c;
+ addto alphapict_ also p_;
+ endgroup;
+enddef;
+
+endinput;
diff --git a/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp b/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp
new file mode 100644
index 00000000000..90d9e7944ab
--- /dev/null
+++ b/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp
@@ -0,0 +1,98 @@
+boolean Poser,Etapes,STOP;
+Poser=true;
+STOP=false;
+
+color CouleurRemplis;
+
+vardef Stop=
+ if Etapes:
+ if k>Total-1:
+ STOP:=true;
+ fi;
+ fi;
+enddef;
+
+vardef Av(expr pas)=
+ Stop;
+ if STOP=false:
+ A[k+1]-A[k]=ut*pas*VecteurDpt;
+ B[tt+1]:=A[k+1];
+ RetiensAngle[k+1]:=RetiensAngle[k];
+ if Poser:
+ draw A[k]--A[k+1] withpen pencircle scaled Epaisseur;
+ %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+ fi;
+ fi;
+ k:=k+1;
+ tt:=tt+1;
+enddef;
+
+vardef Re(expr pas)=
+ Stop;
+ if STOP=false:
+ A[k+1]-A[k]=-ut*pas*VecteurDpt;
+ B[tt+1]:=A[k+1];
+ RetiensAngle[k+1]:=RetiensAngle[k];
+ if Poser:
+ draw A[k]--A[k+1] withpen pencircle scaled Epaisseur;
+ %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+ fi;
+ fi;
+ k:=k+1;
+ tt:=tt+1;
+enddef;
+
+vardef Tg(expr pas)=
+ Stop;
+ if STOP=false:
+ VecteurDpt:=rotation(VecteurDpt,(0,0),pas);
+ A[k+1]:=A[k];
+ B[tt+1]:=A[k+1];
+ %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+ RetiensAngle[k+1]:=RetiensAngle[k]+pas;
+ Angle:=Angle+pas;
+ fi;
+ k:=k+1;
+ tt:=tt+1;
+enddef;
+
+vardef Td(expr pas)=
+ Stop;
+ if STOP=false:
+ VecteurDpt:=rotation(VecteurDpt,(0,0),-pas);
+ A[k+1]:=A[k];
+ B[tt+1]:=A[k+1];
+ %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+ RetiensAngle[k+1]:=RetiensAngle[k]-pas;
+ Angle:=Angle-pas;
+ fi;
+ k:=k+1;
+ tt:=tt+1;
+enddef;
+
+vardef Bc=
+ Stop;
+ if STOP=false:
+ Poser:=true;
+ fi;
+enddef;
+
+vardef Lc=
+ Stop;
+ if STOP=false:
+ Poser:=false;
+ fi;
+enddef;
+
+vardef Teleporter(expr xpas,ypas)=
+ Stop;
+ if STOP=false:
+ A[k+1]:=A[k]+ut*(xpas,ypas);
+ B[tt+1]:=A[k+1];
+ fi;
+ k:=k+1;
+ tt:=tt+1;
+enddef;
+
+k=0;
+tt=0;