push artificiel
[mp-solid.git] / mp-solid.mp
index 49d35fa..a7ea6a7 100644 (file)
@@ -1,32 +1,26 @@
-%% =============================================================================
-%% 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;
@@ -37,7 +31,7 @@ input objets;
 
 color Sommet[];
 
-%Anthony Phan
+%Anthony Phan
 vardef Norm primary z =
   abs (abs(Xpart z, Ypart z), Zpart z)
 enddef;
@@ -48,7 +42,7 @@ let Zpart = bluepart;
 %
 
 string typerepre,pointilles;
-typerepre := "persp";
+typerepre:="persp";
 
 vardef Initialisation(expr r,t,p,d)=
   Rho:=r;
@@ -158,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,
@@ -685,10 +691,20 @@ vardef Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)=%fonction
        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;
@@ -709,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.
@@ -761,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.