1 %Le fichier spatial d'Anthony Phan m'a permis de mettre certaines choses au clair. ;-)
9 c:=57.29578; % conversion d'un radian en degrés
10 color rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,cielfonce,orangevif,gris,marron;
18 cielfonce=0.9*(0.25,1,1);
20 orangevif=(1,0.25,0.1);
35 vardef Norm primary z =
36 abs (abs(Xpart z, Ypart z), Zpart z)
40 let Ypart = greenpart;
44 string typerepre,pointilles;
47 vardef Initialisation(expr r,t,p,d)=
64 vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2)
67 vardef sin(expr t) = sind(c*t) enddef;
69 vardef cos(expr t) = cosd(c*t) enddef;
71 vardef tan(expr t) = sin(t)/cos(t) enddef;
73 vardef exp(expr x) = mexp(256)**x enddef;
75 vardef Exp primary x = mexp(256)**x enddef;
77 vardef ln(expr t) = mlog(t)/256 enddef;
79 vardef log(expr t) = ln(t)/ln(10) enddef;
81 vardef ch(expr x)=(exp(x)+exp (-x))/2 enddef;
83 vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
85 vardef th(expr x)=sh(x)/ch(x) enddef;
87 vardef arcsin(expr x)=%Définition mathématique en radian
88 pi*angle((sqrt(1-x**2),x))/180
91 vardef arccos(expr x)=%Définition mathématique en radian
92 pi*angle((x,sqrt(1-x**2)))/180
95 vardef arctan(expr x)=arcsin(x/(1++x))
102 %Coordonnées dans le repère Oeil
103 vardef GCoord(expr N)=
104 (-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)
107 unit:=1;%pour les mises à l'échelle :) Merci pst-solides3d
109 vardef Projette(expr M)=
110 %if typerepre="proj":
111 % unit*(DE*(Xpart(GCoord(M)/Zpart(GCoord(M))),(Ypart(GCoord(M))/Zpart(GCoord(M)))))
112 %elseif typerepre="persp":
113 unit*(DE*(Xpart(GCoord(M)),Ypart(GCoord(M))))
118 color Origine,Unitex,Unitey,Unitez;
123 drawoptions(dashed dashpattern(on 12bp off 6bp on 3bp off 6bp));
124 drawarrow Projette(Origine)--Projette(Unitex) withcolor blue;
125 drawarrow Projette(Origine)--Projette(Unitey) withcolor vert;
126 drawarrow Projette(Origine)--Projette(Unitez);
130 vardef TraceAxesD(expr xd,yd,zd)=
131 drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp));;
132 drawarrow Projette((0,0,0))--Projette((xd,0,0));
133 drawarrow Projette((0,0,0))--Projette((0,yd,0));
134 drawarrow Projette((0,0,0))--Projette((0,0,zd));
136 label(btex $x$ etex,Projette((xd+0.3,0,0)));
137 label(btex $y$ etex,Projette((0,yd+0.3,0)));
138 label(btex $z$ etex,Projette((0,0,zd+0.3)));
141 vardef TraceAxesDD(expr xd,yd,zd,xf,yf,zf)=
142 drawoptions(dashed evenly);
143 draw Projette((0,0,0))--Projette((xd,0,0));
144 draw Projette((0,0,0))--Projette((0,yd,0));
145 draw Projette((0,0,0))--Projette((0,0,zd));
147 drawarrow Projette((xd,0,0))--Projette((xf,0,0));
148 drawarrow Projette((0,yd,0))--Projette((0,yf,0));
149 drawarrow Projette((0,0,zd))--Projette((0,0,zf));
150 label(btex $x$ etex,Projette((xf+0.3,0,0)));
151 label(btex $y$ etex,Projette((0,yf+0.3,0)));
152 label(btex $z$ etex,Projette((0,0,zf+0.3)));
155 vardef TraceGrille(expr NB)=
159 draw Projette(ppt[k]+(0,0,NB))--Projette(ppt[k])--Projette(ppt[k]+(0,NB,0));
161 draw Projette(ppt[k]+(NB,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,0,NB));
163 draw Projette(ppt[k]+(NB,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,NB,0));
167 primarydef u Vectprod v =
168 (Ypart u * Zpart v - Zpart u * Ypart v,
169 Zpart u * Xpart v - Xpart u * Zpart v,
170 Xpart u * Ypart v - Ypart u * Xpart v)
173 vardef Normal(expr vecun,vecde,vectr)=
176 P1:=redpart(vecde-vecun);
177 P2:=greenpart(vecde-vecun);
178 P3:=bluepart(vecde-vecun);
179 Q1:=redpart(vectr-vecun);
180 Q2:=greenpart(vectr-vecun);
181 Q3:=bluepart(vectr-vecun);
182 aa=(P2*Q3-Q2*P3,P3*Q1-Q3*P1,P1*Q2-Q1*P2);
186 vardef ProduitScalaire(expr wec,mor)=
187 %Mexp(Mlog redpart(wec) Mmul Mlog redpart(mor))+Mexp(Mlog greenpart(wec) Mmul Mlog greenpart(mor))+Mexp(Mlog bluepart(wec) Mmul Mlog bluepart(mor))
188 Xpart(wec)*Xpart(mor)+Ypart(wec)*Ypart(mor)+Zpart(wec)*Zpart(mor)
190 %pour les rotations et translations
192 vardef RotX(expr ptx)=
193 (Xpart(ptx),Ypart(ptx)*cosd(angx)-Zpart(ptx)*sind(angx),Ypart(ptx)*sind(angx)+Zpart(ptx)*cosd(angx))
196 vardef RotY(expr ptx)=
197 (Xpart(ptx)*cosd(angy)+Zpart(ptx)*sind(angy),Ypart(ptx),-Xpart(ptx)*sind(angy)+Zpart(ptx)*cosd(angy))
200 vardef RotZ(expr ptx)=
201 (Xpart(ptx)*cosd(angz)-Ypart(ptx)*sind(angz),Xpart(ptx)*sind(angz)+Ypart(ptx)*cosd(angz),Zpart(ptx))
204 vardef RotXYZ(expr ptx)=
205 RotZ(RotY(RotX(ptx)))
214 vardef VT(expr t)=Fp(t)/Norm(Fp(t))
217 vardef VN(expr t)=Fd(t)/Norm(Fd(t))
220 vardef VBN(expr t)=VT(t) Vectprod VN(t)
225 pair coinbg,coinbd,coinhd,coinhg;
228 def feuille(expr xa,ya,xb,yb) =
229 feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle;
235 z.so=(xpart(coinbg/1cm),ypart(coinbg/1cm));
236 z.ne=(xpart(coinhd/1cm),ypart(coinhd/1cm));
238 extra_endfig := "clip currentpicture to feuillet;" & extra_endfig;
241 def figureespace(expr xa,ya,xb,yb) =
244 feuille(xa,ya,xb,yb);
245 _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi;
253 def QS(expr ndeb,nfin)=
259 for i=(ndeb+1) upto nfin:
262 x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x;
265 x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x;
280 vardef DessineObjetNew=
282 %on détermine les zmax dans le repère spatial de l'écran
284 Fc[k].iso:=(0,0,0) for l=1 upto ns[k][0]:
287 Fc[k].iso:=Fc[k].iso/ns[k][0];
290 %ALT[k]=-Zpart(GCoord(Fc[k].iso));
292 for l=1 upto ns[k][0]:
293 t:=-Zpart(GCoord(Fc[k][l]));
301 %On trie suivant les zmax
306 draw for l=1 upto ns[cpt[k]][0]:
307 Projette(Fc[cpt[k]][l])--
309 cycle if Vue[cpt[k]]=false: dashed evenly fi;
315 fill for l=1 upto ns[cpt[k]][0]:
316 Projette(Fc[cpt[k]][l])--
320 lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
322 lumin(cpt[k])*outcolor
325 draw for l=1 upto ns[cpt[k]][0]:
326 Projette(Fc[cpt[k]][l])--
332 fill for l=1 upto ns[cpt[k]][0]:
333 Projette(Fc[cpt[k]][l])--
338 lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
340 lumin(cpt[k])*outcolor
343 lumin(cpt[k])*incolor
346 draw for l=1 upto ns[cpt[k]][0]:
347 Projette(Fc[cpt[k]][l])--
356 color Fc[][];%représente les sommets des différentes faces;
358 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
359 boolean OFF,OBJ;%pour utiliser la lumière "correctement"
363 vardef LectureOFF(expr nomsolide)=
365 %Détermination du nombre de sommets et de faces.
367 s_=readfrom nomsolide;
371 t_ := if ss1="%": 0 else: 1 fi;
373 ss[incr t_] := loptok s_;
378 NbS:=round(Mexp Mlog_str ss1);
379 NF:=round(Mexp Mlog_str ss2);
380 message("Il y a "&decimal(NbS)&" sommets.");
381 message("Il y a "&decimal(NF)&" faces au total.");
382 %Détermination des coordonnées des sommets
383 message("Création des sommets.");
384 s_:=readfrom nomsolide;
387 s_:=readfrom nomsolide;
390 n_ := if ss1="%": 0 else: 1 fi;
392 ss[incr n_] := loptok s_;
397 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
398 %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
399 %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
403 s_:=readfrom nomsolide;
406 n_ := if ss1="%": 0 else: 1 fi;
408 ss[incr n_] := loptok s_;
413 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
414 %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
415 %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
418 message("Création des faces.");
419 %Détermination des faces
422 for nf=-4000 upto (-4000+NF)-1:
423 s_:=readfrom nomsolide;
426 n_ := if ss1="%": 0 else: 1 fi;
428 ss[incr n_] := loptok s_;
434 ns[apj][0]:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
435 for nl=1 upto ns[apj][0]:
436 Fc[apj][nl]:=Sommet[round(Mexp Mlog_str ss[nl+1])];
439 cc:=invnormale*Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]);
440 if (ProduitScalaire(dd,cc)>=0):
451 message("Faces vues déterminees : il y en a "&decimal(nbfvues)&".");
456 vardef LectureOBJ(expr nomfichier)=
463 s_:=readfrom nomfichier;
469 ss[incr n_] := loptok s_;
472 Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
477 ss[incr n_] := loptok s_;
481 for k=1 upto ns[apj][0]:
483 Fc[apj][ns[apj][0]-k+1] := Sommet[round(Mexp(Mlog_str ss[k]))]
484 %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
485 % show OTFc.@[apj][OTFc.@[apj].nb-k+1];
488 Fc[apj][k] := Sommet[round(Mexp(Mlog_str ss[k]))]
489 %if unknown OTFc.@[apj][k]:
490 % show OTFc.@[apj][k];
494 if ProduitScalaire(Oeil-Fc[apj][1],Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]))>=0:
508 closefrom nomfichier;
515 vardef Tube(expr Fn,dp,ds,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
518 scantokens("vardef F(expr t)="&Fn&" enddef;");
519 scantokens("vardef Fp(expr t)="&dp&" enddef;");
520 scantokens("vardef Fd(expr t)="&ds&" enddef;");
522 %nb point sur le cercle
526 G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*(360/nb))*VN(tmin+l*pas)+sind(k*(360/nb))*VBN(tmin+l*pas));
535 Fc[apj][2]:=G[l][k+1];
536 Fc[apj][3]:=G[l+1][k+1];
537 Fc[apj][4]:=G[l+1][k];
538 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
539 ALT[apj]:=-Zpart(GCoord(Fc[apj][1]));
546 Projette(Fc[cpt[k]][l])--
548 cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
549 else: lumin(cpt[k])*outcolor fi;
551 Projette(Fc[cpt[k]][l])--
553 cycle withpen pencircle scaled0.25bp;
560 %pour les tubes new :)
561 vardef T(expr t)=Fp(t)
564 vardef VTn(expr t)=if Norm(T(t))=0:
574 __VN=T(t) Vectprod ((T(t+nn)-T(t-nn))/2);
578 __VN:=__VN/Norm(__VN);
579 if ProduitScalaire(VNbisprec[t-nn],__VN)>0:
580 _VNBis=__VN/Norm(__VN)
582 _VNBis=-(__VN/Norm(__VN))
589 vardef VBNn(expr t)=VTn(t) Vectprod VNn(t)
592 vardef Tuben(expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
595 scantokens("vardef F(expr t)="&Fn&" enddef;");
596 scantokens("vardef Fp(expr t)="&dp&" enddef;");
598 %nb point sur le cercle
601 %pour gérer le "flip" aux points d'inflexion
603 VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
608 G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
617 Fc[apj][2]:=G[l][k+1];
618 Fc[apj][3]:=G[l+1][k+1];
619 Fc[apj][4]:=G[l+1][k];
620 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
621 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
628 Projette(Fc[cpt[k]][l])--
630 cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
631 else: lumin(cpt[k])*outcolor fi;
633 Projette(Fc[cpt[k]][l])--
635 cycle withpen pencircle scaled0.25bp;
642 vardef Fonction(expr fn,tmin,tmax,pas)=%fonction
643 scantokens("vardef F(expr t)="&fn&" enddef;");
647 for k=tmin+pas step pas until tmax:
653 color outcolor,incolor,outcolorbis;
658 vardef Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)=%fonction
661 scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
664 %On crée les facettes et on calcule la profondeur en Z.
665 for k=umin step upas until umax:
666 for l=vmin step vpas until vmax:
669 Fc[apj][1]:=Image(Famille(k+upas,l));
670 Fc[apj][2]:=Image(Famille(k,l));
671 Fc[apj][3]:=Image(Famille(k,l+vpas));
672 Fc[apj][4]:=Image(Famille(k+upas,l+vpas));
673 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][3])/2;%(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
674 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
675 if ProduitScalaire(Oeil-Fc[apj].iso,invnormale*Normal(Fc[apj].iso,Fc[apj][1],Fc[apj][2]))>=0:
682 %On range les faces par un QS en fonction de leur profondeur
684 %On affiche toutes les faces par ordre décroissant de profondeur.
688 Projette(Fc[cpt[k]][l])--
690 cycle withcolor if Vue[cpt[k]]:
691 if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
692 else: lumin(cpt[k])*outcolor fi
693 else:lumin(cpt[k])*incolor fi;
696 Projette(Fc[cpt[k]][l])--
701 Projette(Fc[cpt[k]][l])--
703 cycle withcolor if Vue[cpt[k]]:
704 if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
705 else: lumin(cpt[k])*outcolor fi
706 else:lumin(cpt[k])*incolor fi;
714 vardef Revolution(expr fn,umin,umax,upas,vmin,vmax,vpas)=
715 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)
718 boolean traits;%sur une idée d'Herbert Voss à propos de pst-solides :)
719 %sert à désactiver le tracer des traits
720 %15/07/08:pour l'instant implanter uniquement pour les surfaces en z
723 boolean arcenciel;%pour essayer d'obtenir des dégradés tels que pst-solides :)
733 rayd:=0;%sauf si division par 0 :(
734 %ajout de angtotal et angd pour les cas dans les différents cadrans
738 vardef SurfZ(text t_)=
746 scantokens("vardef Fz(expr X,Y)="&p_&" enddef;");
748 nbargument:=nbargument+1;
762 IncX:=(xmax-xmin)/nbpoints;
763 IncY:=(ymax-ymin)/nblignes;
764 color Yc[][],Xc[][],Fc[][];
765 for ligne=0 upto nblignes:
768 Yc[ligne][0]=(x,y,Fz(x,y));
769 for k=1 upto nbpoints:
770 Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
773 for k=0 upto (nblignes-1):
774 for l=0 step 3 until (nbpoints-3):
777 Fc[apj][1]:=Yc[k][l];
778 Fc[apj][2]:=Yc[k][l+3];
779 Fc[apj][3]:=Yc[k+1][l+3];
780 Fc[apj][4]:=Yc[k+1][l];
781 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
782 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
783 if Zpart(Fc[apj].iso)>Zmax:
784 Zmax:=Zpart(Fc[apj].iso);
786 if Zpart(Fc[apj].iso)<Zmin:
787 Zmin:=Zpart(Fc[apj].iso);
789 if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
800 for r=rayd step pray until (raymax-pray):
801 for y=0 step 1 until (nblignes-1):
804 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))));
805 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))));
806 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))));
807 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))));
808 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
809 if Zpart(Fc[apj].iso)>Zmax:
810 Zmax:=Zpart(Fc[apj].iso);
812 if Zpart(Fc[apj].iso)<Zmin:
813 Zmin:=Zpart(Fc[apj].iso);
815 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
816 if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
824 %On range les faces par un QS en fonction de leur profondeur
826 %On affiche toutes les faces par ordre décroissant de profondeur.
828 pickup pencircle scaled 0.25bp;
831 Projette(Fc[cpt[k]][l])--
833 cycle withcolor if couleurz:
834 if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
836 ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
840 if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
841 else:lumin(cpt[k])*outcolor fi
842 else: lumin(cpt[k])*incolor fi;
845 Projette(Fc[cpt[k]][l])--
852 Projette(Fc[cpt[k]][l])--
863 vardef ObjetCube(expr ar)=
875 ns[1][0]:=4;Fc[1][1]:=Sommet1;Fc[1][2]:=Sommet2;Fc[1][3]:=Sommet3;Fc[1][4]:=Sommet4;
876 ns[2][0]:=4;Fc[2][1]:=Sommet4;Fc[2][2]:=Sommet3;Fc[2][3]:=Sommet8;Fc[2][4]:=Sommet5;
877 ns[3][0]:=4;Fc[3][1]:=Sommet1;Fc[3][2]:=Sommet4;Fc[3][3]:=Sommet5;Fc[3][4]:=Sommet6;
878 ns[4][0]:=4;Fc[4][1]:=Sommet5;Fc[4][2]:=Sommet8;Fc[4][3]:=Sommet7;Fc[4][4]:=Sommet6;
879 ns[5][0]:=4;Fc[5][1]:=Sommet2;Fc[5][2]:=Sommet7;Fc[5][3]:=Sommet8;Fc[5][4]:=Sommet3;
880 ns[6][0]:=4;Fc[6][1]:=Sommet1;Fc[6][2]:=Sommet6;Fc[6][3]:=Sommet7;Fc[6][4]:=Sommet2;
882 %Détermination des faces
887 cc:=invnormale*Normal(Fc[nf][1],Fc[nf][2],Fc[nf][3]);
888 if (ProduitScalaire(dd,cc)>=0):
896 %coloriage et lumière
897 vardef Hsvtorgb(expr CC)=%CC couleur donnée en hsv d'après http://en.wikipedia.org/wiki/HSL_color_space
900 SSw:=floor(Xpart(CC)/60);
902 SSf:=(Xpart(CC)/60)-floor(SSw);
906 SSq:=SSv*(1-SSf*SSs);
907 SSt:=SSv*(1-(1-SSf)*SSs);
908 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;
912 marron=Hsvtorgb((60,1,0.3));
922 vardef lumin(expr nbt)=
929 uu=Lumiere-Fc[nbt].iso;
931 vv=invnormalelum*Normal(Fc[nbt].iso,Fc[nbt][1],Fc[nbt][2]);
935 if (surfz) or (Spar) or (OFF) or (OBJ):
936 $=intensite*abs(ProduitScalaire(vv,uu))
938 $=intensite*(ProduitScalaire(vv,uu));
950 %%Transparence fait par Anthony Phan
951 picture alphapict_; alphapict_=nullpicture;
952 color fillcolor; fillcolor=gris;
953 fgalpha := 0.5; % usual alpha parameter
954 bgalpha:= 1; % alpha parameter with respect to the background
956 vardef transparence expr c =
957 alphapict_ := nullpicture;
958 alphafill_(currentpicture, c);
959 addto currentpicture also alphapict_;
962 def alphafill_(expr p, c) =
964 save p_, xmax_, xmin_, ymax_, ymin_; picture p_;
966 (xmin_, ymin_) = llcorner c; (xmax_, ymax_) = urcorner c;
967 addto p_ contour c withcolor bgalpha[background, fillcolor];
969 numeric xmin__, xmax__, ymin__, ymax__;
970 (xmin__, ymin__) = llcorner p__; (xmax__, ymax__) = urcorner p__;
971 if (xmax__<= xmin_) or (xmin__ >= xmax_):
973 if (ymax__<= ymin_) or (ymin__ >= ymax_):
975 if (not clipped p__) and (not bounded p__):
976 addto p_ also p__ withcolor
977 fgalpha[(redpart p__, greenpart p__, bluepart p__),
980 begingroup save alphapict_;
981 picture alphapict_; alphapict_ = nullpicture;
982 alphafill_(p__, pathpart p__);
983 addto p_ also alphapict_;
990 addto alphapict_ also p_;