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,
boolean surfz;
surfz:=false;
-
-vardef SurfZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
+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;
- %boolean Vue[];
color alt[];
- scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
+ 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;
- 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)));
+ 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;
- endfor;
- %for ligne=0 step 3 until nbpoints:
- % x:=xmax-ligne*IncX;
- % for k=0 step 3 until nblignes:
- % Xc[ligne div 3][k div 3]=(x,ymin+k*IncY,Fz(x,ymin+k*IncY));
- % 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 ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
- Vue[apj]:=true;
- else:
- Vue[apj]:=false
- fi;
+ 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;
- 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.
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;
+ 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])--
+ Projette(Fc[cpt[k]][l])--
endfor
cycle;
fi;