X-Git-Url: https://melusine.eu.org/syracuse/G/git/?p=mp-solid.git;a=blobdiff_plain;f=mp-solid.mp;h=a7ea6a7effeceddbf603dc51b066de87ea3ed62a;hp=49d35fa2173decbbfa178bafa92f431765260495;hb=HEAD;hpb=ad5e6752247d5d6dcaf41a2c63f2aa979437820e diff --git a/mp-solid.mp b/mp-solid.mp index 49d35fa..a7ea6a7 100644 --- a/mp-solid.mp +++ b/mp-solid.mp @@ -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)=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. @@ -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;