summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCSolides.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCSolides.tex')
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCSolides.tex866
1 files changed, 866 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCSolides.tex b/macros/latex/contrib/profcollege/latex/PfCSolides.tex
new file mode 100644
index 0000000000..35bbeb74f5
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCSolides.tex
@@ -0,0 +1,866 @@
+%%%
+% Solide et sections
+%%%
+\setKVdefault[ClesSolides]{Nom=cube,Aretes,Sommets,Pointilles,Largeur=1.5,Hauteur=1,Profondeur=0.75,ListeSommets={A,B,C,D,E,F,G,H},Rho=1500,Phi=30,Theta=20,Distance=50,Code=false,Couleur=white,Anglex=0,RayonCone=1,HauteurCone=2,HauteurPyramide=2,SommetsPyramide=5,Reguliere=false,DecalageSommet={(0,0,0)},RayonCylindre=1,HauteurCylindre=2,RayonSphere=1,AutoLabel=true,Sections=false,CoefSection=0.3,Axes=false,PointsSection={M,N,O,P},RemplisSection=false,ObjetSection={0.5,E,H,0.25,F,G,G,B}}%
+\defKV[ClesSolides]{Traces=\setKV[ClesSolides]{Code}}%
+\defKV[ClesSolides]{Section=\setKV[ClesSolides]{Sections}}%
+\defKV[ClesSolides]{CouleurSection=\setKV[ClesSolides]{RemplisSection}}%
+
+\newcommand\MPSolideCylindre[3]{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ input PfCSolid;
+
+ boolean NommeSommets,Code,Sections,Axes,RemplisSection;
+ NommeSommets=\useKV[ClesSolides]{Sommets};
+ Code=\useKV[ClesSolides]{Code};
+ Sections:=\useKV[ClesSolides]{Sections};
+ Axes:=\useKV[ClesSolides]{Axes};
+ RemplisSection=\useKV[ClesSolides]{RemplisSection};
+ if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi;
+ %Initialisation
+ PfCRho=\useKV[ClesSolides]{Rho};
+ PfCPhi=\useKV[ClesSolides]{Phi};
+ PfCTheta=\useKV[ClesSolides]{Theta};
+ PfCDistance=\useKV[ClesSolides]{Distance};
+ CoefSection=\useKV[ClesSolides]{CoefSection};
+ anglerotationx=\useKV[ClesSolides]{Anglex};
+ rayoncylindre=\useKV[ClesSolides]{RayonCylindre};
+ hauteurcylindre=\useKV[ClesSolides]{HauteurCylindre};
+
+ string Section;
+ if Sections:Section=\useKV[ClesSolides]{Section};fi;
+
+ color PfCOutColor;
+ PfCOutColor=\useKV[ClesSolides]{Couleur};
+
+ vardef BaseCylindre(text t)=
+ save Cer;
+ picture Cer;
+ save n;
+ n:=0;
+ for p_=t:
+ if color p_:
+ n:=n+1;
+ _T[n]:=p_;
+ fi;
+ endfor;
+ pascercle:=5;
+ color ptcer[];
+ for k=0 step pascercle until (360+pascercle) :
+ ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5]));
+ endfor;
+ %
+ color ddcer,cccer;
+ nbpointilles:=0;
+ nbtraces:=0;
+ path PathSection[];
+ nbpathsection:=0;
+ Cer=image(%
+ for k=0 step pascercle until 360:
+ ddcer:=Oeil-ptcer[k div pascercle];
+ cccer:=-Normal(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2);
+ if (ProduitScalaire(ddcer,cccer)>=0):
+ nbtraces:=nbtraces+1;
+ if (nbtraces=1) and (nbpointilles>0):
+ draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2);
+ fi;
+ nbpathsection:=nbpathsection+1;
+ PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2);
+ else:
+ nbpointilles:=nbpointilles+1;
+ nbtraces:=0;
+ if (nbpointilles=1):
+ draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2);
+ fi;
+ if k mod (2*pascercle)=0:
+ nbpathsection:=nbpathsection+1;
+ PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2);
+ fi;
+ fi;
+ endfor;
+ );
+ Cer
+ enddef;
+
+ Figure(-10u,-10u,10u,10u);
+ Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance);
+% Initialisation(1500,30,20,50);
+ typetrace:="3D";
+ typerepre:="persp";
+ eclairage:=false;
+ nb:=36;%36
+ subh:=1;%
+ incolor:=white;
+ outcolor:=PfCOutColor;
+ Ferme1:=true;
+ angx:=anglerotationx;
+ Objetcylindre1("r="&decimal(rayoncylindre),"h="&decimal(hauteurcylindre));
+ eclairage:=false;
+% traits:=false;
+% AffichageObjet1;
+
+ color O,S,A,M,B,C,D,Sommet[];
+ Sommet2=(0,0,0);
+ Sommet1-Sommet2=(0,0,hauteurcylindre);
+ Sommet3-Sommet2=rayoncylindre*(cosd(0),-sind(0),0);
+ Sommet4-Sommet2=rayoncylindre*(cosd(90),-sind(90),0);
+ color MSection[];
+ MSection[1]-Sommet2=rayoncylindre*(CoefSection,sin(arccos(CoefSection)),0);
+ MSection[7]-Sommet2=rayoncylindre*(CoefSection+0.01,sin(arccos(CoefSection+0.01)),0);
+ MSection[2]-Sommet2=rayoncylindre*(CoefSection,-sin(arccos(CoefSection)),0);
+ MSection[3]-MSection[2]=Sommet1-Sommet2;
+ MSection[4]-MSection[1]=Sommet1-Sommet2;
+ MSection[5]-Sommet2=CoefSection[Sommet1,Sommet2];
+ MSection[6]-MSection[5]=MSection[2]-MSection[1];
+ Sommet1:=RotXYZ(Sommet1);
+ Sommet2:=RotXYZ(Sommet2);
+ Sommet3:=RotXYZ(Sommet3);
+ Sommet4:=RotXYZ(Sommet4);
+ MSection[1]:=RotXYZ(MSection[1]);
+ MSection[2]:=RotXYZ(MSection[2]);
+ MSection[3]:=RotXYZ(MSection[3]);
+ MSection[4]:=RotXYZ(MSection[4]);
+ MSection[5]:=RotXYZ(MSection[5]);
+ MSection[6]:=RotXYZ(MSection[6]);
+ MSection[7]:=RotXYZ(MSection[7]);
+
+ trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4);
+ currentpicture:=nullpicture;
+
+ if Sections:
+ if Section="parallele":
+ if RemplisSection:
+ fill polygone(MSection[1],MSection[2],MSection[3],MSection[4]) withcolor CouleurSection;
+ fi;
+ color dcer,ccer;
+ invnormale:=if CoefSection<=0:-1 else:1 fi;
+ %1er côté et 3eme côté : face "basse" et face "haute"
+ dcer:=Oeil-Sommet3;
+ ccer:=-Normal(Sommet3,MSection1,MSection2);
+ draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi;
+ draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi;
+ % 2eme côté et 4eme coté
+ dcer:=Oeil-MSection7;
+ ccer:=-Normal(MSection7,MSection4,MSection1);
+ draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi;
+ draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi;
+ else:
+ if RemplisSection:
+ fill (PathSection[1] for p_=2 upto nbpathsection:--PathSection[p_] endfor--cycle) shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2)) withcolor CouleurSection;
+ fi;
+ for p_=1 upto nbpathsection:
+ draw (PathSection[p_] shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2)));
+ endfor;
+ fi;
+ fi;
+
+ trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4);
+
+ color dcer,ccer;
+ dcer:=Oeil-Sommet2;
+ ccer:=Normal(Sommet2,Sommet3,Sommet4);
+ if (ProduitScalaire(dcer,ccer)>=0):
+ draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4);
+ fi;
+ dcer:=Oeil-Sommet1;
+ ccer:=Normal(Sommet1,Sommet4+Sommet1-Sommet2,Sommet3+Sommet1-Sommet2);
+ if (ProduitScalaire(dcer,ccer)>=0):
+ draw Cercles(Sommet1,Sommet3+Sommet1-Sommet2,Sommet1,Sommet3+Sommet1-Sommet2,Sommet4+Sommet1-Sommet2);
+ fi;
+
+ vardef EcrireSommets(text t)=
+ nb:=0;
+ for p_=t:
+ nb:=nb+1;
+ if bluepart(Sommet1)>bluepart(Sommet2):
+ if nb=1:
+ label.ulft(TEX(p_),Projette(Sommet1));%p_
+ elseif nb=2:
+ dotlabel.rt(TEX(p_),Projette(Sommet2));%p_
+ fi;
+ else:
+ if nb=1:
+ label.bot(TEX(p_),Projette(Sommet1));
+ elseif nb=2:
+ dotlabel.ulft(TEX(p_),Projette(Sommet2));
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ DefinirSommets(#1);
+ DefinirSommetsSection(#3);
+
+ if Axes:
+ draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3);
+ remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1));
+ remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2));
+ fi;
+
+ if Code:
+ \useKV[ClesSolides]{Traces};
+ fi;
+
+ \end{mplibcode}
+ \fi
+}
+
+\newcommand\MPSolidePyramide[4]{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+
+ input PfCSolid;
+
+ boolean Pointilles,TraceArete,NommeSommets,Code,Reguliere,AutoLabel,Sections,RemplisSection;
+ Sections:=\useKV[ClesSolides]{Sections};
+ RemplisSection=\useKV[ClesSolides]{RemplisSection};
+ if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi;
+ AutoLabel:=\useKV[ClesSolides]{AutoLabel};
+ Pointilles=\useKV[ClesSolides]{Pointilles};
+ TraceArete=\useKV[ClesSolides]{Aretes};
+ NommeSommets=\useKV[ClesSolides]{Sommets};
+ Code=\useKV[ClesSolides]{Code};
+ Reguliere:=\useKV[ClesSolides]{Reguliere};
+ % Initialisation
+ PfCRho=\useKV[ClesSolides]{Rho};
+ PfCPhi=\useKV[ClesSolides]{Phi};
+ PfCTheta=\useKV[ClesSolides]{Theta};
+ PfCDistance=\useKV[ClesSolides]{Distance};
+ CoefSection=\useKV[ClesSolides]{CoefSection};
+ anglerotationx=\useKV[ClesSolides]{Anglex};
+ hauteurpyramide=\useKV[ClesSolides]{HauteurPyramide};
+ nombresommets=\useKV[ClesSolides]{SommetsPyramide};
+ color PfCOutColor,DecalageSommet;
+ PfCOutColor=\useKV[ClesSolides]{Couleur};
+ DecalageSommet=if Reguliere:(0,0,0) else: #3 fi;
+
+ Figure(-10u,-10u,10u,10u);
+ Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance);
+ typetrace:="3D";
+ typerepre:="persp";
+ if Pointilles=false:
+ pointilles:="non";
+ fi;
+
+ Ferme1:=true;
+
+ color O,A[],S;
+ O=(0,0,0);
+ S-O=(0,0,hauteurpyramide)+DecalageSommet;
+
+ NbS:=nombresommets;
+ Sommet1:=S;
+ ecartangle=360/(NbS-1);
+ for k=2 upto NbS:
+ if Reguliere:
+ repereangle:=(k-2)*ecartangle;
+ else:
+ repereangle:=(k-2)*ecartangle+(ecartangle*0.25+uniformdeviate(floor(ecartangle/2)));
+ fi;
+ Sommet[k]:=(cosd(repereangle),-sind(repereangle),0);
+ endfor;
+ Sommet[NbS+1]:=Sommet[2];
+
+ color TS[];
+ for k=1 upto (NbS+1):
+ TS[k]=Sommet[k];
+ endfor;
+ color PiedHauteur;
+ PiedHauteur=ProjectionsurPlan(Sommet1,Sommet2,Sommet3,Sommet4);
+ eclairage:=false;
+ traits:=false;
+ outcolor:=PfCOutColor;
+ angx:=anglerotationx;
+ for k=1 upto (NbS+1):
+ TS[k]:=RotXYZ(TS[k]);
+ endfor;
+ angx:=0;
+
+ color MSection[];
+ for p_=2 upto NbS:
+ MSection[p_-1]=CoefSection[Sommet[1],Sommet[p_]];
+ endfor;
+
+ DefinirSommetsSection(#4);
+
+ vardef SectionPyramide(expr fracsection)=
+ save Section;
+ picture Section;
+ Section=image(%
+ if RemplisSection:
+ remplis polygone(fracsection[Sommet1,Sommet2],for p_=3 upto NbS-1:fracsection[Sommet1,Sommet[p_]],endfor fracsection[Sommet1,Sommet[NbS]]) withcolor CouleurSection;
+ fi;
+ color dcer,ccer;
+ for p_=2 upto NbS:
+ dcer:=Oeil-Sommet[p_];
+ ccer:=-Normal(Sommet1,Sommet[p_],Sommet[p_+1]);
+ if (ProduitScalaire(dcer,ccer)>=0):
+ draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]);
+ else:
+ draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]) dashed evenly;
+ fi;
+ endfor;
+ );
+ Section
+ enddef;
+
+ ObjetNew1(%
+ TS1, for k=2 upto NbS:TS[k], endfor TS[NbS+1]
+ )(%
+ NbS-1, for p_=2 upto NbS:p_, endfor
+ for p=2 upto NbS:
+ 3,1,p+1,p,%
+ endfor);
+ AffichageObjet1;
+
+ Sommet[NbS+1]:=Sommet[2];
+
+ if Sections:
+ draw SectionPyramide(CoefSection);
+ fi;
+
+ NF:=NbS;%nombresommets;
+ % Fc[100] est la base
+ Fc[100]:=NbS-1;
+ for k=2 upto NbS:
+ Fc[100+k-1]:=k;
+ endfor;
+ for k=2 upto NF:
+ Fc[k*100]:=3;
+ Fc[k*100+1]:=1;
+ Fc[k*100+2]:=k+1;
+ Fc[k*100+3]:=k;
+ endfor;
+ DessineObjet;
+
+ vardef EcrireSommets(text t)=
+ if AutoLabel:
+ nb:=0;
+ for p_=t:
+ nb:=nb+1;
+ if nb<NbS+1:
+ if nb>1:
+ label(TEX(""&p_&""),1.1[Projette(Sommet1),Projette(Sommet[nb])]);
+ else:
+ label(TEX(p_),1.1[Projette(Sommet[2]),Projette(Sommet[1])]);
+ fi;
+ fi;
+ endfor;
+ fi;
+ enddef;
+
+ DefinirSommets(#1);
+
+ if TraceArete=false:
+ currentpicture:=nullpicture;
+ fi;
+ if NommeSommets:
+ EcrireSommets(#2);
+ fi;
+ u:=0.25u;
+ marque_p:="croix";
+ nbcroix=0;
+ for p_=#1:
+ nbcroix:=nbcroix+1;
+ if nbcroix<NbS+1:
+ pointe(p_);
+ fi;
+ endfor;
+ u:=1cm;
+ if Code:
+ \useKV[ClesSolides]{Traces};
+ fi;
+
+ \end{mplibcode}
+ \fi
+}
+
+\newcommand\MPSolideCone[3]{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ boolean NommeSommets,Code,Sections,Axes,RemplisSection;
+ NommeSommets=\useKV[ClesSolides]{Sommets};
+ Code=\useKV[ClesSolides]{Code};
+ Axes:=\useKV[ClesSolides]{Axes};
+ Sections=\useKV[ClesSolides]{Sections};
+ RemplisSection=\useKV[ClesSolides]{RemplisSection};
+ if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi;
+ %Initialisation
+ PfCRho=\useKV[ClesSolides]{Rho};
+ PfCPhi=\useKV[ClesSolides]{Phi};
+ PfCTheta=\useKV[ClesSolides]{Theta};
+ PfCDistance=\useKV[ClesSolides]{Distance};
+ CoefSection=\useKV[ClesSolides]{CoefSection};
+ anglerotationx=\useKV[ClesSolides]{Anglex};
+ rayoncone=\useKV[ClesSolides]{RayonCone};
+ hauteurcone=\useKV[ClesSolides]{HauteurCone};
+
+ color PfCOutColor;
+ PfCOutColor=\useKV[ClesSolides]{Couleur};
+ input PfCSolid;
+
+ vardef BaseCone(text t)=
+ save Cer;
+ picture Cer;
+ save n;
+ n:=0;
+ for p_=t:
+ if color p_:
+ n:=n+1;
+ _T[n]:=p_;
+ fi;
+ endfor;
+ pascercle:=5;
+ color ptcer[];
+ for k=0 step pascercle until (360+pascercle) :
+ ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5]));
+ endfor;
+ %
+ color ddcer,cccer;
+ nbpointilles:=0;
+ nbtraces:=0;
+ Cer=image(%
+ for k=0 step pascercle until 360:
+ ddcer:=Oeil-ptcer[k div pascercle];
+ cccer:=-Normal(Sommet1,ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ if (ProduitScalaire(ddcer,cccer)>=0):
+ nbtraces:=nbtraces+1;
+ if (nbtraces=1) and (nbpointilles>0):
+ draw chemin(ptcer[k div pascercle],Sommet1);
+ fi;
+ draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ else:
+ nbpointilles:=nbpointilles+1;
+ nbtraces:=0;
+ if (nbpointilles=1):
+ draw chemin(ptcer[k div pascercle],Sommet1);
+ fi;
+ if k mod (2*pascercle)=0:
+ draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]);
+ fi;
+ fi;
+ endfor;
+ );
+ Cer
+ enddef;
+
+ Figure(-10u,-10u,10u,10u);
+ Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance);
+ typetrace:="3D";
+ typerepre:="persp";
+ eclairage:=false;
+ nb:=36;%36
+ subh:=1;%
+ incolor:=white;
+ outcolor:=PfCOutColor;
+ Ferme1:=true;
+ angx:=anglerotationx;
+ Objetcone1("r="&decimal(rayoncone),"h="&decimal(hauteurcone));
+ traits:=false;
+ AffichageObjet1;
+
+ color Sommet[];%O,S,A,M,B,C,D,
+ Sommet2=(0,0,0);
+ Sommet1-Sommet2=(0,0,hauteurcone);
+ Sommet3-Sommet2=rayoncone*(cosd(0),-sind(0),0);
+ Sommet4-Sommet2=rayoncone*(cosd(90),-sind(90),0);
+ Sommet1:=RotXYZ(Sommet1);
+ Sommet3:=RotXYZ(Sommet3);
+ Sommet4:=RotXYZ(Sommet4);
+
+ color MSection[];
+ MSection[1]=CoefSection[Sommet1,Sommet2];
+
+ DefinirSommetsSection(#3);
+
+ if Sections:
+ if RemplisSection:
+ remplis Cercles(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]) withcolor CouleurSection;
+ fi;
+ trace BaseCone(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]);
+ fi;
+
+ trace BaseCone(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4);
+ color dcer,ccer;
+ dcer:=Oeil-Sommet2;
+ ccer:=Normal(Sommet2,Sommet3,Sommet4);
+ if (ProduitScalaire(dcer,ccer)>=0):
+ draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4);
+ fi;
+
+ vardef EcrireSommets(text t)=
+ nb:=0;
+ for p_=t:
+ nb:=nb+1;
+ if bluepart(Sommet1)>bluepart(Sommet2):
+ if nb=1:
+ label.ulft(TEX(p_),Projette(Sommet1));
+ elseif nb=2:
+ dotlabel.rt(TEX(p_),Projette(Sommet2));
+ fi;
+ else:
+ if nb=1:
+ label.bot(TEX(p_),Projette(Sommet1));
+ elseif nb=2:
+ dotlabel.ulft(TEX(p_),Projette(Sommet2));
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ DefinirSommets(#1);
+
+ if Axes:
+ draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3);
+ remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1));
+ remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2));
+ fi;
+
+ if Code:
+ \useKV[ClesSolides]{Traces};
+ fi;
+
+ \end{mplibcode}
+ \fi
+}
+
+\newcommand\MPSolidePave[5]{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ input PfCSolid;
+
+ boolean Pointilles,TraceArete,NommeSommets,Code,AutoLabel,Sections,RemplisSection;
+ AutoLabel:=\useKV[ClesSolides]{AutoLabel};
+ Pointilles=\useKV[ClesSolides]{Pointilles};
+ TraceArete=\useKV[ClesSolides]{Aretes};
+ NommeSommets=\useKV[ClesSolides]{Sommets};
+ Code=\useKV[ClesSolides]{Code};
+ Sections:=\useKV[ClesSolides]{Sections};
+ RemplisSection=\useKV[ClesSolides]{RemplisSection};
+ if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi;
+
+ string Section;
+ if Sections:Section=\useKV[ClesSolides]{Section};fi;
+
+ %Initialisation
+ PfCRho=\useKV[ClesSolides]{Rho};
+ PfCPhi=\useKV[ClesSolides]{Phi};
+ PfCTheta=\useKV[ClesSolides]{Theta};
+ PfCDistance=\useKV[ClesSolides]{Distance};
+
+ Figure(-10u,-10u,10u,10u);
+ Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance);
+ typetrace:="3D";
+ typerepre:="persp";
+ if Pointilles=false:
+ pointilles:="non";
+ fi;
+ color A,B,C,D,E,F,G,H;
+ color Sommet[];
+ trace Pave(A,B,C,D,E,F,G,H)(#3);
+ currentpicture:=nullpicture;
+ Sommet1=A;
+ Sommet2=B;
+ Sommet3=C;
+ Sommet4=D;
+ Sommet5=E;
+ Sommet6=F;
+ Sommet7=G;
+ Sommet8=H;
+
+ DefinirSommets(#1);
+
+ color MSection[];
+ numeric RetiensSection[];
+ numretienssection:=0;
+ color RetiensDefSection[];
+ numretiensdefsection:=0;
+ if Sections:
+ if Section="arete":
+ for p_=#5:
+ if numeric p_:
+ numretienssection:=numretienssection+1;
+ RetiensSection[numretienssection]=p_;
+ elseif color p_:
+ numretiensdefsection:=numretiensdefsection+1;
+ RetiensDefSection[numretiensdefsection]=p_;
+ fi;
+ endfor;
+ % On dessine la section
+ MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]];
+ MSection[2]=(RetiensSection[2])[RetiensDefSection[3],RetiensDefSection[4]];
+ MSection[3]-MSection[2]=RetiensDefSection[6]-RetiensDefSection[5];
+ MSection[4]-MSection[1]=RetiensDefSection[6]-RetiensDefSection[5];
+ if RemplisSection:
+ fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection;
+ fi;
+% DotLabel.top(TEX("M1"),MSection[1]);
+% DotLabel.top(TEX("M2"),MSection[2]);
+% DotLabel.top(TEX("M3"),MSection[3]);
+% DotLabel.top(TEX("M4"),MSection[4]);
+% if RemplisSection:
+% fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection;
+% fi;
+% trace polygone(MSection1,MSection2,MSection3,MSection4);
+ color dcer,ccer;
+ % 1er cote -> ok
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]);
+ draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi;
+ % 2eme cote
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]);
+ draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi;
+ % 3eme cote
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]);
+ draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi;
+ % 4eme cote
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]);
+ draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi;
+ else:
+ %face
+ for p_=#5:
+ if numeric p_:
+ numretienssection:=numretienssection+1;
+ RetiensSection[numretienssection]=p_;
+ elseif color p_:
+ numretiensdefsection:=numretiensdefsection+1;
+ RetiensDefSection[numretiensdefsection]=p_;
+ fi;
+ endfor;
+ % On dessine la section
+ MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]];
+ MSection[2]-MSection[1]=RetiensDefSection[4]-RetiensDefSection[3];
+ MSection[3]-MSection[2]=RetiensDefSection[5]-RetiensDefSection[4];
+ MSection[4]-MSection[1]=MSection[3]-MSection[2];
+% DotLabel.top(TEX("M1"),MSection[1]);
+% DotLabel.top(TEX("M2"),MSection[2]);
+% DotLabel.top(TEX("M3"),MSection[3]);
+% DotLabel.top(TEX("M4"),MSection[4]);
+ if RemplisSection:
+ fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection;
+ fi;
+ color dcer,ccer;
+ % 1er cote -> ok
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]);
+ draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi;
+ % 2eme cote
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]);
+ draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi;
+ % 3eme cote
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]);
+ draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi;
+ % 4eme cote
+ dcer:=Oeil-RetiensDefSection[4];
+ ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]);
+ draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi;
+ fi;
+ %On trace la section considérée
+ %trace polygone(MSection1,MSection2,MSection3,MSection4);
+ fi;
+
+ trace Pave(A,B,C,D,E,F,G,H)(#3);
+
+ DefinirSommetsSection(#4);
+
+ if TraceArete=false:
+ currentpicture:=nullpicture;
+ fi;
+ if NommeSommets:
+ EcrireSommetsPave(#2);
+ fi;
+ u:=0.25u;
+ marque_p:="croix";
+ nbcroix=0;
+ for p_=#1:
+ nbcroix:=nbcroix+1;
+ if nbcroix=4:
+ if Pointilles:
+ pointe(p_);
+ fi;
+ else:
+ pointe(p_);
+ fi;
+ endfor;
+ u:=1cm;
+ if Code:
+ \useKV[ClesSolides]{Traces};
+ fi;
+ \end{mplibcode}
+ \fi
+}
+
+\newcommand\MPSolideSphere[3]{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ boolean NommeSommets,Code,Sections,Axes,RemplisSection;
+ NommeSommets=\useKV[ClesSolides]{Sommets};
+ Code=\useKV[ClesSolides]{Code};
+ Axes:=\useKV[ClesSolides]{Axes};
+ Sections=\useKV[ClesSolides]{Sections};
+ RemplisSection=\useKV[ClesSolides]{RemplisSection};
+ if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi;
+ %Initialisation
+ PfCRho=\useKV[ClesSolides]{Rho};
+ PfCPhi=0;%\useKV[ClesSolides]{Phi};
+ PfCTheta=10;%\useKV[ClesSolides]{Theta};
+ PfCDistance=\useKV[ClesSolides]{Distance};
+ CoefSection=\useKV[ClesSolides]{CoefSection};
+ anglerotationx=\useKV[ClesSolides]{Anglex};
+ rayonsphere=\useKV[ClesSolides]{RayonSphere};
+
+ color PfCOutColor;
+ PfCOutColor=\useKV[ClesSolides]{Couleur};
+ input PfCSolid;
+
+ vardef BaseSphere=
+ save Cer;
+ picture Cer;
+ color PtInter.iso,PtInter[];
+ vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
+ subh:=72;
+ Cer=image(%
+ if Sections:
+ if RemplisSection:fill (Cercles(Image((0,0,0)),Image((0,1,0)),Image((0,0,0)),Image((0,1,0)),Image((-1,0,0))) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)) withcolor CouleurSection; fi;
+ fi;
+ %Equateur
+ umin:=0; umax:=pi/nb; upas:=pi/nb;
+ vmin:=0; vpas:=2*pi/subh; vmax:=2*pi;
+ for l=0 upto subh-1:
+ PtInter[1]:=Image(Famille(umin+(0+1)*upas,vmin+l*vpas));
+ PtInter[2]:=Image(Famille(umin+0*upas,vmin+l*vpas));
+ PtInter[3]:=Image(Famille(umin+0*upas,vmin+(l+1)*vpas));
+ PtInter[4]:=Image(Famille(umin+(0+1)*upas,vmin+(l+1)*vpas));
+ PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4;
+ if ProduitScalaire(Oeil-PtInter.iso,Normal(PtInter.iso,PtInter[4],PtInter[1]))>=0:
+ if Sections:
+ draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1));
+ fi;
+ draw segment(PtInter[3],PtInter[2]);
+ else:
+ if l mod 2=0:
+ if Sections:
+ draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1));
+ fi;
+ draw segment(PtInter[3],PtInter[2]);
+ fi;
+ fi;
+ endfor;
+
+ % "Exterieur"
+ nb:=72;
+ subh:=18;
+ umin:=-pi; umax:=pi; upas:=2*pi/nb;
+ vpas:=2*pi/subh; vmin:=pi/2; vmax:=2*pi;
+ for k=0 upto nb-1:
+ PtInter[1]:=Image(Famille(umin+(k+1)*upas,vmin+0*vpas));
+ PtInter[2]:=Image(Famille(umin+k*upas,vmin+0*vpas));
+ PtInter[3]:=Image(Famille(umin+k*upas,vmin+(0+1)*vpas));
+ PtInter[4]:=Image(Famille(umin+(k+1)*upas,vmin+(0+1)*vpas));
+ PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4;
+ draw segment(PtInter[2],PtInter[1]);
+ endfor;
+ );
+ Cer
+ enddef;
+
+ Figure(-10u,-10u,10u,10u);
+ Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance);
+ typetrace:="3D";
+ typerepre:="persp";
+ eclairage:=false;
+ nb:=24;%36
+ subh:=36;%
+ incolor:=blue;
+ outcolor:=white;%PfCOutColor;
+ Ferme1:=true;
+ angx:=anglerotationx;
+ Objetsphere1("R="&decimal(rayonsphere));
+ % traits:=false;
+ % AffichageObjet1;
+ color Sommet[],SommetN,SommetS,SommetB;
+ Sommet1=(0,0,0);
+ Sommet2=(0,rayonsphere,0);
+ Sommet3=(-rayonsphere,0,0);
+ Sommet4=(0,0,rayonsphere);
+ SommetN=Sommet4;
+ SommetS=(0,0,-rayonsphere);
+ SommetB=(rayonsphere,0,0);
+ Sommet2:=RotXYZ(Sommet2);
+ Sommet3:=RotXYZ(Sommet3);
+ Sommet4:=RotXYZ(Sommet4);
+ SommetN:=RotXYZ(SommetN);
+ SommetS:=RotXYZ(SommetS);
+ SommetB:=RotXYZ(SommetB);
+ color MSection[];
+ MSection[1]=CoefSection[Sommet1,SommetN];
+ MSection[2]=Image((0,sqrt(1-CoefSection**2),CoefSection));
+
+ trace BaseSphere;
+
+ DefinirSommets(#1);
+ DefinirSommetsSection(#3);
+
+ if Axes:
+ draw segment(1.25[SommetN,SommetS],1.25[SommetS,SommetN]) dashed dashpattern(on6 off3 on3 off3);
+ remplis (fullcircle scaled 1mm) shifted(Projette(SommetN));
+ remplis (fullcircle scaled 1mm) shifted(Projette(SommetS));
+ fi;
+
+ if Code:
+ \useKV[ClesSolides]{Traces};
+ fi;
+
+ \end{mplibcode}
+ \fi
+}
+
+\def\UpdatetoksSolide#1\nil{\addtotok\toksolidelistesommets{"#1",}}
+\newtoks\toksolidelistesommets%
+\newtoks\toksolidelistepointssections%
+
+\newcommand\Solide[1][]{%
+ \useKVdefault[ClesSolides]%
+ \setKV[ClesSolides]{#1}%
+ \setsepchar{,}\ignoreemptyitems%
+ \xdef\foo{\useKV[ClesSolides]{ListeSommets}}%
+ \readlist*\ListeNomSommet{\foo}%\showitems\ListeNomSommet
+ \reademptyitems%
+ \toksolidelistesommets{}
+ \foreachitem\compteur\in\ListeNomSommet{\expandafter\UpdatetoksSolide\compteur\nil}%\the\toksolidelistesommets%
+ \IfStrEqCase{\useKV[ClesSolides]{Nom}}{%
+ {cube}{%
+ \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{1,1,1}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}%
+ }%
+ {pave}{%
+ \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{Profondeur},\useKV[ClesSolides]{Largeur},\useKV[ClesSolides]{Hauteur}}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}%
+ }%
+ {cone}{%
+ \MPSolideCone{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}%
+ }%
+ {pyramide}{%
+ \MPSolidePyramide{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{DecalageSommet}}{\useKV[ClesSolides]{PointsSection}}%
+ }%
+ {cylindre}{%
+ \MPSolideCylindre{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}%
+ }%
+ {sphere}{%
+ \MPSolideSphere{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}%
+ }%
+ }%
+}% \ No newline at end of file