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 primarydef u Vectprod v =
156 (Ypart u * Zpart v - Zpart u * Ypart v,
157 Zpart u * Xpart v - Xpart u * Zpart v,
158 Xpart u * Ypart v - Ypart u * Xpart v)
161 vardef Normal(expr vecun,vecde,vectr)=
164 P1:=redpart(vecde-vecun);
165 P2:=greenpart(vecde-vecun);
166 P3:=bluepart(vecde-vecun);
167 Q1:=redpart(vectr-vecun);
168 Q2:=greenpart(vectr-vecun);
169 Q3:=bluepart(vectr-vecun);
170 aa=(P2*Q3-Q2*P3,P3*Q1-Q3*P1,P1*Q2-Q1*P2);
174 vardef ProduitScalaire(expr wec,mor)=
175 %Mexp(Mlog redpart(wec) Mmul Mlog redpart(mor))+Mexp(Mlog greenpart(wec) Mmul Mlog greenpart(mor))+Mexp(Mlog bluepart(wec) Mmul Mlog bluepart(mor))
176 Xpart(wec)*Xpart(mor)+Ypart(wec)*Ypart(mor)+Zpart(wec)*Zpart(mor)
178 %pour les rotations et translations
180 vardef RotX(expr ptx)=
181 (Xpart(ptx),Ypart(ptx)*cosd(angx)-Zpart(ptx)*sind(angx),Ypart(ptx)*sind(angx)+Zpart(ptx)*cosd(angx))
184 vardef RotY(expr ptx)=
185 (Xpart(ptx)*cosd(angy)+Zpart(ptx)*sind(angy),Ypart(ptx),-Xpart(ptx)*sind(angy)+Zpart(ptx)*cosd(angy))
188 vardef RotZ(expr ptx)=
189 (Xpart(ptx)*cosd(angz)-Ypart(ptx)*sind(angz),Xpart(ptx)*sind(angz)+Ypart(ptx)*cosd(angz),Zpart(ptx))
192 vardef RotXYZ(expr ptx)=
193 RotZ(RotY(RotX(ptx)))
202 vardef VT(expr t)=Fp(t)/Norm(Fp(t))
205 vardef VN(expr t)=Fd(t)/Norm(Fd(t))
208 vardef VBN(expr t)=VT(t) Vectprod VN(t)
213 pair coinbg,coinbd,coinhd,coinhg;
216 def feuille(expr xa,ya,xb,yb) =
217 feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle;
223 z.so=(xpart(coinbg/1cm),ypart(coinbg/1cm));
224 z.ne=(xpart(coinhd/1cm),ypart(coinhd/1cm));
226 extra_endfig := "clip currentpicture to feuillet;" & extra_endfig;
229 def figureespace(expr xa,ya,xb,yb) =
232 feuille(xa,ya,xb,yb);
233 _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi;
241 def QS(expr ndeb,nfin)=
247 for i=(ndeb+1) upto nfin:
250 x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x;
253 x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x;
268 vardef DessineObjetNew=
270 %on détermine les zmax dans le repère spatial de l'écran
272 Fc[k].iso:=(0,0,0) for l=1 upto ns[k][0]:
275 Fc[k].iso:=Fc[k].iso/ns[k][0];
278 %ALT[k]=-Zpart(GCoord(Fc[k].iso));
280 for l=1 upto ns[k][0]:
281 t:=-Zpart(GCoord(Fc[k][l]));
289 %On trie suivant les zmax
294 draw for l=1 upto ns[cpt[k]][0]:
295 Projette(Fc[cpt[k]][l])--
297 cycle if Vue[cpt[k]]=false: dashed evenly fi;
303 fill for l=1 upto ns[cpt[k]][0]:
304 Projette(Fc[cpt[k]][l])--
308 lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
310 lumin(cpt[k])*outcolor
313 draw for l=1 upto ns[cpt[k]][0]:
314 Projette(Fc[cpt[k]][l])--
320 fill for l=1 upto ns[cpt[k]][0]:
321 Projette(Fc[cpt[k]][l])--
326 lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
328 lumin(cpt[k])*outcolor
331 lumin(cpt[k])*incolor
334 draw for l=1 upto ns[cpt[k]][0]:
335 Projette(Fc[cpt[k]][l])--
344 color Fc[][];%représente les sommets des différentes faces;
346 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
347 boolean OFF,OBJ;%pour utiliser la lumière "correctement"
351 vardef LectureOFF(expr nomsolide)=
353 %Détermination du nombre de sommets et de faces.
355 s_=readfrom nomsolide;
359 t_ := if ss1="%": 0 else: 1 fi;
361 ss[incr t_] := loptok s_;
366 NbS:=round(Mexp Mlog_str ss1);
367 NF:=round(Mexp Mlog_str ss2);
368 message("Il y a "&decimal(NbS)&" sommets.");
369 message("Il y a "&decimal(NF)&" faces au total.");
370 %Détermination des coordonnées des sommets
371 message("Création des sommets.");
372 s_:=readfrom nomsolide;
375 s_:=readfrom nomsolide;
378 n_ := if ss1="%": 0 else: 1 fi;
380 ss[incr n_] := loptok s_;
385 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
386 %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
387 %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
391 s_:=readfrom nomsolide;
394 n_ := if ss1="%": 0 else: 1 fi;
396 ss[incr n_] := loptok s_;
401 Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
402 %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
403 %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
406 message("Création des faces.");
407 %Détermination des faces
410 for nf=-4000 upto (-4000+NF)-1:
411 s_:=readfrom nomsolide;
414 n_ := if ss1="%": 0 else: 1 fi;
416 ss[incr n_] := loptok s_;
422 ns[apj][0]:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
423 for nl=1 upto ns[apj][0]:
424 Fc[apj][nl]:=Sommet[round(Mexp Mlog_str ss[nl+1])];
427 cc:=invnormale*Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]);
428 if (ProduitScalaire(dd,cc)>=0):
439 message("Faces vues déterminees : il y en a "&decimal(nbfvues)&".");
444 vardef LectureOBJ(expr nomfichier)=
451 s_:=readfrom nomfichier;
457 ss[incr n_] := loptok s_;
460 Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
465 ss[incr n_] := loptok s_;
469 for k=1 upto ns[apj][0]:
471 Fc[apj][ns[apj][0]-k+1] := Sommet[round(Mexp(Mlog_str ss[k]))]
472 %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
473 % show OTFc.@[apj][OTFc.@[apj].nb-k+1];
476 Fc[apj][k] := Sommet[round(Mexp(Mlog_str ss[k]))]
477 %if unknown OTFc.@[apj][k]:
478 % show OTFc.@[apj][k];
482 if ProduitScalaire(Oeil-Fc[apj][1],Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]))>=0:
496 closefrom nomfichier;
503 vardef Tube(expr Fn,dp,ds,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
506 scantokens("vardef F(expr t)="&Fn&" enddef;");
507 scantokens("vardef Fp(expr t)="&dp&" enddef;");
508 scantokens("vardef Fd(expr t)="&ds&" enddef;");
510 %nb point sur le cercle
514 G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*(360/nb))*VN(tmin+l*pas)+sind(k*(360/nb))*VBN(tmin+l*pas));
523 Fc[apj][2]:=G[l][k+1];
524 Fc[apj][3]:=G[l+1][k+1];
525 Fc[apj][4]:=G[l+1][k];
526 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
527 ALT[apj]:=-Zpart(GCoord(Fc[apj][1]));
534 Projette(Fc[cpt[k]][l])--
536 cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
537 else: lumin(cpt[k])*outcolor fi;
539 Projette(Fc[cpt[k]][l])--
541 cycle withpen pencircle scaled0.25bp;
548 %pour les tubes new :)
549 vardef T(expr t)=Fp(t)
552 vardef VTn(expr t)=if Norm(T(t))=0:
562 __VN=T(t) Vectprod ((T(t+nn)-T(t-nn))/2);
566 __VN:=__VN/Norm(__VN);
567 if ProduitScalaire(VNbisprec[t-nn],__VN)>0:
568 _VNBis=__VN/Norm(__VN)
570 _VNBis=-(__VN/Norm(__VN))
577 vardef VBNn(expr t)=VTn(t) Vectprod VNn(t)
580 vardef Tuben(expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas
583 scantokens("vardef F(expr t)="&Fn&" enddef;");
584 scantokens("vardef Fp(expr t)="&dp&" enddef;");
586 %nb point sur le cercle
589 %pour gérer le "flip" aux points d'inflexion
591 VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
596 G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
605 Fc[apj][2]:=G[l][k+1];
606 Fc[apj][3]:=G[l+1][k+1];
607 Fc[apj][4]:=G[l+1][k];
608 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
609 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
616 Projette(Fc[cpt[k]][l])--
618 cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
619 else: lumin(cpt[k])*outcolor fi;
621 Projette(Fc[cpt[k]][l])--
623 cycle withpen pencircle scaled0.25bp;
630 vardef Fonction(expr fn,tmin,tmax,pas)=%fonction
631 scantokens("vardef F(expr t)="&fn&" enddef;");
635 for k=tmin+pas step pas until tmax:
641 color outcolor,incolor,outcolorbis;
646 vardef Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)=%fonction
649 scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
652 %On crée les facettes et on calcule la profondeur en Z.
653 for k=umin step upas until umax:
654 for l=vmin step vpas until vmax:
657 Fc[apj][1]:=Image(Famille(k+upas,l));
658 Fc[apj][2]:=Image(Famille(k,l));
659 Fc[apj][3]:=Image(Famille(k,l+vpas));
660 Fc[apj][4]:=Image(Famille(k+upas,l+vpas));
661 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][3])/2;%(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
662 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
663 if ProduitScalaire(Oeil-Fc[apj].iso,invnormale*Normal(Fc[apj].iso,Fc[apj][1],Fc[apj][2]))>=0:
670 %On range les faces par un QS en fonction de leur profondeur
672 %On affiche toutes les faces par ordre décroissant de profondeur.
676 Projette(Fc[cpt[k]][l])--
678 cycle withcolor if Vue[cpt[k]]:
679 if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
680 else: lumin(cpt[k])*outcolor fi
681 else:lumin(cpt[k])*incolor fi;
684 Projette(Fc[cpt[k]][l])--
689 Projette(Fc[cpt[k]][l])--
691 cycle withcolor if Vue[cpt[k]]:
692 if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
693 else: lumin(cpt[k])*outcolor fi
694 else:lumin(cpt[k])*incolor fi;
702 vardef Revolution(expr fn,umin,umax,upas,vmin,vmax,vpas)=
703 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)
706 boolean traits;%sur une idée d'Herbert Voss à propos de pst-solides :)
707 %sert à désactiver le tracer des traits
708 %15/07/08:pour l'instant implanter uniquement pour les surfaces en z
711 boolean arcenciel;%pour essayer d'obtenir des dégradés tels que pst-solides :)
717 vardef SurfZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
723 scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
725 IncX:=(xmax-xmin)/nbpoints;
726 IncY:=(ymax-ymin)/nblignes;
727 color Yc[][],Xc[][],Fc[][];
728 for ligne=0 upto nblignes:
731 Yc[ligne][0]=(x,y,Fz(x,y));
732 for k=1 upto nbpoints:
733 Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
736 %for ligne=0 step 3 until nbpoints:
737 % x:=xmax-ligne*IncX;
738 % for k=0 step 3 until nblignes:
739 % Xc[ligne div 3][k div 3]=(x,ymin+k*IncY,Fz(x,ymin+k*IncY));
742 for k=0 upto (nblignes-1):
743 for l=0 step 3 until (nbpoints-3):
746 Fc[apj][1]:=Yc[k][l];
747 Fc[apj][2]:=Yc[k][l+3];
748 Fc[apj][3]:=Yc[k+1][l+3];
749 Fc[apj][4]:=Yc[k+1][l];
750 Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
751 ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
752 if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
759 %On range les faces par un QS en fonction de leur profondeur
761 %On affiche toutes les faces par ordre décroissant de profondeur.
763 pickup pencircle scaled 0.25bp;
766 Projette(Fc[cpt[k]][l])--
768 cycle withcolor if Vue[cpt[k]]:
769 if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
770 else:lumin(cpt[k])*outcolor fi
771 else: lumin(cpt[k])*incolor fi;
774 Projette(Fc[cpt[k]][l])--
785 vardef ObjetCube(expr ar)=
797 ns[1][0]:=4;Fc[1][1]:=Sommet1;Fc[1][2]:=Sommet2;Fc[1][3]:=Sommet3;Fc[1][4]:=Sommet4;
798 ns[2][0]:=4;Fc[2][1]:=Sommet4;Fc[2][2]:=Sommet3;Fc[2][3]:=Sommet8;Fc[2][4]:=Sommet5;
799 ns[3][0]:=4;Fc[3][1]:=Sommet1;Fc[3][2]:=Sommet4;Fc[3][3]:=Sommet5;Fc[3][4]:=Sommet6;
800 ns[4][0]:=4;Fc[4][1]:=Sommet5;Fc[4][2]:=Sommet8;Fc[4][3]:=Sommet7;Fc[4][4]:=Sommet6;
801 ns[5][0]:=4;Fc[5][1]:=Sommet2;Fc[5][2]:=Sommet7;Fc[5][3]:=Sommet8;Fc[5][4]:=Sommet3;
802 ns[6][0]:=4;Fc[6][1]:=Sommet1;Fc[6][2]:=Sommet6;Fc[6][3]:=Sommet7;Fc[6][4]:=Sommet2;
804 %Détermination des faces
809 cc:=invnormale*Normal(Fc[nf][1],Fc[nf][2],Fc[nf][3]);
810 if (ProduitScalaire(dd,cc)>=0):
818 %coloriage et lumière
819 vardef Hsvtorgb(expr CC)=%CC couleur donnée en hsv d'après http://en.wikipedia.org/wiki/HSL_color_space
822 SSw:=floor(Xpart(CC)/60);
824 SSf:=(Xpart(CC)/60)-floor(SSw);
828 SSq:=SSv*(1-SSf*SSs);
829 SSt:=SSv*(1-(1-SSf)*SSs);
830 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;
834 marron=Hsvtorgb((60,1,0.3));
844 vardef lumin(expr nbt)=
851 uu=Lumiere-Fc[nbt].iso;
853 vv=invnormalelum*Normal(Fc[nbt].iso,Fc[nbt][1],Fc[nbt][2]);
857 if (surfz) or (Spar) or (OFF) or (OBJ):
858 $=intensite*abs(ProduitScalaire(vv,uu))
860 $=intensite*(ProduitScalaire(vv,uu));
872 %%Transparence fait par Anthony Phan
873 picture alphapict_; alphapict_=nullpicture;
874 color fillcolor; fillcolor=gris;
875 fgalpha := 0.5; % usual alpha parameter
876 bgalpha:= 1; % alpha parameter with respect to the background
878 vardef transparence expr c =
879 alphapict_ := nullpicture;
880 alphafill_(currentpicture, c);
881 addto currentpicture also alphapict_;
884 def alphafill_(expr p, c) =
886 save p_, xmax_, xmin_, ymax_, ymin_; picture p_;
888 (xmin_, ymin_) = llcorner c; (xmax_, ymax_) = urcorner c;
889 addto p_ contour c withcolor bgalpha[background, fillcolor];
891 numeric xmin__, xmax__, ymin__, ymax__;
892 (xmin__, ymin__) = llcorner p__; (xmax__, ymax__) = urcorner p__;
893 if (xmax__<= xmin_) or (xmin__ >= xmax_):
895 if (ymax__<= ymin_) or (ymin__ >= ymax_):
897 if (not clipped p__) and (not bounded p__):
898 addto p_ also p__ withcolor
899 fgalpha[(redpart p__, greenpart p__, bluepart p__),
902 begingroup save alphapict_;
903 picture alphapict_; alphapict_ = nullpicture;
904 alphafill_(p__, pathpart p__);
905 addto p_ also alphapict_;
912 addto alphapict_ also p_;