Refonte de la documentation. Ajout d'une option de coloriage en z dans les surfaces...
[mp-solid.git] / mp-solid.mp
index 11f5294..a7ea6a7 100644 (file)
@@ -152,6 +152,18 @@ vardef TraceAxesDD(expr xd,yd,zd,xf,yf,zf)=
   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,
@@ -713,49 +725,102 @@ arcenciel=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.
@@ -765,13 +830,26 @@ vardef SurfZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
       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;

Licence Creative Commons Les fichiers de Syracuse sont mis à disposition (sauf mention contraire) selon les termes de la
Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.