X-Git-Url: https://melusine.eu.org/syracuse/G/git/?p=mp-solid.git;a=blobdiff_plain;f=mp-solid.mp;fp=mp-solid.mp;h=a7ea6a7effeceddbf603dc51b066de87ea3ed62a;hp=11f5294529ca738a002a0e52fb587449747d8dfe;hb=146790b73eb20d2272e00296cfff3d2539dae7a1;hpb=2d234af911ec062a36b45701b19b1065c765eb4e diff --git a/mp-solid.mp b/mp-solid.mp index 11f5294..a7ea6a7 100644 --- a/mp-solid.mp +++ b/mp-solid.mp @@ -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)=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)=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;