-%% =============================================================================
-%% Fichier : mp-solid.mp
-%% =============================================================================
-%% Le fichier spatial d'Anthony Phan m'a permis de mettre certaines choses au
-%% clair. ;-)
-%% 14/08/2008
-
+%Le fichier spatial d'Anthony Phan m'a permis de mettre certaines choses au clair. ;-)
+%v1
+%14/08/2008
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;
+%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;
input format;
input marith;
color Sommet[];
-%% Anthony Phan
+%Anthony Phan
vardef Norm primary z =
abs (abs(Xpart z, Ypart z), Zpart z)
enddef;
%
string typerepre,pointilles;
-typerepre := "persp";
+typerepre:="persp";
vardef Initialisation(expr r,t,p,d)=
Rho:=r;
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,
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;
- draw for l=1 upto 4:
- Projette(Fc[cpt[k]][l])--
- endfor
- cycle;
+ if traits=true:
+ draw for l=1 upto 4:
+ Projette(Fc[cpt[k]][l])--
+ endfor
+ cycle;
+ 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;
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;