summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/metapost/PfCSolid.mp
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/profcollege/metapost/PfCSolid.mp')
-rw-r--r--macros/latex/contrib/profcollege/metapost/PfCSolid.mp991
1 files changed, 991 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/metapost/PfCSolid.mp b/macros/latex/contrib/profcollege/metapost/PfCSolid.mp
new file mode 100644
index 0000000000..829fad5d30
--- /dev/null
+++ b/macros/latex/contrib/profcollege/metapost/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;