Retour

Source : donymodule.mp

donymodule.mp
%%Module pour la géométrie dans l'espace d'après R.DONY "Graphismes scientifiques sur ordinateur" & "Graphismes dans le plan et dans l'espace".
 
%%TO DO
%Autres solides
%Appel par nom de fichier
%Animations
%Surfaces z=f(x,y)
 
input geometriesyr12;
input marith;
%input format;
init_numbers(btex $-$ etex, btex$1$etex, btex$ times 10$etex, btex$"" sup -$etex, btex$"" sup 2$etex);
 
color Sommet[];
 
color C[];
C0=jaune;
C1=violet;
C2=orange;
C3=ciel;
C4=vert;
C5=bleu;
C6=rouge;
 
%généralité
vardef Projette(expr X)=
  pair $;
  Xobs := -redpart(X)*Aux1 + greenpart(X)*Aux3;
  Yobs := -redpart(X)*Aux5 - greenpart(X)*Aux6 + bluepart(X)*Aux4;
  Zobs := -redpart(X)*Aux7 - greenpart(X)*Aux8 - bluepart(X)*Aux2 + Rho;
  XProj := DE*Xobs/Zobs;
  YProj := DE*Yobs/Zobs;
  $=(XProj,YProj);
  $
enddef;
 
string pointilles;
 
vardef Initialisation(expr r,t,p,d)=
  Rho:=r;
  Theta:=t;
  Phi:=p;
  DE:=d;
  Aux1:=sind(Theta);
  Aux2:=sind(Phi);
  Aux3:=cosd(Theta);
  Aux4:=cosd(Phi);
  Aux5:=Aux3*Aux2;
  Aux6:=Aux1*Aux2;
  Aux7:=Aux3*Aux4;
  Aux8:=Aux1*Aux4;
  pointilles:="oui";
enddef;
 
%vues cachées
 
%lecture des faces et sommets;
vardef LectureSommet=
  color Sommet[];
%%A compléter si on souhaite inclure des nouveaux sommets
enddef;
 
vardef LectureFace=
%%A compléter si on souhaite définir les faces
enddef;
 
vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2)
enddef;
 
vardef Vision(expr num)=
  save bb;
  color bb;
  bb=(redpart(Oeil-Sommet[num]),greenpart(Oeil-Sommet[num]),bluepart(Oeil-Sommet[num]));
  bb
enddef;
 
vardef Normal(expr vecun,vecde,vectr)=
  save aa;
  color aa;
  P1:=redpart(vecde-vecun);
  P2:=greenpart(vecde-vecun);
  P3:=bluepart(vecde-vecun);
  Q1:=redpart(vectr-vecun);
  Q2:=greenpart(vectr-vecun);
  Q3:=bluepart(vectr-vecun);
  aa=(P2*Q3-Q2*P3,P3*Q1-Q3*P1,P1*Q2-Q1*P2);
  aa
enddef;
 
vardef ProduitScalaire(expr wec,mor)=
  redpart(wec)*redpart(mor)+greenpart(wec)*greenpart(mor)+bluepart(wec)*bluepart(mor)
enddef;
 
vardef DessineObjet=
  for l=1 upto NF:
    color cc,dd;
    dd=Vision(Fc[l*100+1]);
    cc=Normal(Sommet[Fc[l*100+1]],Sommet[Fc[l*100+2]],Sommet[Fc[l*100+3]]);
    if (ProduitScalaire(dd,cc)<0):
      if pointilles="oui":
	drawoptions(dashed dashpattern(on3bp off9bp));
	trace for k=1 upto Fc[100*l]:
	  Projette(Sommet[Fc[100*l+k]])--
	endfor
	cycle;
      fi;
    else:
      trace for k=1 upto Fc[100*l]:
	Projette(Sommet[Fc[100*l+k]])--
      endfor
      cycle;
    fi;
    drawoptions();
  endfor;
enddef;
 
vardef OrdrepourColore=
  cptvu:=1;%Compteur des faces vues
  cptnvu:=NF;%Compteur des faces non vues
  for l=1 upto NF:
    color cc,dd;
    dd=Vision(Fc[l*100+1]);
    cc=Normal(Sommet[Fc[l*100+1]],Sommet[Fc[l*100+2]],Sommet[Fc[l*100+3]]);
    if (ProduitScalaire(dd,cc)<0):
      Gc[100*cptnvu]:=Fc[100*l];
      for k=1 upto Fc[100*l]:
	Gc[100*cptnvu+k]:=Fc[100*l+k];
      endfor;
      cptnvu:=cptnvu-1;
    else:
      Gc[100*cptvu]:=Fc[100*l];
      for k=1 upto Fc[100*l]:
	Gc[100*cptvu+k]:=Fc[100*l+k];
      endfor;
      cptvu:=cptvu+1;
    fi;
  endfor;
enddef;
 
vardef DessineObjetColore=
  OrdrepourColore;
  for l=1 upto NF:
    color cc,dd;
    dd=Vision(Gc[l*100+1]);
    cc=Normal(Sommet[Gc[l*100+1]],Sommet[Gc[l*100+2]],Sommet[Gc[l*100+3]]);
    if (ProduitScalaire(dd,cc)<0):
      if pointilles="oui":
	drawoptions(dashed dashpattern(on3bp off9bp));
	trace for k=1 upto Gc[100*l]:
	  Projette(Sommet[Gc[100*l+k]])--
	endfor
	cycle;
      fi;
    else:
      fill for k=1 upto Gc[100*l]:
	Projette(Sommet[Gc[100*l+k]])--
      endfor
      cycle withcolor C[l mod 7];
      trace for k=1 upto Gc[100*l]:
	Projette(Sommet[Gc[100*l+k]])--
      endfor
      cycle;
    fi;
    drawoptions();
  endfor;
enddef;
 
vardef TraceAxes=
  color Origine,Unitex,Unitey,Unitez;
  Origine=(0,0,0);
  Unitex=(3,0,0);
  Unitey=(0,3,0);
  Unitez=(0,0,3);
  drawoptions(dashed dashpattern(on 12bp off 6bp on 3bp off 6bp));
  drawarrow Projette(Origine)--Projette(Unitex);
  drawarrow Projette(Origine)--Projette(Unitey);
  drawarrow Projette(Origine)--Projette(Unitez);
  drawoptions();
enddef;
 
vardef TraceGrille=
  drawoptions(dashed evenly withcolor gris);
  color ppt[];
  for k=0 upto 5:
    ppt[k]:=(k,0,0);
    trace Projette(ppt[k]+(0,0,5))--Projette(ppt[k])--Projette(ppt[k]+(0,5,0));
    ppt[k]:=(0,k,0);
    trace Projette(ppt[k]+(5,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,0,5));
    ppt[k]:=(0,0,k);
    trace Projette(ppt[k]+(5,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,5,0));
  endfor;
  drawoptions();
enddef;
 
vardef Graduations=
  color ppp[];
  for k=1 upto 5:
    ppp[k]:=(k,0,0);
    dotlabel.bot(format("%10f",k),Projette(ppp[k]));
    ppp[k]:=(0,k,0);
    dotlabel.bot(format("%10f",k),Projette(ppp[k]));
    ppp[k]:=(0,0,k);
    dotlabel.rt(format("%10f",k),Projette(ppp[k]));
  endfor;
enddef;
 
vardef Projectionxy(expr po)=
  color ess;
  ess=(redpart(po),greenpart(po),0);
  trace Projette(po)--Projette(ess) dashed dashpattern(on 12bp off6bp on 3bp off6bp) withcolor rouge;
enddef;
 
vardef Projectionyz(expr po)=
  color ess;
  ess=(0,greenpart(po),bluepart(po));
  trace Projette(po)--Projette(ess) dashed dashpattern(on 12bp off6bp on 3bp off6bp) withcolor rouge;
enddef;
 
vardef Projectionzx(expr po)=
  color ess;
  ess=(redpart(po),0,bluepart(po));
  trace Projette(po)--Projette(ess) dashed dashpattern(on 12bp off6bp on 3bp off6bp) withcolor rouge;
enddef;
 
vardef Projection(expr po)=
  Projectionxy(po);
  Projectionyz(po);
  Projectionzx(po);
enddef;
 
%%Surfaces d'équations paramétriques
 
vardef FX(expr t,v)=cosd(c*t)*cosd(c*v)
enddef;
 
vardef FY(expr t,v)=cosd(c*t)*sind(c*v)
enddef;
 
vardef FZ(expr t,v)=sind(c*t)
enddef;
 
vardef FamilleDesCourbesEnU=
  for k=Udebut step pasU until Ufin+2*pasU:
    for j=Vdebut step pasV until Vfin:
      trace Projette((FX(k,j),FY(k,j),FZ(k,j)))--Projette((FX(k,j+pasV),FY(k,j+pasV),FZ(k,j+pasV)));
    endfor;
  endfor;
enddef;
 
vardef FamilleDesCourbesEnV=
  for k=Vdebut step pasV until Vfin+pasV:
    for j=Udebut step pasU until Ufin+pasU:
      trace Projette((FX(j,k),FY(j,k),FZ(j,k)))--Projette((FX(j+pasU,k),FY(j+pasU,k),FZ(j+pasU,k)));
    endfor;
  endfor;
enddef;
 
vardef InitialiseParametre(expr ud,uf,up,vd,vf,vp)=
  Udebut:=ud;
  Ufin:=uf;
  pasU:=up;
  Vdebut:=vd;
  Vfin:=vf;
  pasV:=vp;
enddef;
 
%%%%------------------------------------------------------
 
%%Transformations
 
%Translations
 
vardef TranslateSommets(expr v)=
  for k=1 upto NbS:
    Sommet[k]:=Sommet[k]+v;
  endfor;
enddef;
 
vardef SymetriePlanZ(expr vv)=
  for k=1 upto NbS:
    w:=vv-bluepart(Sommet[k]);
    Sommet[k]:=(redpart(Sommet[k]),greenpart(Sommet[k]),w);
  endfor;
enddef;