diff options
author | Norbert Preining <norbert@preining.info> | 2022-11-03 03:05:14 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-11-03 03:05:14 +0000 |
commit | c3c9975778ff2848e51f6debf733abe8ca930bd3 (patch) | |
tree | 034fcccacf40343842462b161df1764d3a7a41af /macros/latex/contrib/profcollege | |
parent | 2281af8ba8fd52341e706f3979712f3280fcfdad (diff) |
CTAN sync 202211030305
Diffstat (limited to 'macros/latex/contrib/profcollege')
-rw-r--r-- | macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf | bin | 9163233 -> 9348583 bytes | |||
-rw-r--r-- | macros/latex/contrib/profcollege/latex/ProfCollege.sty | 1417 | ||||
-rw-r--r-- | macros/latex/contrib/profcollege/metapost/PfCObjets.mp | 2085 | ||||
-rw-r--r-- | macros/latex/contrib/profcollege/metapost/PfCPseudo.mp | 4 | ||||
-rw-r--r-- | macros/latex/contrib/profcollege/metapost/PfCScratch.mp | 85 | ||||
-rw-r--r-- | macros/latex/contrib/profcollege/metapost/PfCScratchpdf.mp | 68 | ||||
-rw-r--r-- | macros/latex/contrib/profcollege/metapost/PfCSolid.mp | 991 | ||||
-rw-r--r-- | macros/latex/contrib/profcollege/metapost/PfCTurtleTestRemplis.mp | 98 |
8 files changed, 4193 insertions, 555 deletions
diff --git a/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf b/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf Binary files differindex 0790608386..73f0d7167d 100644 --- a/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf +++ b/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf diff --git a/macros/latex/contrib/profcollege/latex/ProfCollege.sty b/macros/latex/contrib/profcollege/latex/ProfCollege.sty index d45f25b5ce..e6cc0a8a68 100644 --- a/macros/latex/contrib/profcollege/latex/ProfCollege.sty +++ b/macros/latex/contrib/profcollege/latex/ProfCollege.sty @@ -2,9 +2,9 @@ % licence : Released under the LaTeX Project Public License v1.3c % or later, see http://www.latex-project.org/lppl.txtf \NeedsTeXFormat{LaTeX2e}% -\def\filedate{2022/10/12}% +\def\filedate{2022/12/01}% \let\PfCfiledate\filedate% -\def\fileversion{0.99-z-a}% +\def\fileversion{0.99-z-b}% \let\PfCfileversion\fileversion% \ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college] @@ -347,6 +347,351 @@ } %%% +% Vue Cubes +%%% +\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false} + +\newtoks\toklisteVueCube% +\def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}% + +\NewDocumentCommand\VueCubes{o m}{% + \useKVdefault[VueCubes]% + \setKV[VueCubes]{#1} + \ifboolKV[VueCubes]{Solution}{% + \BuildVueCubesSolution% + }{% + \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit" + \ignoreemptyitems% + \readlist*\PfCListeHauteursCubes{#2}% + \reademptyitems% + \toklisteVueCube{}% + \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}% + \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}% + }{% + \BuildVueCubes{\useKV[VueCubes]{Angle}}{}% + }% + }% +}% + +\NewDocumentCommand\BuildVueCubes{m m}{% + \ifluatex + \mplibforcehmode + \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% + \begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=#1; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + boolean Trou,FaceVue,Creation,Grille; + Trou:=\useKV[VueCubes]{Trou}; + FaceVue:=\useKV[VueCubes]{Face}; + Creation:=\useKV[VueCubes]{Creation}; + Grille:=\useKV[VueCubes]{Grilles}; + + TotalObj:=0; + + vardef CreationSolide(text t)= + PfCnbcubes:=0; + for p_=t: + m:=(PfCnbcubes div Profondeur); + k:=(PfCnbcubes mod Profondeur); + hauteurtour[m+1][k+1]:=p_; + for l=1 upto hauteurtour[m+1][k+1]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2); + ObjetDeplacement[TotalObj](0); + endfor; + PfCnbcubes:=incr PfCnbcubes; + endfor; + enddef; + + Initialisation(2500,Phi,20,50); + Objetcube0("a="&decimal(Echelle)); + + if Creation: + CreationSolide(#2); + else: + for k=1 upto Profondeur:%4 profondeur + hauteurtour[0][k]:=Hauteur;%5 hauteur totale + endfor; + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + if Trou: + if m>1: + hauteurtour[m][k]:=floor(uniformdeviate(hauteurtour[m-1][k]+1));%5 hauteur totale + else: + hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale + fi; + else: + hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale + fi; + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + fi; + + % Pour la fleche + path Fleche; + color A[]; + if FaceVue: + A0=Echelle*(1,Largeur/2,0); + A1-A0=0.25*(2,2,0); + A2-A1=0.25*(0,-1,0); + A3-A2=0.25*(2,0,0); + A4-A3=0.25*(0,-2,0); + A5-A4=A2-A3; + A6-A5=A2-A1; + Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; + fill Fleche withcolor CouleurFleche; + draw Fleche; + fi; + + nbobj:=TotalObj; + DessineFusion; + + if Grille: + % dessus + color Ad[]; + Ad0=(0.5Echelle,0.5*Echelle,-0.5); + Ad1-Ad0=(0,Largeur*Echelle,0); + Ad2-Ad1=(-Profondeur*Echelle,0,0); + Ad3-Ad2=Ad0-Ad1; + draw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; + for k=1 upto Largeur-1: + draw Projette((k/Largeur)[Ad0,Ad1])--Projette((k/Largeur)[Ad3,Ad2]); + endfor; + for k=1 upto Profondeur-1: + draw Projette((k/Profondeur)[Ad0,Ad3])--Projette((k/Profondeur)[Ad1,Ad2]); + endfor; + % face + color Af[]; + Af0=(-1-Profondeur*Echelle,0.5*Echelle,0); + Af1-Af0=(0,Largeur*Echelle,0); + Af2-Af1=(0,0,Hauteur*Echelle); + Af3-Af2=Af0-Af1; + draw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; + for k=1 upto Largeur-1: + draw Projette((k/Largeur)[Af0,Af1])--Projette((k/Largeur)[Af3,Af2]); + endfor; + for k=1 upto Hauteur-1: + draw Projette((k/Hauteur)[Af0,Af3])--Projette((k/Hauteur)[Af1,Af2]); + endfor; + % droite + color Adg[]; + Adg0=(0.5Echelle,-Largeur*Echelle-1,0); + Adg1-Adg0=(-Profondeur*Echelle,0,0); + Adg2-Adg1=(0,0,Hauteur*Echelle); + Adg3-Adg2=Adg0-Adg1; + draw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; + for k=1 upto Profondeur-1: + draw Projette((k/Profondeur)[Adg0,Adg1])--Projette((k/Profondeur)[Adg3,Adg2]); + endfor; + for k=1 upto Hauteur-1: + draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]); + endfor; + fi; + + %draw (llcorner currentpicture)--(lrcorner currentpicture)--(urcorner currentpicture)--(ulcorner currentpicture)--cycle; + \end{mplibcode} + \ifboolKV[VueCubes]{Grilles}{}{% + \hspace*{1.5cm} + \begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=#1; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi+90,30,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + if Grille: + undraw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; + undraw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; + undraw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; + fi; + + path Fleche; + if FaceVue: + Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; + fill Fleche withcolor CouleurFleche; + draw Fleche; + fi; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode} + }% + \fi +}% + +\NewDocumentCommand\BuildVueCubesSolution{}{% + \ifluatex% + \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% + \begin{NiceTabular}{ccc}% + Vue de face&Vue de dessus&Vue de gauche\\ + {\begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=0; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi,0,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode}}& + {\begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=0; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi,90,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode}}&{\begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=-90; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi,0,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode}}\\ + \end{NiceTabular}% + \fi% +}% + +%%% % Codage RLE %%% \setKVdefault[RLE]{Largeur=10pt,Taille=5,Unite=1cm,Solution=false,Enonce=true} @@ -641,8 +986,24 @@ %%% % Tortue %%% -\setKVdefault[Tortue]{Pas=0.2mm,Etapes=false,Nom=\jobname,Grille=false,LargeurG=10,HauteurG=10,TortueD=false,TortueF=false,Epaisseur=1,Angle=0,Debut=false,Depart={(0,0)},Axes=false} -\defKV[Tortue]{Etape=\setKV[Tortue]{Etapes}}% +\setKVdefault[Tortue]{% + Pas=0.2mm,%Déplacement, + Etapes=false,%Pour arrêter la construction à une étape particulière + Nom=\jobname,%Pour la sauvegarde du fichier mp + Grille=false,%Pour faire apparaître une grille + LargeurG=10,%Largeur Grille + HauteurG=10,%Hauteur Grille + TortueD=false,%Affiche la tortue au départ + TortueF=false,%Affiche la tortue à l'arrivée + Epaisseur=1,%Epaisseur du tracé + Angle=0,%Angle de départ de la tortue + Debut=false,%Pour indiquer que rien n'est fait (utile ?) + Depart={(0,0)},%Point de départ de la tortue + Axes=false,%Affichage des axes ou pas + Origine={(0,0)},%Origine des axes + Cases=false,%Se déplace-t-on sur des cases ? +} +\defKV[Tortue]{Etape=\setKV[Tortue]{Etapes}}%choix de l'étape d'arrêt \newcounter{PfCTortue} \setcounter{PfCTortue}{0} @@ -660,12 +1021,13 @@ \savecomparemode% \newwrite\turtle@out% \immediate\openout\turtle@out \jobname+t\thePfCTortue.turtle% - \immediate\write\turtle@out{numeric ut;}% - \immediate\write\turtle@out{ut=\useKV[Tortue]{Pas};}% - \immediate\write\turtle@out{Etapes=\useKV[Tortue]{Etapes};}% - \immediate\write\turtle@out{if Etapes:Total=\useKV[Tortue]{Etape};fi;}% -% \immediate\write\turtle@out{vardef Dessin=}% -% \immediate\write\turtle@out{save Tortue; picture Tortue;}% + \immediate\write\turtle@out{% + numeric ut; + ut=\useKV[Tortue]{Pas}; + pair OrigineAxes;OrigineAxes=\useKV[Tortue]{Origine}; + Etapes=\useKV[Tortue]{Etapes}; + if Etapes:Total=\useKV[Tortue]{Etape};fi; + }% \ifboolKV[Tortue]{Grille}{% \immediate\write\turtle@out{% larg=\useKV[Tortue]{LargeurG}; haut=\useKV[Tortue]{HauteurG}; @@ -675,68 +1037,110 @@ for k=-haut upto haut: draw 3*ut*(-10larg,10k)--3*ut*(10larg,10k) withcolor 0.75white; endfor; + %dotlabel("",ut*OrigineAxes); if \useKV[Tortue]{Axes}: - drawarrow 3*ut*(-10larg,0)--3*ut*(10larg,0); - drawarrow 3*ut*(0,-10haut)--3*ut*(0,10haut); - label.llft(btex O etex,(0,0)); - dotlabel.lrt(btex 30 etex,(30*ut,0)); - dotlabel.ulft(btex 30 etex,(0,30*ut)); + drawarrow (3*ut*(-10larg,0)--3*ut*(10larg,0)) shifted(ut*(0,ypart(OrigineAxes-(0,0)))); + drawarrow (3*ut*(0,-10haut)--3*ut*(0,10haut)) shifted(ut*(xpart(OrigineAxes-(0,0)),0)); + %label.llft(btex O etex,(0,0)); + dotlabel.lrt(btex 30 etex,(30*ut,0)+ut*(OrigineAxes-(0,0))); + dotlabel.ulft(btex 30 etex,(0,30*ut)+ut*(OrigineAxes-(0,0))); fi; + if \useKV[Tortue]{Cases}: + string T[]; + T1="A"; + T2="B"; + T3="C"; + T4="D"; + T5="E"; + T6="F"; + T7="G"; + T8="H"; + T9="I"; + T10="J"; + T11="K"; + T12="L"; + T13="M"; + T14="N"; + T15="O"; + T16="P"; + T17="Q"; + T18="R"; + T19="S"; + T20="T"; + T21="U"; + T22="V"; + T23="W"; + T24="X"; + T25="Y"; + T26="Z"; + for k=-larg upto larg-1: + label(TEX(T[k+larg+1]),3*ut*(10k+5,10haut+5)); + endfor; + for k=haut downto -haut+1: + label(TEX(decimal(haut-k+1)),3*ut*(-10larg-5,10k-5)); + endfor; + fi; + Epaisseur:=1.5; }% }{}% \ifboolKV[Tortue]{Debut}{}{% \foreachitem\compteur\in\PfCListeCmdTortue{% \comparestrict% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{[}[\PfCTestCrochetO]% - \xintifboolexpr{\PfCTestCrochetO==0}{}{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{]}[\PfCTestCrochetF]% - \xintifboolexpr{\PfCTestCrochetF==0}{% - \immediate\write\turtle@out{TotalRemplis:=tt-1; remplis for l=1 upto TotalRemplis:B[l]--endfor cycle withcolor CouleurRemplis;}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Remplis}[\PfCTestRemplis]% - \xintifboolexpr{\PfCTestRemplis==0}{% - \immediate\write\turtle@out{tt:=0; - TotalRemplis:=0; CouleurRemplis:=\PfCListeCmdTortue[\compteurcnt,2];}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{MP}[\PfCTestMP]% + \xintifboolexpr{\PfCTestMP==0}{% + \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,2]}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{[}[\PfCTestCrochetO]% + \xintifboolexpr{\PfCTestCrochetO==0}{}{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{]}[\PfCTestCrochetF]% + \xintifboolexpr{\PfCTestCrochetF==0}{% + \immediate\write\turtle@out{TotalRemplis:=tt-1; remplis for l=1 upto TotalRemplis:B[l]--endfor cycle withcolor CouleurRemplis;}% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Fin}[\PfCTestFinPour]% - \xintifboolexpr{\PfCTestFinPour==0}{% - \immediate\write\turtle@out{enddef;k:=0;}% - \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Remplis}[\PfCTestRemplis]% + \xintifboolexpr{\PfCTestRemplis==0}{% + \immediate\write\turtle@out{tt:=0; + TotalRemplis:=0; CouleurRemplis:=\PfCListeCmdTortue[\compteurcnt,2];}% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Pour}[\PfCTestPour]% - \xintifboolexpr{\PfCTestPour==0}{% - \immediate\write\turtle@out{vardef \PfCListeCmdTortue[\compteurcnt,2](expr \PfCListeCmdTortue[\compteurcnt,3])=}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Fin}[\PfCTestFinPour]% + \xintifboolexpr{\PfCTestFinPour==0}{% + \immediate\write\turtle@out{enddef;k:=0;}% + \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Rep}[\PfCTestRep]% - \xintifboolexpr{\PfCTestRep==0}{% - \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% - \immediate\write\turtle@out{nb[\PfCNbRep]:=0;}% - \immediate\write\turtle@out{forever:}% - \immediate\write\turtle@out{nb[\PfCNbRep]:=nb[\PfCNbRep]+1;}% - % \immediate\write\turtle@out{nbcomp:=nbcomp+1;} + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Pour}[\PfCTestPour]% + \xintifboolexpr{\PfCTestPour==0}{% + \immediate\write\turtle@out{vardef \PfCListeCmdTortue[\compteurcnt,2](expr \PfCListeCmdTortue[\compteurcnt,3])=}% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{)}[\PfCTestParaF]% - \xintifboolexpr{\PfCTestParaF==0}{% - \immediate\write\turtle@out{exitif nb[\PfCNbRep]=\PfCListeCmdTortue[\compteurcnt,2];}% - \immediate\write\turtle@out{endfor;}% - \xdef\PfCNbRep{\fpeval{\PfCNbRep-1}}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Rep}[\PfCTestRep]% + \xintifboolexpr{\PfCTestRep==0}{% + \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% + \immediate\write\turtle@out{nb[\PfCNbRep]:=0;}% + \immediate\write\turtle@out{forever:}% + \immediate\write\turtle@out{nb[\PfCNbRep]:=nb[\PfCNbRep]+1;}% + % \immediate\write\turtle@out{nbcomp:=nbcomp+1;} }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{(}[\PfCTestParaO]% - \xintifboolexpr{\PfCTestParaO==0}{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{)}[\PfCTestParaF]% + \xintifboolexpr{\PfCTestParaF==0}{% + \immediate\write\turtle@out{exitif nb[\PfCNbRep]=\PfCListeCmdTortue[\compteurcnt,2];}% + \immediate\write\turtle@out{endfor;}% + \xdef\PfCNbRep{\fpeval{\PfCNbRep-1}}% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Bc}[\PfCTestBc]% - \xintifboolexpr{\PfCTestBc==0}{% - \immediate\write\turtle@out{Bc;}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{(}[\PfCTestParaO]% + \xintifboolexpr{\PfCTestParaO==0}{% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Lc}[\PfCTestLc]% - \xintifboolexpr{\PfCTestLc==0}{% - \immediate\write\turtle@out{Lc;}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Bc}[\PfCTestBc]% + \xintifboolexpr{\PfCTestBc==0}{% + \immediate\write\turtle@out{Bc;}% }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Tlp}[\PfCTestTlp]% - \xintifboolexpr{\PfCTestTlp==0}{% - \immediate\write\turtle@out{Teleporter(\PfCListeCmdTortue[\compteurcnt,2],\PfCListeCmdTortue[\compteurcnt,3]);}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Lc}[\PfCTestLc]% + \xintifboolexpr{\PfCTestLc==0}{% + \immediate\write\turtle@out{Lc;}% }{% - \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,1](\PfCListeCmdTortue[\compteurcnt,2]);}% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Tlp}[\PfCTestTlp]% + \xintifboolexpr{\PfCTestTlp==0}{% + \immediate\write\turtle@out{Teleporter(\PfCListeCmdTortue[\compteurcnt,2],\PfCListeCmdTortue[\compteurcnt,3]);}% + }{% + \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,1](\PfCListeCmdTortue[\compteurcnt,2]);}% + }% }% }% }% @@ -758,7 +1162,6 @@ \ifboolKV[Tortue]{Etapes}{% \immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[Total] scaled 1.5,A[Total]);}% }{\ifboolKV[Tortue]{TortueF}{\immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[k] scaled 1.5,A[k]);}}{}}% - %\immediate\write\turtle@out{} \immediate\closeout\turtle@out% \restorecomparemode% }% @@ -778,11 +1181,11 @@ input PfCTurtleTestRemplis.mp; pair Depart; - Depart=\useKV[Tortue]{Depart}; + Depart=\useKV[Tortue]{Depart} if \useKV[Tortue]{Cases}:+(15,15)fi; pair A[],B[]; A[0]=\useKV[Tortue]{Pas}*(xpart(Depart),ypart(Depart)); B[0]=A[0]; - Epaisseur:=0.25;%\useKV[Tortue]{Epaisseur}; + Epaisseur:=\useKV[Tortue]{Epaisseur}; Angle:=0; numeric RetiensAngle[]; RetiensAngle[0]=\useKV[Tortue]{Angle}; @@ -1273,7 +1676,7 @@ \reademptyitems% \setlength{\tabcolsep}{0.25\tabcolsep} \renewcommand{\arraystretch}{1.5} - \begin{NiceTabular}{*{\fpeval{\PfCMentaloEtages}}{m{5pt}}m{20pt}cm{20pt}cl*{\fpeval{\PfCMentaloEtages}}{m{5pt}}*{5}{m{15pt}}*{2}{m{10pt}}} + \begin{NiceTabular}{*{\fpeval{\PfCMentaloEtages}}{m{5pt}}m{20pt}cm{20pt}cl*{\fpeval{\PfCMentaloEtages}}{m{5pt}}*{5}{m{15pt}}*{1}{m{10pt}}} \Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}% \Block[draw,fill=gray!15]{1-5}{Arrivée}&&&&&\Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}\\ \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-1}}}\do{% @@ -2570,11 +2973,12 @@ %%% % Puissances 4 %%% -\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,Multiplication,Entier,Nombre,Exposant=false}% +\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,LargeurUn=2cm,Multiplication,Entier,Nombre,Exposant=false,Libre=false,Texte=false,Echelle=2}% \defKV[ClesPQuatre]{Addition=\setKV[ClesPQuatre]{Multiplication=false}}% \defKV[ClesPQuatre]{Relatif=\setKV[ClesPQuatre]{Entier=false}}% \defKV[ClesPQuatre]{Puissance=\setKV[ClesPQuatre]{Exposant}}% -\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}}% +\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}\setKV[ClesPQuatre]{Libre}}% +\defKV[ClesPQuatre]{Consignes=\setKV[ClesPQuatre]{Texte}}% \newtoks\toklistePQuatreh% \newtoks\toklistePQuatrev% @@ -2633,47 +3037,73 @@ \mplibforcehmode% \begin{mplibcode} Largeur=\useKV[ClesPQuatre]{Largeur}; + LargeurUn=\useKV[ClesPQuatre]{LargeurUn}; + Echelle=\useKV[ClesPQuatre]{Echelle}; color fond; fond=\useKV[ClesPQuatre]{Couleur}; - boolean Multiplication,Addition; + boolean Libre,Multiplication,Texte; + Libre:=\useKV[ClesPQuatre]{Libre}; Multiplication=\useKV[ClesPQuatre]{Multiplication}; + Texte:=\useKV[ClesPQuatre]{Texte}; + + if Texte: + string Consignes; + Consignes=\useKV[ClesPQuatre]{Consignes}; + fi; + + % On calcule le nombre de cases + nchauteur:=0; + for p_=#1: + nchauteur:=incr nchauteur; + endfor; + nclargeur:=0; + for p_=#2: + nclargeur:=incr nclargeur; + endfor; + if Libre=false: + nchauteur:=7; + nclargeur:=7; + fi; + %On affiche pair A,B,C,D,H[],V[],M[][]; A=(0,0); - B-A=Largeur*(7,0); - C=rotation(A,B,-90); + B-A=Largeur*(nclargeur,0); + C-B=Largeur*(0,nchauteur); D-C=A-B; fill polygone(A,B,C,D) withcolor fond; trace polygone(A,B,C,D); - for k=0 upto 6: - for l=0 upto 6: + for k=0 upto (nclargeur-1): + for l=0 upto (nchauteur-1): M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur); fill cercles(M[k][l],0.4*Largeur) withcolor blanc; trace cercles(M[k][l],0.4*Largeur); endfor; endfor; labeloffset:=labeloffset*2; + if Libre: + if Texte: + label.llft(TEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A); + fi; + else: if Multiplication: - label.llft(btex $\times$ etex scaled 2,A); + label.llft(btex $\times$ etex scaled Echelle,A); else: - label.llft(btex $+$ etex scaled 2,A); + label.llft(btex $+$ etex scaled Echelle,A); + fi; fi; labeloffset:=labeloffset/2; vardef Vertical(text t)= n:=0; for p_=t: -% if n<7: - label.lft(TEX(p_) scaled 2,A+(0,n*Largeur+Largeur/2)); + label.lft(TEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2)); n:=n+1; -% fi; endfor; enddef; vardef Horizontal(text t)= n:=0; for p_=t: -% if n<7: - label.bot(TEX(p_) scaled 2,A+(n*Largeur+Largeur/2,0)); + label.bot(TEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0)); n:=n+1; -% fi; endfor; enddef; labeloffset:=labeloffset*4; @@ -2681,42 +3111,60 @@ Horizontal(#2); \end{mplibcode} \else% - \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Multiplication;Multiplication=\useKV[ClesPQuatre]{Multiplication};}] + \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};Largeur=\useKV[ClesPQuatre]{Largeur};LargeurUn=\useKV[ClesPQuatre]{LargeurUn};Echelle=\useKV[ClesPQuatre]{Echelle};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Libre,Multiplication,Texte;Libre:=\useKV[ClesPQuatre]{Libre};Multiplication=\useKV[ClesPQuatre]{Multiplication};Texte:=\useKV[ClesPQuatre]{Texte};if Texte:string Consignes;Consignes=\useKV[ClesPQuatre]{Consignes};fi;}] + % On calcule le nombre de cases + nchauteur:=0; + for p_=#1: + nchauteur:=incr nchauteur; + endfor; + nclargeur:=0; + for p_=#2: + nclargeur:=incr nclargeur; + endfor; + if Libre=false: + nchauteur:=7; + nclargeur:=7; + fi; + %On affiche pair A,B,C,D,H[],V[],M[][]; A=(0,0); - B-A=Largeur*(7,0); - C=rotation(A,B,-90); + B-A=Largeur*(nclargeur,0); + C-B=Largeur*(0,nchauteur); D-C=A-B; fill polygone(A,B,C,D) withcolor fond; - for k=0 upto 7: - for l=0 upto 7: + trace polygone(A,B,C,D); + for k=0 upto (nclargeur-1): + for l=0 upto (nchauteur-1): M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur); fill cercles(M[k][l],0.4*Largeur) withcolor blanc; + trace cercles(M[k][l],0.4*Largeur); endfor; endfor; labeloffset:=labeloffset*2; + if Libre: + if Texte: + label.llft(LATEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A); + fi; + else: if Multiplication: - label.llft(btex $\times$ etex scaled 2,A); + label.llft(btex $\times$ etex scaled Echelle,A); else: - label.llft(btex $+$ etex scaled 2,A); + label.llft(btex $+$ etex scaled Echelle,A); + fi; fi; labeloffset:=labeloffset/2; vardef Vertical(text t)= n:=0; for p_=t: - if n<7: - label.lft(LATEX(p_) scaled 2,A+(0,n*Largeur+Largeur/2)); + label.lft(LATEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2)); n:=n+1; - fi; endfor; enddef; vardef Horizontal(text t)= n:=0; for p_=t: - if n<7: - label.bot(LATEX(p_) scaled 2,A+(n*Largeur+Largeur/2,0)); + label.bot(LATEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0)); n:=n+1; - fi; endfor; enddef; labeloffset:=labeloffset*4; @@ -6450,35 +6898,19 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, %%% % Labyrinthe Nombre %%% -\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=Brown,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true} +\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=LightSteelBlue,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true} \newcommand\LabyNombre[1][]{% \useKVdefault[ClesLabyNb]% \setKV[ClesLabyNb]{#1}% - \ifboolKV[ClesLabyNb]{EntreeSortie}{% - \ifboolKV[ClesLabyNb]{Solution}{% - \TraceLabyMathAleaSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }{% - \TraceLabyMathAlea{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }% + \ifboolKV[ClesLabyNb]{Solution}{% + \TraceLabyFactoSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% }{% - \ifboolKV[ClesLabyNb]{DoubleOperation}{% - \ifboolKV[ClesLabyNb]{Solution}{% - \TraceDoubleSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }{% - \TraceLabyNombreDouble{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }% - }{% - \ifboolKV[ClesLabyNb]{Solution}{% - \TraceSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }{% - \TraceLabyNombre{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }% - }% - }% + \TraceLabyFacto{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% + }% }% -\newcommand\TraceLabyMathAlea[6]{% +\newcommand\TraceLabyFacto[6]{% \mplibforcehmode% \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% \begin{mplibcode}[\PfCNomLabyrinthe] @@ -6490,8 +6922,9 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, string Entree,Sortie; Entree=\useKV[ClesLabyNb]{Entree}; Sortie=\useKV[ClesLabyNb]{Sortie}; - boolean SortieUnique; + boolean SortieUnique,EntreeSortie; SortieUnique:=\useKV[ClesLabyNb]{SortieUnique}; + EntreeSortie:=\useKV[ClesLabyNb]{EntreeSortie}; picture Square; Square=image( path Test; @@ -6501,6 +6934,41 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, trace subpath(2.85,3.15) of Test; trace subpath(3.85,4.15) of Test; ); + + vardef RemplissagePremier= + Totalpremier:=if indiceChemin<62:62 else: indiceChemin fi; + + numeric p[]; boolean n_is_prime; p[1]=2; kis:=1; + for nis=3 step 2 until infinity: + n_is_prime := true; + for jis=2 upto kis: + if nis mod p[jis]=0: n_is_prime := false; fi + exitif nis/p[jis] < p[jis]; + endfor + if n_is_prime: p[incr kis] := nis; exitif kis=Totalpremier; fi + endfor fi + + numeric PR[],pretiens[]; + + for ki=1 upto Totalpremier-1: + pretiens[ki]:=p[ki+1]; + endfor; + + Kk:=0; + + for ki=Totalpremier-1 downto 1: + alea:=1+floor(uniformdeviate(ki)); + PR[incr Kk]:=pretiens[alea]; + % message("k="&decimal(k)&" alea="&decimal(alea)&" Kk="&decimal(Kk)&" PR[Kk]="&decimal(PR[Kk])); + Kkl:=0; + for li=1 upto ki: + if li<>alea: + pretiens[incr Kkl]:=pretiens[li]; + % message("Kkl="&decimal(Kkl)); + fi; + endfor; + endfor; + enddef; numeric Multiple; Multiple=#1; @@ -6572,13 +7040,33 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, nbaffiche=0; for k=0 upto LargeurLaby-1: for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); + nbaffiche:=nbaffiche+1; + if Multiple=1:%On affichera que des multiples de 2/3/5/9/10 pour afficher un chemin de nombre premiers + mathalea:=uniformdeviate(5); + if mathalea<1: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*2; + elseif mathalea<2: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*3; + elseif mathalea<3: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*5; + elseif mathalea<4: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*9; + else: NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*10; + fi; + else: + NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); + fi; endfor; endfor; % On crée des multiples du nombre choisi + RemplissagePremier; + for k=1 upto indiceChemin: - NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; + if Multiple>1: + NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; + else: + NbSol[k]=PR[k]; + fi; endfor; % On affiche picture Corps; @@ -6594,7 +7082,11 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); endfor; - % trace TraceLabyrinthe; + if EntreeSortie=false: + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + trace TraceLabyrinthe; + else: for k=0 upto LargeurLaby-1: for l=0 upto LongueurLaby-1: trace Square shifted N[k][l]; @@ -6661,16 +7153,17 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); endfor; fi; + fi; ); Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; trace Corps; \end{mplibcode} } -\newcommand\TraceLabyMathAleaSolution[6]{% +\newcommand\TraceLabyFactoSolution[6]{% \mplibforcehmode% \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe]% + \begin{mplibcode}[\PfCNomLabyrinthe] color CouleurChemin; CouleurChemin:=\useKV[ClesLabyNb]{CouleurChemin}; picture CorpsSolution; @@ -6678,15 +7171,26 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, nbaffiche:=0; for k=0 upto LargeurLaby-1: for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; + nbaffiche:=nbaffiche+1; label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); endfor; endfor; + if EntreeSortie=false: + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + else: for k=1 upto indiceChemin: remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); endfor; - % trace TraceLabyrinthe; + fi; + if EntreeSortie=false: + trace TraceLabyrinthe; + else: for k=0 upto LargeurLaby-1: for l=0 upto LongueurLaby-1: trace Square shifted N[k][l]; @@ -6761,11 +7265,12 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, endfor --((center unitsquare scaled 10mm) shifted Arrivee)--N[-2][-2]; trace CheminSolution dashed evenly withcolor CouleurChemin; + fi; ); CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; trace CorpsSolution; - \end{mplibcode}% -}% + \end{mplibcode} +} \newcommand\TraceLabyNombreDouble[6]{% \mplibforcehmode% @@ -6902,224 +7407,6 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, \end{mplibcode} }% -\newcommand\TraceLabyNombre[6]{% - \mplibforcehmode% - \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe] - input PfCLabyNombre; - - boolean Murs; - Murs=\useKV[ClesLabyNb]{Murs}; - - numeric Multiple; - Multiple=#1; - % Initialisation du labyrinthe - InitialisationLabyrinthe(#2,#3); - % On initialise les paramètres du parcours - numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; - choixligneD=xpart(#4); - choixcolonneD=ypart(#4); - choixligneA=xpart(#5); - choixcolonneA=ypart(#5);% - pair Depart; - Depart=N[choixligneD][choixcolonneD]; - pair Arrivee; - Arrivee=N[choixligneA][choixcolonneA]; - pair Mobile; - Mobile=Depart; - RAZPileChemin; - % Exploration du labyrinthe - PushChemin((choixligneD,choixcolonneD)); - CaseExploree[choixligneD][choixcolonneD]:=true; - VoisinDispo(choixligneD,choixcolonneD); - forever: exitif Mobile=Arrivee;%nb=0; - nb:=ceiling(uniformdeviate(nbvoisin)); - if nb>0: - for k=1 upto nbvoisin: - CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; - endfor; - PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); - Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; - VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); - else: - PopChemin; - fi; - endfor; - % Affichagefinal - % on sauvegarde les nombres aléatoires - numeric NbAffiche[]; - numeric NbSol[]; - % on écrit des nombres au hasard, mais sans être multiple du nombre choisi - numeric nbaffiche; - nbaffiche=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); - endfor; - endfor; - % On crée des multiples du nombre choisi - for k=2 upto indiceChemin-1: - NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; - endfor; - % On affiche - picture Corps; - Corps=image( - nbaffiche:=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - trace TraceLabyrinthe; - ); - Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace Corps; - \end{mplibcode} -} - -\newcommand\TraceSolution[6]{% - \mplibforcehmode% - \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe] - picture CorpsSolution; - CorpsSolution=image( - nbaffiche:=0; - for k=0 upto #3-1: - for l=0 upto #2-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - trace TraceLabyrinthe; - ); - CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace CorpsSolution; - \end{mplibcode} -}% - -\newcommand\TraceLabyNombreold[6]{% - \mplibforcehmode% - \begin{mplibcode} - input PfCLabyNombre; - - boolean Murs; - Murs=\useKV[ClesLabyNb]{Murs}; - - numeric Multiple; - Multiple=#1; - % Initialisation du labyrinthe - InitialisationLabyrinthe(#2,#3); - % On initialise les paramètres du parcours - numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; - choixligneD=xpart(#4); - choixcolonneD=ypart(#4); - choixligneA=xpart(#5); - choixcolonneA=ypart(#5);% - pair Depart; - Depart=N[choixligneD][choixcolonneD]; - pair Arrivee; - Arrivee=N[choixligneA][choixcolonneA]; - pair Mobile; - Mobile=Depart; - RAZPileChemin; - % Exploration du labyrinthe - PushChemin((choixligneD,choixcolonneD)); - CaseExploree[choixligneD][choixcolonneD]:=true; - VoisinDispo(choixligneD,choixcolonneD); - forever: exitif Mobile=Arrivee;%nb=0; - nb:=ceiling(uniformdeviate(nbvoisin)); - if nb>0: - for k=1 upto nbvoisin: - CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; - endfor; - PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); - Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; - VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); - else: - PopChemin; - fi; - endfor; - % Affichagefinal - % on sauvegarde les nombres aléatoires - numeric NbAffiche[]; - numeric NbSol[]; - % on écrit des nombres au hasard, mais sans être multiple du nombre choisi - numeric nbaffiche; - nbaffiche=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); - endfor; - endfor; - % On crée des multiples du nombre choisi - for k=2 upto indiceChemin-1: - NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; - endfor; - % On affiche - picture Corps; - Corps=image( - nbaffiche:=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - trace TraceLabyrinthe; - ); - Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace Corps; - \end{mplibcode} -} - -\newcommand\TraceSolutionold[6]{% - \mplibforcehmode% - \mplibcodeinherit{enable} - \begin{mplibcode} - picture CorpsSolution; - CorpsSolution=image( - nbaffiche:=0; - for k=0 upto #3-1: - for l=0 upto #2-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor 0.5white; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - trace TraceLabyrinthe; - ); - CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace CorpsSolution; - \end{mplibcode} - \mplibcodeinherit{disable} -}% - %%% % Mots croisés %%% @@ -7214,7 +7501,7 @@ transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick, }% %%% Colorilude %%% -\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false} +\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false,CartonReponse=false,Resultats=false} \newcommand\dispogpfc[3][]{% \setbox1=\hbox{#2}% @@ -7404,20 +7691,18 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \xdef\ListeColoriludeMax{\listlen\ListeColorilude[##1]}% }{}% }% - % - % On affiche le tableau \setlength{\tabcolsep}{0.2\tabcolsep}% \begin{NiceTabular}{*{\fpeval{\ListeColoriludeMax/2}}{rl}}% \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{% \xintifboolexpr{\listlen\ListeColorilude[##1]==\ListeColoriludeMax}{% \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{% - \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}~\else$\ListeColorilude[##1,##2]$\fi% + \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi% }% }{% \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{% - \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}~\else$\ListeColorilude[##1,##2]$\fi% + \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi% }% - &\hbox to1em{~}&\Cdots% + &\hbox to5pt{}&\Cdots% }% \\[0.5em]% }% @@ -7989,7 +8274,7 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \TraceDessinGradueSolution{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% }{% \TraceDessinGradue{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}% - } + }% }{% \setsepchar[*]{,*/}% \readlist\ListeDefLigne{#2}% @@ -10127,6 +10412,7 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. %%% \setKVdefault[ClesQCM]{Reponses=3,Solution=false,Stretch=1,Largeur=2cm,Couleur=gray!15,Titre=false,Nom=R\'eponse,NomV=Vrai,NomF=Faux,Alph=false,AlphT=false,VF=false,Depart=1,Alterne=false,Noms={A/B/C},Multiple=false}% \newlength{\LargeurQCM}% +\newlength{\PfCLargeurQCM}% \newcounter{QuestionQCM}% \newcounter{TitreQCM}% \ifdef{\QCM}{% @@ -10160,7 +10446,9 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \end{tabular}% }{% \ifboolKV[ClesQCM]{VF}{% - \setKV[ClesQCM]{Reponses=2} + \setKV[ClesQCM]{Reponses=2}% + \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}% + \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}% \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% @@ -10228,9 +10516,10 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \renewcommand{\arraystretch}{1}% }{% \ifboolKV[ClesQCM]{VF}{% - \setKV[ClesQCM]{Reponses=2} + \setKV[ClesQCM]{Reponses=2}% \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% + \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}% + \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}% \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% \cline{2-\NBcases}% @@ -11066,7 +11355,7 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. }{% % On d\'emarre la r\'esolution \ifboolKV[ClesPythagore]{SansMots}{% - \MPFigurePythaSansMots{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}} + \MPFigurePythaSansMots{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}% }{% \ifboolKV[ClesPythagore]{AllPerso}{% \RedactionPythagore% @@ -11160,7 +11449,7 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. % y a dans un "seul calcul". \setcounter{NbCalculDistri}{0} -\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Impression=false}%,AideAdd=false:inutile ? +\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Impression=false,Tableau=false}%,AideAdd=false:inutile ? \newcommand\Tuile[4]{% \ifluatex @@ -11594,183 +11883,187 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \ifboolKV[ClesDistributivite]{Tuile}{% \Tuile{#2}{#3}{#4}{#5}% }{% - \ensuremath{% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{% - \DistriEchange[#1]{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesDistributivite]{Remarquable}{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% - \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi% - }{} - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{} - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% - \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% - \stepcounter{NbCalculDistri}% - \ifx\bla#4\bla% - \xdef\Multi{\fpeval{#2*#2}}% - \xdef\Multij{\fpeval{#2*#3}}% - \xdef\Multik{\fpeval{#3*#2}}% - \xdef\Multil{\fpeval{#3*#3}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#3+#3*#2}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \Affichage{\Multi}{\Multim}{\Multil}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}% - \else% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \Affichage{\Multi}{\Multim}{\Multil}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% - \fi% - }{}% + \ifboolKV[ClesDistributivite]{Tableau}{% + \DistriTableau[#1]{#2}{#3}{#4}{#5}% + }{% + \ensuremath{% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{% + \DistriEchange[#1]{#2}{#3}{#4}{#5}% }{% - \ifboolKV[ClesDistributivite]{Numerique}{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{% - \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}% - }{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{% - \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}% + \ifboolKV[ClesDistributivite]{Remarquable}{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% + \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi% + }{} + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{} + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% + \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% + \stepcounter{NbCalculDistri}% + \ifx\bla#4\bla% + \xdef\Multi{\fpeval{#2*#2}}% + \xdef\Multij{\fpeval{#2*#3}}% + \xdef\Multik{\fpeval{#3*#2}}% + \xdef\Multil{\fpeval{#3*#3}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#3+#3*#2}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% }{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}% - }% - }% + \Affichage{\Multi}{\Multim}{\Multil}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}% + \else% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \Affichage{\Multi}{\Multim}{\Multil}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% + \fi% + }{}% }{% - \ifboolKV[ClesDistributivite]{All}{% - \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}% - \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}% - \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}% - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do - {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}% - \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}% + \ifboolKV[ClesDistributivite]{Numerique}{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{% + \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}% + }{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{% + \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}% + }{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}% + }% + }% }{% - % Etape 1 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}% - % - \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double - \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk - % - \xintifboolexpr{\Multi==0}{\times% - \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% - \Tikzmark{\Affichage[#1]{0}{#4}{0}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{\Multi==0}{% - \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% - \ifboolKV[ClesDistributivite]{Fleches}{% - \xdef\Multi{\fpeval{#2*#3*#4*#5}}% + \ifboolKV[ClesDistributivite]{All}{% + \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}% + \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}% + \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}% + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do + {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}% + \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}% + }{% + % Etape 1 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}% + % + \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double + \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk + % + \xintifboolexpr{\Multi==0}{\times% + \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% + \Tikzmark{\Affichage[#1]{0}{#4}{0}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% \xintifboolexpr{\Multi==0}{% - \xdef\Multij{\fpeval{#2*#3}}%\relax - \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}% - }{% - \DrawArrow% + \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% + \ifboolKV[ClesDistributivite]{Fleches}{% + \xdef\Multi{\fpeval{#2*#3*#4*#5}}% + \xintifboolexpr{\Multi==0}{% + \xdef\Multij{\fpeval{#2*#3}}%\relax + \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}% + }{% + \DrawArrow% + }% + }{}\setcounter{NbDistri}{0}% + }{} + % Etape 2 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xintifboolexpr{\Multi==0}{}{% + \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% + } + \xdef\Multij{\fpeval{#2*#5}}% + \xintifboolexpr{\Multij==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% }% - }{}\setcounter{NbDistri}{0}% - }{} - % Etape 2 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xintifboolexpr{\Multi==0}{}{% - \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% - } - \xdef\Multij{\fpeval{#2*#5}}% - \xintifboolexpr{\Multij==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% - }% - \xdef\Multik{\fpeval{#3*#4}}% - \xintifboolexpr{\Multik==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multil{\fpeval{#3*#5}}% - \xintifboolexpr{\Multil==0}{}{+% - \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% - }% - }{}% - % Etape 3 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% - \stepcounter{NbCalculDistri}% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% - \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xintifboolexpr{\Multik==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% }% - }{% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% - }% - \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}% - }{}% - % Etape 4 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% - \stepcounter{NbCalculDistri}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% + \xdef\Multil{\fpeval{#3*#5}}% + \xintifboolexpr{\Multil==0}{}{+% + \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% + }% + }{}% + % Etape 3 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% + \stepcounter{NbCalculDistri}% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% - \xintifboolexpr{\Multim==0}{}{% - \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% + \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% + }% + }{% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% }% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% - }{}% + \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}% + }{}% + % Etape 4 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% + \stepcounter{NbCalculDistri}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% + \xintifboolexpr{\Multim==0}{}{% + \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% + }% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% + }{}% + }% }% }% }% @@ -11780,6 +12073,22 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. }% }% +\newcommand\DistriTableau[5][]{% + \useKVdefault[ClesDistributivite]% + \setKV[ClesDistributivite]{#1}% + \ensuremath{% + \begin{array}{|>{\columncolor{gray!15}}c|c|c|} + \hline + \rowcolor{gray!15}\times&\Affichage[#1]{0}{#4}{0}&\Affichage[#1]{0}{0}{#5}\\ + \hline + \xintifboolexpr{#2==0}{}{\Affichage[#1]{0}{#2}{0}&\Affichage[#1]{\fpeval{#2*#4}}{0}{0}&\xintifboolexpr{\fpeval{#2*#5}>0}{+}{}\Affichage[#1]{0}{\fpeval{#2*#5}}{0}\\ + \hline}% + \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+}{}\Affichage[#1]{0}{0}{#3}&\xintifboolexpr{\fpeval{#3*#4}>0}{+}{}\Affichage[#1]{0}{\fpeval{#3*#4}}{0}&\xintifboolexpr{\fpeval{#3*#5}>0}{+}{}\Affichage[#1]{0}{0}{\fpeval{#3*#5}}\\ + \hline} + \end{array} + }% +}% + \newcommand\Resultat[1][]{% \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels \ensuremath{% @@ -14334,15 +14643,16 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. % #4 longueur AB % #5 longueur AF % #6 longueur AC + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% \ifboolKV[ClesThales]{FigureSeule}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% \MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% \MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% }{% \ifboolKV[ClesThales]{Figure}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% \begin{multicols}{2} {\em La figure est donn\'ee \`a titre indicatif.} \[\MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\] @@ -14351,16 +14661,16 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8} \end{multicols} }{\ifboolKV[ClesThales]{Figurecroisee}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN] - \begin{minipage}{0.4\linewidth} - {\em La figure est donn\'ee \`a titre indicatif.} - \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\] - \end{minipage} +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN] + \fbox{\begin{minipage}{0.4\linewidth}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% + \end{minipage}} \hfill - \begin{minipage}{0.55\linewidth} + \begin{minipage}{0.55\linewidth}% \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - \end{minipage}\\% + \end{minipage}% }{\ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% }% @@ -19109,7 +19419,7 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis %%% % Diff\'erentes représentations graphiques %%% -\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Relie=false,RelieSegment=false,Marque=dot} +\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGradX=1,PasGradY=1,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Relie=false,RelieSegment=false,Marque=dot} \newcommand\TraceGraphique[2][]{% \useKVdefault[TraceG]% @@ -19324,6 +19634,8 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis y.u=1cm/\useKV[TraceG]{Ystep}; grillex=\useKV[TraceG]{PasGrilleX}; grilley=\useKV[TraceG]{PasGrilleY}; + gradx=\useKV[TraceG]{PasGradX}; + grady=\useKV[TraceG]{PasGradY}; pos=\useKV[TraceG]{LabelC}; color colortrace; @@ -19395,22 +19707,23 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis drawoptions(); fi; if Graduations: - for k=1 upto xmax/grillex: + for k=gradx step gradx until xmax*gradx/grillex: dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm))); endfor; - for k=-1 downto xmin/grillex: + for k=-gradx step -gradx until xmin*gradx/grillex: dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm))); endfor; - for k=1 upto ymax/grilley: + for k=grady step grady until ymax*grady/grilley: dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); endfor; - for k=-1 downto ymin/grilley: + for k=-grady step -grady until ymin*grady/grilley: dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); endfor; fi; drawoptions(withpen pencircle scaled1.5); drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0)); drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine))); + label.llft(btex 0 etex,u*Origine); drawoptions(); draw courbe1(borneinf,bornesup,100)(#2) withcolor colortrace; % labelisation @@ -19430,9 +19743,9 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis \usepackage{ProfCollege} \setKV[TraceG]{#1} } - \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};}] + \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations}; pair Origine; - Origine=(xmin,ymin)+\useKV[TraceG]{Origine}; + Origine=(xmin,ymin)+\useKV[TraceG]{Origine};}] vardef sin(expr t) = sind(c*t) enddef; @@ -23318,7 +23631,7 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V }% }% -\newcommand\Capa[2][]{% +\NewDocumentCommand\Capa{o m}{% \useKVdefault[Unites]% \setKV[Unites]{#1}% \ifboolKV[Unites]{kL}{% @@ -24527,8 +24840,10 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V % \ifboolKV[ClesTableaux]{Cube}{% \[\renewcommand{\arraystretch}{1.15}% - \setlength{\tabcolsep}{0.625\tabcolsep}% - \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}} +% \setlength{\tabcolsep}{0.625\tabcolsep}% +% \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}} + \setlength{\tabcolsep}{0.275\tabcolsep}% + \begin{NiceTabular}{*{7}{wc{15pt}wc{15pt}wc{15pt}}} \Block[]{1-3}{}% &&&\Block[]{1-3}{}% &&&\Block[]{1-3}{}% @@ -24538,7 +24853,7 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V &&&\Block[]{1-3}{}\\ \Block[borders={left,top,right}]{1-3}{km$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{hm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dam$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{m$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{cm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{mm$^3$\PfCTBstrut}&&\\ \ifboolKV[ClesTableaux]{Capacite}{% - \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom},l]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={right,bottom}]{1-3}{}&&\\ + \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={right,bottom}]{1-3}{}&&\\ }{\hline}% \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% &&&&&&&&&&&&&&&&&&&&\\ @@ -25926,15 +26241,14 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V \xdef\PapierCouleur{\useKV[Papiers]{Couleur}}% \xdef\PapierGrille{\useKV[Papiers]{Grille}}% \xdef\PapierGrillePointe{\useKV[Papiers]{GrillePointe}}% - \checkoddpage% - \ifoddpage% - \setlength{\PapierLeftCurrent}{\oddsidemargin}% - \else% - \setlength{\PapierLeftCurrent}{\evensidemargin}% - \fi% - \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% - \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% \ifboolKV[Papiers]{ZoneTexte}{% + \checkoddpage\ifoddpage% + \setlength{\PapierLeftCurrent}{\oddsidemargin}% + \else% + \setlength{\PapierLeftCurrent}{\evensidemargin}% + \fi% + \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% + \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% \xdef\PapierHauteur{\fpeval{\textheight/1cm}}% \xdef\PapierLargeur{\fpeval{\textwidth/1cm}}% \begin{tikzpicture}[remember picture,overlay]% @@ -25971,6 +26285,13 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V \end{tikzpicture}% }{% \ifboolKV[Papiers]{PageEntiere}{% + \checkoddpage\ifoddpage% + \setlength{\PapierLeftCurrent}{\oddsidemargin}% + \else% + \setlength{\PapierLeftCurrent}{\evensidemargin}% + \fi% + \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% + \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% \xdef\PapierHauteur{\fpeval{\paperheight/1cm}}% \xdef\PapierLargeur{\fpeval{\paperwidth/1cm}}% \begin{tikzpicture}[remember picture,overlay]% diff --git a/macros/latex/contrib/profcollege/metapost/PfCObjets.mp b/macros/latex/contrib/profcollege/metapost/PfCObjets.mp new file mode 100644 index 0000000000..96daf3d3bc --- /dev/null +++ b/macros/latex/contrib/profcollege/metapost/PfCObjets.mp @@ -0,0 +1,2085 @@ +%01/08/2011 +%Ajout de l'option trait dans le tracé des surfaces. + +%24/01/2011 +%Gestion des couleurs dans l'objet Deplacement. + +%27/11/2010 +%Manque plusieurs : dans la définition de ObjetNew + +%07/02/2009 +color OTFc[][][];%pour mémoriser les différents sommets de chaque objet; +color OTFc[][].iso; +color coul[][];%pour memoriser la couleur de chacune des faces de l'objet; +color Outcolor[],Incolor[];%Permet de gérer la gestion des couleurs d'un objet lors d'un déplacement de cet objet +boolean Vue[][]; + +boolean creux; creux=false;%pour gérer les solides creux +boolean transformation; transformation=false;%pour gérer les transformations +boolean Ferme[];%pour gérer les faces : si le solide est fermé, toutes les faces non vues ne sont pas intégrées aux calculs +boolean perso[];%pour gérer les gestions personnelles des couleurs +for k=0 upto 100: + perso[k]=false; +endfor; +boolean numeroteface; +numeroteface:=false; + +string couleurperso; + +defaultfont:="cmr5"; + +vardef Image(expr dep)= + if transformation: + Transform(dep) + else: + RotXYZ(dep) + fi + +TR +enddef; + +boolean Transparence; +Transparence:=false; +boolean couleurz;%pour gérer l'affichage "des lignes" de niveaux +couleurz:=false; + +vardef AffichageObjet[]= + save _affi; + picture _affi; + color Fc[][];color cou[]; + tapj:=0; + for k=0 upto apj.@: + cpt[tapj]:=tapj; + Fc[tapj].nb:=OTFc.@[k].nb; + for l=1 upto Fc[tapj].nb: + Fc[tapj][l]:=OTFc.@[k][l]; + endfor; + Fc[tapj].iso:=OTFc.@[k].iso; + cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi; + ALT[tapj]:=ALT.@[k]; + Vue[tapj]:=Vue.@[k]; + tapj:=tapj+1; + endfor; + tapj:=tapj-1; + QS(0,tapj); + if Transparence : + for k=0 upto tapj: + if Vue[cpt[k]]=false: + fill for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor abs(lumin(cpt[k]))*cou[cpt[k]]; + if traits=true: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle dashed evenly withpen pencircle scaled0.25bp; + fi; + fi; + endfor; + for k=0 upto tapj: + if Vue[cpt[k]]: + transparence for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle; + if traits=true: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + fi; + fi; + endfor; + else: + if Ferme.@: + for k=0 upto tapj: + if Vue[cpt[k]]=true: + fill for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + 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 + elseif arcenciel=true: + lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else: + lumin(cpt[k])*cou[cpt[k]] + fi; + if traits: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + %add by cp 01/08/11 + else: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + 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 + elseif arcenciel=true: + lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else: + lumin(cpt[k])*cou[cpt[k]] + fi; + %fin add + fi; + fi; + endfor; + else: + for k=0 upto tapj:%apj downto 1: + fill for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if Vue[cpt[k]]: + 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 + elseif arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else:lumin(cpt[k])*cou[cpt[k]] fi + else: abs(lumin(cpt[k]))*cou[cpt[k]] fi; + if traits: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + %add by cp 01/08/2011 + else: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if Vue[cpt[k]]: + if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else:lumin(cpt[k])*cou[cpt[k]] fi + else: abs(lumin(cpt[k]))*cou[cpt[k]] fi; + %fin add + fi; + endfor; + fi; + fi; + if numeroteface=true: + for k=0 upto tapj: + if Vue[k]: + label(""&decimal(k)&"",Projette(Fc[k].iso)); + fi; + endfor; + fi; +enddef; + + +vardef AffichageObjetold[]= + save _affi; + picture _affi; + color Fc[][];color cou[]; + tapj:=0; + for k=0 upto apj.@: + cpt[tapj]:=tapj; + Fc[tapj].nb:=OTFc.@[k].nb; + for l=1 upto Fc[tapj].nb: + Fc[tapj][l]:=OTFc.@[k][l]; + endfor; + Fc[tapj].iso:=OTFc.@[k].iso; + cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi; + ALT[tapj]:=ALT.@[k]; + Vue[tapj]:=Vue.@[k]; + tapj:=tapj+1; + endfor; + tapj:=tapj-1; + QS(0,tapj); + if Ferme.@: + for k=0 upto tapj: + if Vue[cpt[k]]=true: + fill for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor + if arcenciel=true: + lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else: + lumin(cpt[k])*cou[cpt[k]] + fi; + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + fi; + endfor; + else: + for k=0 upto tapj:%apj downto 1: + fill for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if Vue[cpt[k]]: + if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else:lumin(cpt[k])*cou[cpt[k]] fi + else: abs(lumin(cpt[k]))*cou[cpt[k]] fi; + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + endfor; + fi; + if numeroteface=true: + for k=0 upto tapj: + if Vue[k]: + label(""&decimal(k)&"",Projette(Fc[k].iso)); + fi; + endfor; + fi; +enddef; + +vardef DessineFusion= + save _fusion; + picture _fusion; + tapj:=0; + color Fc[][];color cou[]; + for l=1 upto nbobj: + for k=0 upto apj[l]: + cpt[tapj]:=tapj; + cou[tapj]:=if perso[l]:scantokens(couleurperso) else: coul[l][k] fi; + Fc[tapj].nb:=OTFc[l][k].nb; + for p=1 upto Fc[tapj].nb: + Fc[tapj][p]:=OTFc[l][k][p]; + endfor; + Fc[tapj].iso:=OTFc[l][k].iso; + ALT[tapj]:=ALT[l][k]; + Vue[tapj]:=Vue[l][k]; + if Ferme[l]: + if Vue[tapj]=false: + tapj:=tapj-1; + fi; + fi; + tapj:=tapj+1; + endfor; + endfor; + tapj:=tapj-1; + QS(0,tapj); + for k=0 upto tapj: + fill for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if Vue[cpt[k]]: + if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else:lumin(cpt[k])*cou[cpt[k]] fi + else: abs(lumin(cpt[k]))*cou[cpt[k]] fi; + if traits: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + %add by cp 22/08/2011 + else: + draw for l=1 upto Fc[cpt[k]].nb: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if Vue[cpt[k]]: + if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum)) + else:lumin(cpt[k])*cou[cpt[k]] fi + else: abs(lumin(cpt[k]))*cou[cpt[k]] fi; + %fin add + fi; + endfor; +enddef; + +vardef Objettore[](expr Rn,rn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux: + Ferme.@:=false + else: + Ferme.@:=true; + fi; + scantokens("numeric "&substring(0,1) of rn&"; "&rn&";"); + scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";"); + vardef Famille(expr u,v)=((R+r*cos(u))*cos(v),(R+r*cos(u))*sin(v),r*sin(u)) enddef; + umin:=-pi; umax:=pi; upas:=2*pi/nb; + vmin:=-pi; vpas:=2*pi/subh; vmax:=pi; + apj:=0; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetTube[](expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("vardef F(expr t)="&Fn&" enddef;"); + scantokens("vardef Fp(expr t)="&dp&" enddef;"); + color G[][]; + NB:=nbp;%nb de pas + nn:=pas; + %pour gérer le "flip" aux points d'inflexion + color VNbisprec[]; + VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2); + % + ang:=360/nb; + for l=0 upto NB: + for k=0 upto nb: + G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas)); + endfor; + endfor; + apj:=0; + if creux=false: + Ferme.@:=true; + nbsp:=nb; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsp; + for k=1 upto nbsp: + OTFc.@[apj][k]:=Image(G[0][nbsp+1-k]); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp; + apj:=apj+1; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsp; + for k=nbsp downto 1: + OTFc.@[apj][k]:=Image(G[NB][k]); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp; + apj:=apj+1; + else: + Ferme.@:=false; + fi; + for l=0 upto (NB-1): + for k=0 upto nb-1: + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(G[l][k]); + OTFc.@[apj][2]:=Image(G[l][k+1]); + OTFc.@[apj][3]:=Image(G[l+1][k+1]); + OTFc.@[apj][4]:=Image(G[l+1][k]); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef ObjetCylindre[](expr fn,umin,umax,vmin,vmax)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("vardef Famille(expr u,v)="&fn&" enddef;"); + apj:=0; + upas:=(umax-umin)/nb;vpas:=(vmax-vmin)/subh; + %On crée les facettes et on calcule la profondeur en Z. + %for k=umin step upas until umax: + % for l=vmin step vpas until vmax: + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef Objetcylindre[](expr rn,hn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,1) of rn&"; "&rn&";"); + scantokens("numeric "&substring(0,1) of hn&"; "&hn&";"); + vardef Famille(expr u,v)=(r*cos(u),r*sin(u),v) enddef; + umin:=pi; umax:=-pi; upas:=-2*pi/nb; + vmin:=0; vmax:=h; vpas:=h/subh; + nbsp:=nb; + apj:=0; + if creux=false: + Ferme.@:=true; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsp; + for k=1 upto nb: + OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp; + apj:=apj+1; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsp; + for k=1 upto nbsp: + OTFc.@[apj][k]:=Image(Famille(umin+(nbsp-k)*upas,vmax)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp; + apj:=apj+1; + else: + Ferme.@:=false; + fi; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image((Famille(umin+k*upas,vmin+l*vpas))); + OTFc.@[apj][3]:=Image((Famille(umin+k*upas,vmin+(l+1)*vpas))); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef ObjetCone[](expr fn,umin,umax,zbas,orign)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("vardef Famille(expr u)="&fn&" enddef;"); + scantokens("color "&substring(0,4) of orign&"; "&orign&";"); + apj:=0; + upas:=(umax-umin)/nb;vpas:=2*abs(zbas)/subh; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1): + for l=0 upto (2*subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas)+(l/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas)); + OTFc.@[apj][4]:=Image(Famille(umin+k*upas)+(l/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas)+((l+1)/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas)); + OTFc.@[apj][2]:=Image(Famille(umin+(k+1)*upas)+((l+1)/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +subh:=12; + +vardef Objetcone[](expr rn,hn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,1) of rn&"; "&rn&";"); + scantokens("numeric "&substring(0,1) of hn&"; "&hn&";"); + vardef Famille(expr u,v)=(r*(1-(v/h))*cos(u),r*(1-(v/h))*sin(u),v) enddef; + umin:=pi; umax:=-pi; upas:=-2*pi/nb; + vmin:=0; vpas:=h/subh; vmax:=h-vpas; + apj:=0; + Zmin:=0; + Zmax:=h; + if creux=false: + Ferme.@:=true; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nb; + for k=0 upto nb: + OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb; + apj:=apj+1; + else: + Ferme.@:=false; + fi; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef Objettronccone[](expr rn,hn,Hn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,1) of rn&"; "&rn&";"); + scantokens("numeric "&substring(0,1) of hn&"; "&hn&";"); + scantokens("numeric "&substring(0,1) of Hn&"; "&Hn&";"); + vardef Famille(expr u,v)=(r*(1-v/H)*cos(u),r*(1-v/H)*sin(u),v) enddef; + umin:=pi; umax:=-pi; upas:=-2*pi/nb; + vmin:=0; vpas:=h/subh; vmax:=h; + apj:=0; + if creux=false: + Ferme.@:=true; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nb; + for k=0 upto nb: + OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb; + apj:=apj+1; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nb; + for k=0 upto nb: + OTFc.@[apj][nb-k]:=Image(Famille(umin+k*upas,vmax)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb; + apj:=apj+1; + else: + Ferme.@:=false; + fi; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1):%umin step upas until umax-upas: + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef Objetsphere[](expr Rn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux:Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";"); + vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef; + umin:=-pi/2; umax:=pi/2; upas:=pi/nb; + vmin:=-pi; vpas:=2*pi/subh; vmax:=pi; + apj:=0; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef Objetcalotte[](expr Rn,Phib,Phih)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";"); + scantokens("numeric "&substring(0,4) of Phib&"; "&Phib&";"); + scantokens("numeric "&substring(0,4) of Phih&"; "&Phih&";"); + vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef; + umin:=phib; umax:=phih; upas:=(phih-phib)/nb; + vmin:=-pi; vpas:=2*pi/subh; vmax:=pi; + apj:=0; + nbsp:=subh; + if creux=false: + Ferme.@:=true; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsp; + for l=1 upto nbsp: + OTFc.@[apj][l]:=Image(Famille(umin,vmax-l*vpas)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp; + apj:=apj+1; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=subh; + for l=1 upto nbsp: + OTFc.@[apj][l]:=Image(Famille(umax,vmin+l*vpas)); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp; + apj:=apj+1; + else: + Ferme.@:=false; + fi; + %On crée les facettes et on calcule la profondeur en Z. + %for k=umin step upas until umax-upas: + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef Objetanneau[](expr Rn,rn,hn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux:Ferme.@:=false else:Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";"); + scantokens("numeric "&substring(0,1) of rn&"; "&rn&";"); + scantokens("numeric "&substring(0,1) of hn&"; "&hn&";"); + path sectionanneau; + sectionanneau=(R,0)--(R,h)--(r,h)--(r,0)--cycle; + vardef Famille(expr u,v)=((xpart(point(u) of sectionanneau)*cos(v),xpart(point(u) of sectionanneau)*sin(v),ypart(point(u) of sectionanneau))) enddef; + umin:=0; umax:=4; upas:=4/nb; + vmin:=-pi; vpas:=2*pi/subh; vmax:=2*pi; + apj:=0; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetAnneau[](expr nbpn,sectionanneau)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,3) of nbpn&"; "&nbpn&";"); + vardef Famille(expr u,v)=((xpart(point(u) of sectionanneau)*cos(v),xpart(point(u) of sectionanneau)*sin(v),ypart(point(u) of sectionanneau))) enddef; + umin:=0; umax:=nbp; upas:=1; + vmin:=-pi; vpas:=2*pi/subh; vmax:=pi; + apj:=0; + %On crée les facettes et on calcule la profondeur en Z. + for k=0 upto (nbp-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas)); + OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas)); + OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas)); + OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetPrisme[](expr axen,hn)(text tn)=%pb avec certaines positions de l'observateur.->maillage vertical + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,1) of hn&"; "&hn&";"); + scantokens("color "&substring(0,3) of axen&"; "&axen&";"); + nbsn:=0;%nb sommets total pour la base + for _p=tn: + Sommet[nbsn]:=_p; + nbsn:=nbsn+1; + endfor; + apj:=0; + if creux=false: + Ferme.@:=true; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsn; + for k=1 upto nbsn: + OTFc.@[apj][k]:=Image(Sommet[nbsn-k]); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn; + apj:=apj+1; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsn; + for k=1 upto nbsn: + OTFc.@[apj][k]:=Image(Sommet[k-1]+h*axe); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn; + apj:=apj+1; + else: + Ferme.@:=false; + fi; + for k=1 upto nbsn: + for l=0 upto (subh-1): + for p=0 upto (nb-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe)); + OTFc.@[apj][2]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe)); + OTFc.@[apj][3]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe)); + OTFc.@[apj][4]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef Objetcube[](expr ar)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux=true:Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of ar&"; "&ar&";"); + Sommet1:=(a/2,-a/2,-a/2); + Sommet2:=(a/2,a/2,-a/2); + Sommet3:=(-a/2,a/2,-a/2); + Sommet4:=(-a/2,-a/2,-a/2); + Sommet5:=(-a/2,-a/2,a/2); + Sommet6:=(a/2,-a/2,a/2); + Sommet7:=(a/2,a/2,a/2); + Sommet8:=(-a/2,a/2,a/2); +%%Faces + apj:=0; + for p=1 upto 4: + for l=0 upto (subh-1): + for k=0 upto (subh-1): + OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + endfor; + %face du dessous + for l=0 upto (subh-1): + for k=0 upto (subh-1): + OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1)); + OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1)); + OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1)); + OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + %face du dessus + for l=0 upto (subh-1): + for k=0 upto (subh-1): + OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6)); + OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6)); + OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6)); + OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + OTFc.@[k].nb:=4; + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef Objetpave[](expr Lln,Hhn,Ppn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux=true: Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of Lln&"; "&Lln&";"); + scantokens("numeric "&substring(0,1) of Hhn&"; "&Hhn&";"); + scantokens("numeric "&substring(0,1) of Ppn&"; "&Ppn&";"); + NbS:=8; + Sommet1:=(P/2,-L/2,-H/2); + Sommet2:=(P/2,L/2,-H/2); + Sommet3:=(-P/2,L/2,-H/2); + Sommet4:=(-P/2,-L/2,-H/2); + Sommet5:=(-P/2,-L/2,H/2); + Sommet6:=(P/2,-L/2,H/2); + Sommet7:=(P/2,L/2,H/2); + Sommet8:=(-P/2,L/2,H/2); +%%Faces + apj:=0; + for p=1 upto 4: + for l=0 upto (subh-1): + for k=0 upto (subh-1): + OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p])); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + endfor; + %face du dessous + for l=0 upto (subh-1): + for k=0 upto (subh-1): + OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1)); + OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1)); + OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1)); + OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + %face du dessus + for l=0 upto (subh-1): + for k=0 upto (subh-1): + OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6)); + OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6)); + OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6)); + OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + OTFc.@[k].nb:=4; + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef Objetgrille[](expr amn,ann,bmn,bnn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + Ferme.@:=false; + scantokens("numeric "&substring(0,2) of amn&"; "&amn&";"); + scantokens("numeric "&substring(0,2) of ann&"; "&ann&";"); + scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";"); + scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";"); + apj:=0; + upas:=(an-am)/nb; + vpas:=(bn-bm)/subh; + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image((am+k*upas,bm+l*vpas,0)); + OTFc.@[apj][2]:=Image((am+(k+1)*upas,bm+l*vpas,0)); + OTFc.@[apj][3]:=Image((am+(k+1)*upas,bm+(l+1)*vpas,0)); + OTFc.@[apj][4]:=Image((am+k*upas,bm+(l+1)*vpas,0)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetgrilleYZ[](expr amn,ann,bmn,bnn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + Ferme.@:=false; + scantokens("numeric "&substring(0,2) of amn&"; "&amn&";"); + scantokens("numeric "&substring(0,2) of ann&"; "&ann&";"); + scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";"); + scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";"); + apj:=0; + upas:=(an-am)/nb; + vpas:=(bn-bm)/subh; + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image((0,am+k*upas,bm+l*vpas)); + OTFc.@[apj][2]:=Image((0,am+(k+1)*upas,bm+l*vpas)); + OTFc.@[apj][3]:=Image((0,am+(k+1)*upas,bm+(l+1)*vpas)); + OTFc.@[apj][4]:=Image((0,am+k*upas,bm+(l+1)*vpas)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetRuban[](expr hn)(text tn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("numeric "&substring(0,1) of hn&"; "&hn&";"); + nbsn:=0;%nb sommets total pour la base + for _p=tn: + Sommet[nbsn]:=_p; + nbsn:=nbsn+1; + endfor; + Ferme.@:=false; + apj:=0; + for k=1 upto (nbsn-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image(Sommet[k-1]+(l/subh)*(h*(0,0,1))); + OTFc.@[apj][2]:=Image(Sommet[k]+(l/subh)*(h*(0,0,1))); + OTFc.@[apj][3]:=Image(Sommet[k]+((l+1)/subh)*(h*(0,0,1))); + OTFc.@[apj][4]:=Image(Sommet[k-1]+((l+1)/subh)*(h*(0,0,1))); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + apj:=apj+1; + endfor; + endfor; + apj:=apj-1; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +vardef ObjetBiface[](text tn)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + nbsn:=0;%nb sommets total pour la base + for _p=tn: + nbsn:=nbsn+1; + Sommet[nbsn]:=_p; + endfor; + %Ferme.@:=true; + apj:=0; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsn; + for k=1 upto nbsn: + OTFc.@[apj][k]:=Image(Sommet[nbsn+1-k]); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn; + apj:=apj+1; + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=nbsn; + for k=1 upto nbsn: + OTFc.@[apj][k]:=Image(Sommet[k]); + endfor; + OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn; + for k=0 upto apj: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +lambda:=3; +mu:=2; + +vardef Objetplan[](expr Ann,Bnn,Cnn)=%à modifier mais pour l'instant ça marche pour les intersections; + Outcolor.@:=outcolor; + Incolor.@:=incolor; + Ferme.@:=false; + color PPP[]; + scantokens("color "&substring(0,2) of Ann&"; "&Ann&";"); + scantokens("color "&substring(0,2) of Bnn&"; "&Bnn&";"); + scantokens("color "&substring(0,2) of Cnn&"; "&Cnn&";"); + apj:=0; + PPP[0]=Image(An-lambda*(Bn-An)-mu*(Cn-An)); + PPP[1]=Image(An+lambda*(Bn-An)-mu*(Cn-An)); + PPP[2]=Image(An+lambda*(Bn-An)+mu*(Cn-An)); + PPP[3]=Image(An-lambda*(Bn-An)+mu*(Cn-An)); + for k=0 upto (nb-1): + for l=0 upto (subh-1): + tcpt.@[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Image((k/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0)); + OTFc.@[apj][2]:=Image(((k+1)/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0)); + OTFc.@[apj][3]:=Image(((k+1)/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0)); + OTFc.@[apj][4]:=Image((k/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0)); + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef Objettetraedre[](expr ar)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux=true:Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of ar&"; "&ar&";"); + Sommet0:=a*(-0.81650,-0.47140,-1/3); + Sommet1:=a*(0.81650,-0.471402,-1/3); + Sommet2:=a*(0,0.94281,-1/3); + Sommet3:=a*(0,0,1); + tcpt.@[0]:=0; + OTFc.@[0].nb:=3; + OTFc.@[0][1]:=Image(Sommet0); + OTFc.@[0][2]:=Image(Sommet2); + OTFc.@[0][3]:=Image(Sommet1); + OTFc.@[0].iso:=(OTFc.@[0][1]+OTFc.@[0][2]+OTFc.@[0][3])/3; + tcpt.@[1]:=1; + OTFc.@[1].nb:=3; + OTFc.@[1][1]:=Image(Sommet0); + OTFc.@[1][2]:=Image(Sommet1); + OTFc.@[1][3]:=Image(Sommet3); + OTFc.@[1].iso:=(OTFc.@[1][1]+OTFc.@[1][2]+OTFc.@[1][3])/3; + tcpt.@[2]:=2; + OTFc.@[2].nb:=3; + OTFc.@[2][1]:=Image(Sommet1); + OTFc.@[2][2]:=Image(Sommet2); + OTFc.@[2][3]:=Image(Sommet3); + OTFc.@[2].iso:=(OTFc.@[2][1]+OTFc.@[2][2]+OTFc.@[2][3])/3; + tcpt.@[3]:=3; + OTFc.@[3].nb:=3; + OTFc.@[3][1]:=Image(Sommet2); + OTFc.@[3][2]:=Image(Sommet0); + OTFc.@[3][3]:=Image(Sommet3); + OTFc.@[3].iso:=(OTFc.@[3][1]+OTFc.@[3][2]+OTFc.@[3][3])/3; + for k=0 upto 3: + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=3; +enddef; + +vardef Objetoctaedre[](expr ar)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux=true:Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of ar&"; "&ar&";"); + AA=a*sqrt(2)/2; + ObjetNew.@((0,0,-a),(-AA,-AA,0),(AA,-AA,0),(AA,AA,0),(-AA,AA,0),(0,0,a))(% + 3,0,2,1,% + 3,0,3,2,% + 3,0,4,3,% + 3,0,1,4,% + 3,5,1,2,% + 3,5,2,3,% + 3,5,3,4,% + 3,5,4,1% + ); +enddef; + +vardef Objeticosaedre[](expr ar)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux=true:Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of ar&"; "&ar&";"); + aplus=sqrt((5+sqrt(5))/10); + amoins=sqrt((5-sqrt(5))/10); + bplus=(5+sqrt(5))/10; + bmoins=(5-sqrt(5))/10; + Cmp=sqrt(5)/5; + ObjetNew.@(a*(0,1,0),a*(amoins,Cmp,-bplus),a*(-amoins,Cmp,-bplus),a*(-aplus,Cmp,bmoins),a*(0,Cmp,2*Cmp),a*(aplus,Cmp,bmoins),a*(amoins,-Cmp,bplus),a*(-amoins,-Cmp,bplus),a*(-aplus,-Cmp,-bmoins),a*(0,-Cmp,-2*Cmp),a*(aplus,-Cmp,-bmoins),a*(0,-1,0))(% + 3,1,5,6,% + 3,1,4,5,% + 3,1,3,4,% + 3,1,2,3,% + 3,1,6,2,% + 3,7,6,5,% + 3,8,5,4,% + 3,9,4,3,% + 3,10,3,2,% + 3,11,2,6,% + 3,6,7,11,% + 3,5,8,7,% + 3,4,9,8,% + 3,3,10,9,% + 3,2,11,10,% + 3,12,10,11,% + 3,12,9,10,% + 3,12,8,9,% + 3,12,7,8,% + 3,12,11,7); +enddef; + +vardef Objetdodecaedre[](expr ar)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + if creux=true:Ferme.@:=false else: Ferme.@:=true fi; + scantokens("numeric "&substring(0,1) of ar&"; "&ar&";"); + Ap=a*sqrt((5+2*sqrt(5))/15); + Bp=a*sqrt((10+2*sqrt(5))/15); + Cp=a*sqrt((5+sqrt(5))/30); + Dp=a*(sqrt(15)+sqrt(3))/6; + Am=a*sqrt((5-2*sqrt(5))/15); + Bm=a*sqrt((10-2*sqrt(5))/15); + Cm=a*sqrt((5-sqrt(5))/30); + Dm=a*(sqrt(15)-sqrt(3))/6; + Ee:=a*sqrt(3)/3; + ObjetNew.@((0,Ap,-Bm),(-Ee,Ap,-Am),(-Dm,Ap,Cp),(Dm,Ap,Cp),(Ee,Ap,-Am),(0,Am,-Bp),(-Dp,Am,-Cm),(-Ee,Am,Ap),(Ee,Am,Ap),(Dp,Am,-Cm),(0,-Am,Bp),(Dp,-Am,Cm),(Ee,-Am,-Ap),(-Ee,-Am,-Ap),(-Dp,-Am,Cm),(0,-Ap,Bm),(Ee,-Ap,Am),(Dm,-Ap,-Cp),(-Dm,-Ap,-Cp),(-Ee,-Ap,Am))(% + 5,5,1,2,3,4,% + 5,1,5,10,13,6,% + 5,2,1,6,14,7,% + 5,3,2,7,15,8,% + 5,4,3,8,11,9,% + 5,5,4,9,12,10,% + 5,6,13,18,19,14,% + 5,7,14,19,20,15,% + 5,8,15,20,16,11,% + 5,9,11,16,17,12,% + 5,10,12,17,18,13,% + 5,16,20,19,18,17% + ); +enddef; + +vardef ObjetNew[](text listesommets)(text listefaces)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + color Sommet[]; + nbs:=0; + mini:=min(listefaces); + if mini=0: + for _p=listesommets: + Sommet[nbs]:=_p; + nbs:=nbs+1; + endfor; + elseif mini=1: + for _p=listesommets: + nbs:=nbs+1; + Sommet[nbs]:=_p; + endfor; + fi; + apj:=0; + j:=0;%pour compter le nombre de sommets à conserver + for p_=listefaces: + if j=0: + OTFc.@[apj].nb:=p_; + j:=1; + k:=0; + else: + k:=k+1; + if k<>OTFc.@[apj].nb: + OTFc.@[apj][k]:=Image(Sommet[p_]); + else: + OTFc.@[apj][k]:=Image(Sommet[p_]); + j:=0; + apj:=apj+1; + fi; + fi; + endfor; + apj:=apj-1; + for k=0 upto apj: + OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb; + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; +enddef; + +%Objet lecture externe + +vardef ObjetOFF[](expr nomfichier)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + OFF:=true; + string s_; + s_=readfrom nomfichier; + string ss[]; + if s_<>EOF: + ss1 := loptok s_; + t_ := if ss1="%": 0 else: 1 fi; + forever: + ss[incr t_] := loptok s_; + exitif ss[t_]=""; + endfor; + %else: false + show ss1; + fi; +% NbS:=round(Mexp Mlog_str ss1); +% NF:=round(Mexp Mlog_str ss2); +% s_:=readfrom nomfichier; +% if debut=0: +% for k=0 upto NbS-1: +% s_:=readfrom nomfichier; +% if s_<>EOF: +% ss1 := loptok s_; +% n_ := if ss1="%": 0 else: 1 fi; +% forever: +% ss[incr n_] := loptok s_; +% exitif ss[n_]=""; +% endfor +% else: false +% fi; +% Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle))); +% endfor; +% else: +% for k=1 upto NbS: +% s_:=readfrom nomfichier; +% if s_<>EOF: +% ss1 := loptok s_; +% n_ := if ss1="%": 0 else: 1 fi; +% forever: +% ss[incr n_] := loptok s_; +% exitif ss[n_]=""; +% endfor +% else: false +% fi; +% Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle))); +% endfor; +% fi; +% apj:=0; +% for nf=-4000 upto (-4000+NF)-1: +% s_:=readfrom nomfichier; +% if s_<>EOF: +% ss1 := loptok s_; +% n_ := if ss1="%": 0 else: 1 fi; +% forever: +% ss[incr n_] := loptok s_; +% exitif ss[n_]=""; +% endfor +% else: false +% fi; +% OTFc.@[apj].nb:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face +% for nl=1 upto OTFc.@[apj].nb: +% if invnormale=1: +% OTFc.@[apj][nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]); +% else: +% OTFc.@[apj][OTFc.@[apj].nb+1-nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]); + % fi; + % endfor; + % OTFc.@[apj].iso:=(OTFc.@[apj][1] for l=2 upto OTFc.@[apj].nb:+OTFc.@[apj][l] endfor)/OTFc.@[apj].nb; + % ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + % if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + % Vue.@[apj]:=true;coul.@[apj]:=outcolor; + % else: + % Vue.@[apj]:=false;coul.@[apj]:=incolor; + % fi; + % apj:=apj+1; + %endfor; + %apj.@:=apj-1; + closefrom nomfichier; +enddef; + +vardef ObjetOBJ[](expr nomfichier)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + string s_; + string ss[]; + nbss:=1; + apj:=0; + forever: + s_:=readfrom nomfichier; + if s_<>EOF: + ss0 := loptok s_; + if ss0="v": + n_:=0; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor + Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle))); + nbss:=incr nbss; + elseif ss0="f": + n_:=0; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor; + OTFc.@[apj].nb:=n_-1; + for k=1 upto OTFc.@[apj].nb: + if invnormale=1: + OTFc.@[apj][OTFc.@[apj].nb-k+1] := Image(Sommet[round(Mexp(Mlog_str ss[k]))]) + %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]: + % show OTFc.@[apj][OTFc.@[apj].nb-k+1]; + %fi; + else: + OTFc.@[apj][k] := Image(Sommet[round(Mexp(Mlog_str ss[k]))]) + %if unknown OTFc.@[apj][k]: + % show OTFc.@[apj][k]; + %fi; + fi; + + endfor; + apj:=apj+1; + fi; + fi; + exitif s_=EOF; + endfor; + apj:=apj-1; + for k=0 upto apj: + OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb; + ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso)); + if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0: + Vue.@[k]:=true;coul.@[k]:=outcolor; + else: + Vue.@[k]:=false;coul.@[k]:=incolor; + fi; + endfor; + apj.@:=apj; + closefrom nomfichier; +enddef; + + +%%%%%%%Objets travaillés + +vardef ObjetEnleve[](text t)=%les numéros des faces sont données par ordre croissant. + numeric numface[]; + nface:=0; + numface[0]:=0; + %récupérer les numéros des faces. + forsuffixes _p=t: + nface:=nface+1; + numface[nface]=_p-(nface-1);%marchait :) + endfor; + numface[nface+1]:=apj.@-nface+1; + %Mettre dans l'ordre ces numéros.<-déjà fait par l'utilisateur + %enlever les numéros des faces + apj:=0; + for k=0 upto nface: + for l=numface[k] upto (numface[k+1]-1): + tcpt.@[apj]:=tcpt.@[apj+k]; + OTFc.@[apj].nb:=OTFc.@[apj+k].nb; + for p=1 upto OTFc.@[apj].nb: + OTFc.@[apj][p]:=OTFc.@[apj+k][p]; + endfor; + OTFc.@[apj].iso:=OTFc.@[apj+k].iso; + ALT.@[apj]:=ALT.@[apj+k]; + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetDeplacement[](text t)= + %permet de déplacer un objet en donnant au préalable les angles de rotations et la translation. On peut également appliquer une transformation. + Outcolor.@:=outcolor; + Incolor.@:=incolor; + apj:=0; + forsuffixes p_=t: + Ferme.@:=Ferme[p_]; + for k=0 upto apj[p_]: + cpt.@[apj]:=cpt[p_][k]; + OTFc.@[apj].nb:=OTFc[p_][k].nb; + for l=1 upto OTFc.@[apj].nb: + OTFc.@[apj][l]:=Image(OTFc[p_][k][l]); + endfor; + OTFc.@[apj].iso:=Image(OTFc[p_][k].iso); + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=Outcolor[p_]; + else: + %if Ferme.@=false: + Vue.@[apj]:=false;coul.@[apj]:=Incolor[p_]; + %else: + % apj:=apj-1; + %fi; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef ObjetFusion[](text t)= + Outcolor.@:=outcolor; + Incolor.@:=incolor; + tapj:=0; + Nbobj:=0; + forsuffixes p_=t: + for k=0 upto apj[p_]: + cpt.@[tapj]:=tapj; + OTFc.@[tapj].nb:=OTFc[p_][k].nb; + for p=1 upto OTFc.@[tapj].nb: + OTFc.@[tapj][p]:=Image(OTFc[p_][k][p]); + endfor; + OTFc.@[tapj].iso:=Image(OTFc[p_][k].iso); + ALT.@[tapj]:=-Zpart(GCoord(OTFc.@[tapj].iso)); + Vue.@[tapj]:=Vue[p_][k]; + coul.@[tapj]:=coul[p_][k]; + tapj:=tapj+1; + endfor; + endfor; + apj.@:=tapj-1; +enddef; + +%les intersections d'objets + +vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd) + save di,vc; + color va,vb,vc,vd; + vd=Normal(bb,cc,dd); + va=vd/Norm(vd); + vb=aa-bb; + di=-ProduitScalaire(vb,va); + va:=di*va; + vb:=vb+va; + vc=bb+vb; + vc +enddef; + +%%denis Roegel---------- +vardef IntersectionPlandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :) + save Int; + boolean Int; + color gg,caaa[],Caaa[]; + caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc)); + caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi; + caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi; + ww:=ProduitScalaire(caaa2,caaa3); + if ww<>0: + %if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1): + caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww); + Int:=true; + %else: + % Int:=false; + %fi; + else: % the line is parallel to the plane + Int:=false; + fi; + Int +enddef; + +vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :) + save Int; + boolean Int; + color gg,caaa[],Caaa[]; + caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc)); + caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi; + caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi; + ww:=ProduitScalaire(caaa2,caaa3); + if ww<>0: + if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1): + %message("ww"&decimal(ww)&" PS"&decimal(ProduitScalaire(caaa1,caaa3))&""); + caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww); + Int:=true; + else: + Int:=false; + fi; + else: % the line is parallel to the plane + Int:=false; + fi; + Int +enddef; + +vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee) + if Intersectionplandroite(aa,bb,cc,dd,ee): + gg=dd+caaa4; + fi; + gg +enddef; + +vardef IPP(expr aa,bb,cc,dd,ee,ff)= + %a vérifier + %save da,db,dc; + boolean int; + da:=Norm(aa-ProjectionsurPlan(aa,dd,ee,ff)); + db:=Norm(bb-ProjectionsurPlan(bb,dd,ee,ff)); + dc:=Norm(cc-ProjectionsurPlan(cc,dd,ee,ff)); + if (da=db) and (db=dc): % the two planes are parallel + int:=false; + else: + int:=true; + nbi:=nbi+1; + fi; +enddef; +%%--------------------- + +vardef ObjetIntersection[](text t)=%plan n°1 solide n°2 + color INTER[][][];%pour avoir les points d'intersection + nbsol:=1; + forsuffixes p_=t: + pp_[nbsol]:=p_; + nbsol:=nbsol+1; + endfor; + nbi:=0; + for k=0 upto apj[pp_[2]]: + IPP(OTFc[pp_[2]][k][1],OTFc[pp_[2]][k][2],OTFc[pp_[2]][k][3],PPP0,PPP1,PPP2); + if int=true: + nbint:=0; + OTFc[pp_[2]][k][OTFc[pp_[2]][k].nb+1]=OTFc[pp_[2]][k][1]; + for l=1 upto (OTFc[pp_[2]][k].nb): + if Intersectionplandroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]): + nbint:=nbint+1; + INTER[pp_2][k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]); + fi; + endfor; + %%%Pas satisfaisant -> à travailler + %show nbint; + if nbint=2: + draw Projette(INTER[pp_2][k][1])--Projette(INTER[pp_2][k][2]) withpen pencircle scaled2bp withcolor violet; + fi; + fi; + endfor; +enddef; + +vardef ObjetSepare[](expr nbd,nbD)=%nbd pour l'objet du dessous, nbD pour l'objet du dessus. + Ferme[nbd]:=Ferme.@; + Ferme[nbD]:=Ferme.@; + Outcolor[nbd]:=outcolor; + Incolor[nbd]:=incolor; + Outcolor[nbD]:=outcolor; + Incolor[nbD]:=incolor; + color INTER[][][]; + color Nn;color PPP.iso; + Nn=Normal(PPP0,PPP1,PPP3); + PPP.iso=(PPP0+PPP1+PPP2)/3; + apj:=0;bpj:=0;%bpj pour le 2eme solide + for k=0 upto apj.@: + if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)<=0: + nbint:=0; + OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1]; + for l=1 upto OTFc.@[k].nb: + if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]): + nbint:=nbint+1; + INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]); + prec.@[k][nbint]:=l; + suiv.@[k][nbint]:=l+1; + fi; + endfor; + if nbint=0: + tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb; + for l=1 upto OTFc[nbd][apj].nb: + OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + fi; + if nbint=2: + tcpt[nbd][apj]:=apj; + if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0: + compt:=0; + for l=1 upto prec.@[k][1]: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]); + OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]); + compt:=compt+2; + for l=suiv.@[k][2] upto OTFc.@[k].nb: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj].nb:=compt; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + %2eme solide + compt:=1; + OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]); + for l=suiv.@[k][1] upto prec.@[k][2]: + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]); + endfor; + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]); + OTFc[nbD][bpj].nb:=compt; + OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb; + ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso)); + if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0: + Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor; + else: + Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor; + fi; + bpj:=bpj+1; + %fin 2eme solide + else: + compt:=1; + OTFc[nbd][apj][1]:=Image(INTER.@[k][1]); + for l=suiv.@[k][1] upto prec.@[k][2]: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]); + OTFc[nbd][apj].nb:=compt; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + %2eme solide + compt:=0; + for l=1 upto prec.@[k][1]: + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]); + OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]); + compt:=compt+2; + for l=suiv.@[k][2] upto OTFc.@[k].nb: + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbD][bpj].nb:=compt; + OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb; + ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso)); + if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0: + Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor; + else: + Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor; + fi; + bpj:=bpj+1; + %fin 2eme solide + fi; + fi; + if nbint=1: + compt:=0;%compteur pour le nb de sommets + comp:=0;%pour savoir où se situe le point à enlever + for l=1 upto OTFc.@[k].nb: + if ProduitScalaire(Nn,OTFc.@[k][l]-PPP.iso)>0: + comp:=comp+1; + fi; + endfor; + if comp=1: + tcpt[nbd][apj]:=apj; + for l=1 upto prec.@[k][1]-1: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(INTER.@[k][1]); + for l=suiv.@[k][1] upto OTFc.@[k].nb: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj].nb:=compt; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + else: + tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb; + for l=1 upto OTFc[nbd][apj].nb: + OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + fi; + fi; + fi; + if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)>0: + nbint:=0; + OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1]; + for l=1 upto OTFc.@[k].nb: + if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]): + nbint:=nbint+1; + INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]); + prec.@[k][nbint]:=l; + suiv.@[k][nbint]:=l+1; + fi; + endfor; + %2eme solide sans intersection + if nbint=0: + tcpt[nbD][bpj]:=bpj; OTFc[nbD][bpj].nb:=OTFc.@[k].nb; + for l=1 upto OTFc[nbD][bpj].nb: + OTFc[nbD][bpj][l]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb; + ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso)); + if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0: + Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor; + else: + Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor; + fi; + bpj:=bpj+1; + fi; + %fin 2eme solide + if nbint=2: + tcpt[nbd][apj]:=apj; + if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0: + compt:=0; + for l=1 upto prec.@[k][1]: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]); + OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]); + compt:=compt+2; + for l=suiv.@[k][2] upto OTFc.@[k].nb: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbd][apj].nb:=compt; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + %2eme solide + compt:=1; + OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]); + for l=suiv.@[k][1] upto prec.@[k][2]: + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]); + endfor; + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]); + OTFc[nbD][bpj].nb:=compt; + OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb; + ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso)); + if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0: + Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor; + else: + Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor; + fi; + bpj:=bpj+1; + %fin 2eme solide + else: + compt:=1; + OTFc[nbd][apj][1]:=Image(INTER.@[k][1]); + for l=suiv.@[k][1] upto prec.@[k][2]: + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]); + endfor; + compt:=compt+1; + OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]); + OTFc[nbd][apj].nb:=compt; + OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb; + ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso)); + if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0: + Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor; + else: + Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor; + fi; + apj:=apj+1; + %2eme solide + compt:=0; + for l=1 upto prec.@[k][1]: + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]); + OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]); + compt:=compt+2; + for l=suiv.@[k][2] upto OTFc.@[k].nb: + compt:=compt+1; + OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]); + endfor; + OTFc[nbD][bpj].nb:=compt; + OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb; + ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso)); + if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0: + Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor; + else: + Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor; + fi; + bpj:=bpj+1; + %fin 2eme solide + fi; + fi; + fi; + endfor; + apj[nbd]:=apj-1; + apj[nbD]:=bpj-1; +enddef; + +%pour les lignes de niveaux. +vardef ObjetSurfaceZ[](expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)= + surfz:=true; + Outcolor.@:=outcolor; + Incolor.@:=incolor; + scantokens("vardef Fz(expr X,Y)="&fn&" enddef;"); + apj:=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))); + endfor; + endfor; + for k=(nblignes-1) downto 0: + for l=(nbpoints-3) step -3 until 0: + cpt[apj]:=apj; + OTFc.@[apj].nb:=4; + OTFc.@[apj][1]:=Yc[k][l]; + OTFc.@[apj][2]:=Yc[k+1][l]; + OTFc.@[apj][3]:=Yc[k+1][l+3]; + OTFc.@[apj][4]:=Yc[k][l+3]; + OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4; + ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso)); + if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0: + Vue.@[apj]:=true;coul.@[apj]:=outcolor; + else: + Vue.@[apj]:=false;coul.@[apj]:=incolor; + fi; + apj:=apj+1; + endfor; + endfor; + apj.@:=apj-1; +enddef; + +vardef GrilleSurfZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)= + drawoptions(withcolor gris); + for k=zmin upto zmax: + draw Projette((-xmin,ymin,k))--Projette((-xmax,ymin,k))--Projette((-xmax,ymax,k)); + endfor; + for k=ymin upto ymax: + draw Projette((-xmin,k,zmin))--Projette((-xmax,k,zmin))--Projette((-xmax,k,zmax)); + endfor; + for k=xmin upto xmax: + draw Projette((-k,ymax,zmin))--Projette((-k,ymin,zmin))--Projette((-k,ymin,zmax)); + endfor; + drawoptions(); + if Phi<>90: + for k=zmin step zpas until zmax: + label.lft(""&decimal(zechelle*k)&"",Projette((-xmin,ymin,k))); + endfor; + for k=ymin step ypas until ymax: + label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin))); + endfor; + for k=xmin step xpas until xmax: + label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin))); + endfor; + labeloffset:=8*labeloffset; + label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin))); + label.lft(btex $z$ etex,Projette((-xmin,ymin,(zmin+zmax)/2))); + label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin))); + labeloffset:=labeloffset/8; + else: + for k=ymin step ypas until ymax: + label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin))); + endfor; + for k=xmin step xpas until xmax: + label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin))); + endfor; + labeloffset:=8*labeloffset; + label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin))); + label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin))); + labeloffset:=labeloffset/8; + fi; +enddef; + +vardef GrilleSurfZZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)= + drawoptions(withcolor gris); + for k=zmin upto zmax: + draw Projette((xmin,ymin,k))--Projette((xmin,ymax,k))--Projette((xmax,ymax,k)); + endfor; + for k=ymin upto ymax: + draw Projette((xmax,k,zmin))--Projette((xmin,k,zmin))--Projette((xmin,k,zmax)); + endfor; + for k=xmin upto xmax: + draw Projette((k,ymin,zmin))--Projette((k,ymax,zmin))--Projette((k,ymax,zmax)); + endfor; + drawoptions(); + if Phi<>90: + for k=zmin step zpas until zmax: + label.lft(""&decimal(zechelle*k)&"",Projette((xmin,ymin,k))); + endfor; + for k=ymin step ypas until ymax: + label.rt(""&decimal(k)&"",Projette((xmax,k,zmin))); + endfor; + for k=xmin step xpas until xmax: + label.bot(""&decimal(k)&"",Projette((k,ymin,zmin))); + endfor; + labeloffset:=8*labeloffset; + label.rt(btex $y$ etex,Projette((xmax,(ymin+ymax)/2,zmin))); + label.lft(btex $z$ etex,Projette((xmin,ymin,(zmin+zmax)/2))); + label.bot(btex $x$ etex,Projette(((xmin+xmax)/2,ymin,zmin))); + labeloffset:=labeloffset/8; + else: + for k=ymin step ypas until ymax: + label.bot(""&decimal(k)&"",Projette((xmin,k,zmin))); + endfor; + for k=xmin step xpas until xmax: + label.rt(""&decimal(k)&"",Projette((k,ymax,zmin))); + endfor; + labeloffset:=8*labeloffset; + label.bot(btex $y$ etex,Projette((xmin,(ymin+ymax)/2,zmin))); + label.rt(btex $x$ etex,Projette(((xmin+xmax)/2,ymax,zmin))); + labeloffset:=labeloffset/8; + fi; +enddef; + +vardef Legende(expr xmax,ymax,nbplan,zechelle)= + path legende[]; + for k=1 upto nbplan+1: + legende[k]=Projette((-xmax,ymax+1,k-0.5))--Projette((-xmax,ymax+1,k))--Projette((-xmax,ymax+2,k))--Projette((-xmax,ymax+2,k-0.5))--cycle; + endfor; + for k=1 upto nbplan+1: + fill legende[k] withcolor Outcolor[k]; + draw legende[k]; + label.rt(""&decimal(zechelle*(k-1))&" - "&decimal(zechelle*k)&"",Projette((-xmax,ymax+2,k-0.25))); + endfor; +enddef; + +vardef MaillageZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)= + traits:=true; + scantokens("vardef Fz(expr X,Y)="&fn&" enddef;"); + IncX:=(xmax-xmin)/nbpoints; + IncY:=(ymax-ymin)/nblignes; + color Yc[][],Xc[][]; + 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; + for l=0 upto nbpoints: + x:=xmax-l*IncX; + y:=ymin; + Xc[l][0]:=(x,y,Fz(x,y)); + for k=1 upto nblignes: + Xc[l][k]=(x,ymin+k*IncY,Fz(x,ymin+k*IncY)); + endfor; + endfor; + for k=nblignes downto 0: + draw Projette(Yc[k][nbpoints]) + for l=(nbpoints-1) downto 0: + ..Projette(Yc[k][l]) + endfor; + endfor; + for l=nbpoints downto 0: + draw Projette(Xc[l][nblignes]) + for k=nblignes-1 downto 0: + ..Projette(Xc[l][k]) + endfor; + endfor; +enddef; + +endinput; diff --git a/macros/latex/contrib/profcollege/metapost/PfCPseudo.mp b/macros/latex/contrib/profcollege/metapost/PfCPseudo.mp index 7b98805397..66d7fae82a 100644 --- a/macros/latex/contrib/profcollege/metapost/PfCPseudo.mp +++ b/macros/latex/contrib/profcollege/metapost/PfCPseudo.mp @@ -1436,7 +1436,7 @@ vardef FinBlocRepeter= drawoptions(); texto=image( labeloffset:=0; - label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\barre Titi titi titi tit itit tit it it ti}"),if unknown _coinprec: (0,0) else:_coinprec fi); + label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi); labeloffset:=3; ); path cadre; @@ -1778,7 +1778,7 @@ vardef FinNouveauBloc=% drawoptions(); texto=image( labeloffset:=0; - label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\phantom{\barre fin du bloc}}"),if unknown _coinprec: (0,0) else:_coinprec fi); + label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi); labeloffset:=3; ); path cadre; diff --git a/macros/latex/contrib/profcollege/metapost/PfCScratch.mp b/macros/latex/contrib/profcollege/metapost/PfCScratch.mp index 2f2db0ee74..10a8972ef8 100644 --- a/macros/latex/contrib/profcollege/metapost/PfCScratch.mp +++ b/macros/latex/contrib/profcollege/metapost/PfCScratch.mp @@ -52,7 +52,11 @@ enddef; %%%%Alias def Place expr o = - if path o: draw o else: draw o fi + if path o: draw o else: draw o fi +enddef; + +def Placer expr o = + if path o: draw o else: draw o fi enddef; %impression @@ -1654,7 +1658,7 @@ vardef FinBlocRepeter= drawoptions(); texto=image( labeloffset:=0; - label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{~~}"),if unknown _coinprec: (0,0) else:_coinprec fi); + label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi); labeloffset:=3; ); path cadre; @@ -1742,7 +1746,7 @@ vardef FinBlocSi= drawoptions(); texto=image( labeloffset:=0; - label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\phantom{\barre fin du bloc}}"),if unknown _coinprec: (0,0) else:_coinprec fi); + label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi); labeloffset:=3; ); path cadre; @@ -1792,6 +1796,7 @@ fi; $=image( fill cadre withcolor if print : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi; draw cadre withcolor if print : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi; + draw texto; if BlocStopAvant=false: draw (coindebutbloc[numblocrep]+(0.0625+0.5cm,0)+(eb,0)){dir180}.. {dir-90}(coindebutbloc[numblocrep]+(0.5cm,0)+(0,-eb))-- @@ -1853,7 +1858,7 @@ vardef Sinon= drawoptions(); texto=image( labeloffset:=0; - label.lrt(TEX("\, \hbox to"&decimal(LongRep[numblocrep])&"pt{\bfseries\barre sinon}"),if unknown _coinprec: (0,0) else:_coinprec fi) if print=false : withcolor blanc fi; + label.lrt(TEX("\barre\,\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi) if print=false : withcolor blanc fi; labeloffset:=3; ); path cadre; @@ -1901,7 +1906,9 @@ vardef Sinon= $=image( fill cadre withcolor if print=true : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi; draw cadre withcolor if print=true : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi; - draw texto; + drawoptions(withcolor white); + label.rt(TEX("\longbarre\sffamily\bfseries sinon"),(xpart(llcorner texto),ypart(center texto))); + drawoptions(); if BlocStopAvant=false: draw (coindebutbloc[numblocrep]+(0.0625+0.5cm,0)+(eb,0.125)){dir180}.. {dir-90}(coindebutbloc[numblocrep]+(0.5cm,0)+(0,-eb))-- @@ -3370,3 +3377,71 @@ vardef ListeLongueur(expr nbpas)= $ enddef; +vardef Boussole(expr nbpas)= + save $; picture $; + picture Bouss[]; + Bouss1=image( + draw Orienter("90"); + ); + Bouss2=image( + _coinprec:=(0,0); + draw Orienter("0"); + ); + Bouss3=image( + _coinprec:=(0,0); + draw Orienter("-90"); + ); + Bouss4=image( + _coinprec:=(0,0); + draw Orienter("180"); + ); + $=image( + draw Bouss1 rotatedabout(center Bouss1,-90) shifted ((2cm,0)-(center Bouss1)); + draw Bouss2 shifted ((0,2cm)-(center Bouss2)); + draw Bouss3 rotatedabout(center Bouss3,90) shifted((-2cm,0)-(center Bouss3)); + draw Bouss4 rotatedabout(center Bouss4,180) shifted((0,-2cm)-(center Bouss4)); + pair PtBous[]; + PtBous1=(-1.2cm,-1.2cm); + PtBous2-PtBous1=(2*1.2cm,0); + PtBous3-PtBous2=(0,2*1.2cm); + PtBous4-PtBous3=PtBous1-PtBous2; + path CadreBous; + CadreBous=(PtBous1+(0,eb)){dir-90}..{dir0}(PtBous1+(eb,0)) if nbpas="180":--0.4[PtBous1,PtBous2]--(1/2[PtBous1,PtBous2]+(0,-0.3cm))--0.6[PtBous1,PtBous2] fi--(PtBous2+(-eb,0)){dir 0}..{dir 90}(PtBous2+(0,eb)) if nbpas="90":--0.4[PtBous2,PtBous3]--(1/2[PtBous2,PtBous3]+(0.3cm,0))--0.6[PtBous2,PtBous3] fi--(PtBous3+(0,-eb)){dir90}..{dir180}(PtBous3+(-eb,0)) if nbpas="0":--0.4[PtBous3,PtBous4]--(1/2[PtBous3,PtBous4]+(0,0.3cm))--0.6[PtBous3,PtBous4] fi--(PtBous4+(eb,0)){dir 180}..{dir -90}(PtBous4-(0,eb)) if nbpas="-90":--0.4[PtBous4,PtBous1]--(1/2[PtBous4,PtBous1]+(-0.3cm,0))--0.6[PtBous4,PtBous1] fi + --cycle; + fill CadreBous withcolor BleuMouvTrois; + draw CadreBous; + path CercleBouss; + CercleBouss=fullcircle scaled (0.55*sqrt(2)*2.4cm); + fill CercleBouss withcolor 0.2[BleuMouvTrois,white]; + trace CercleBouss withcolor dBleuMouvTrois; + if nbpas="0": + fill ((0,0)--(subpath(0,2) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white]; + draw (point(2) of CercleBouss)--(0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + if nbpas="90": + draw (0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + if nbpas="180": + fill ((0,0)--(subpath(6,8) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white]; + draw (point(6) of CercleBouss)--(0,0)--(point(8) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + if nbpas="-90": + fill ((0,0)--(subpath(0,4) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white]; + draw (point(0) of CercleBouss)--(0,0)--(point(4) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + for k=0 upto 17: + draw 0.6[(0,0),point ((k/18)*length CercleBouss) of CercleBouss]--0.8[(0,0),point ((k/18)*length CercleBouss) of CercleBouss] withcolor white; + endfor; + picture FlecheBouss; + FlecheBouss=image( + fill fullcircle scaled 4mm withcolor white; + draw fullcircle scaled 4mm; + drawarrow (-1mm,0)--(1mm,0) withpen pencircle scaled 2 withcolor BleuMouvTrois; + ); + draw FlecheBouss shifted (point(0) of CercleBouss); + draw (FlecheBouss rotated 90) shifted (point(2) of CercleBouss); + draw (FlecheBouss rotated 180) shifted (point(4) of CercleBouss); + draw (FlecheBouss rotated -90) shifted (point(6) of CercleBouss); + ); + $ +enddef; diff --git a/macros/latex/contrib/profcollege/metapost/PfCScratchpdf.mp b/macros/latex/contrib/profcollege/metapost/PfCScratchpdf.mp index f96556d032..f3acd75d3d 100644 --- a/macros/latex/contrib/profcollege/metapost/PfCScratchpdf.mp +++ b/macros/latex/contrib/profcollege/metapost/PfCScratchpdf.mp @@ -3402,3 +3402,71 @@ vardef ListeLongueur(expr nbpas)= $ enddef; +vardef Boussole(expr nbpas)= + save $; picture $; + picture Bouss[]; + Bouss1=image( + draw Orienter("90"); + ); + Bouss2=image( + _coinprec:=(0,0); + draw Orienter("0"); + ); + Bouss3=image( + _coinprec:=(0,0); + draw Orienter("-90"); + ); + Bouss4=image( + _coinprec:=(0,0); + draw Orienter("180"); + ); + $=image( + draw Bouss1 rotatedabout(center Bouss1,-90) shifted ((2cm,0)-(center Bouss1)); + draw Bouss2 shifted ((0,2cm)-(center Bouss2)); + draw Bouss3 rotatedabout(center Bouss3,90) shifted((-2cm,0)-(center Bouss3)); + draw Bouss4 rotatedabout(center Bouss4,180) shifted((0,-2cm)-(center Bouss4)); + pair PtBous[]; + PtBous1=(-1.2cm,-1.2cm); + PtBous2-PtBous1=(2*1.2cm,0); + PtBous3-PtBous2=(0,2*1.2cm); + PtBous4-PtBous3=PtBous1-PtBous2; + path CadreBous; + CadreBous=(PtBous1+(0,eb)){dir-90}..{dir0}(PtBous1+(eb,0)) if nbpas="180":--0.4[PtBous1,PtBous2]--(1/2[PtBous1,PtBous2]+(0,-0.3cm))--0.6[PtBous1,PtBous2] fi--(PtBous2+(-eb,0)){dir 0}..{dir 90}(PtBous2+(0,eb)) if nbpas="90":--0.4[PtBous2,PtBous3]--(1/2[PtBous2,PtBous3]+(0.3cm,0))--0.6[PtBous2,PtBous3] fi--(PtBous3+(0,-eb)){dir90}..{dir180}(PtBous3+(-eb,0)) if nbpas="0":--0.4[PtBous3,PtBous4]--(1/2[PtBous3,PtBous4]+(0,0.3cm))--0.6[PtBous3,PtBous4] fi--(PtBous4+(eb,0)){dir 180}..{dir -90}(PtBous4-(0,eb)) if nbpas="-90":--0.4[PtBous4,PtBous1]--(1/2[PtBous4,PtBous1]+(-0.3cm,0))--0.6[PtBous4,PtBous1] fi + --cycle; + fill CadreBous withcolor BleuMouvTrois; + draw CadreBous; + path CercleBouss; + CercleBouss=fullcircle scaled (0.55*sqrt(2)*2.4cm); + fill CercleBouss withcolor 0.2[BleuMouvTrois,white]; + trace CercleBouss withcolor dBleuMouvTrois; + if nbpas="0": + fill ((0,0)--(subpath(0,2) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white]; + draw (point(2) of CercleBouss)--(0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + if nbpas="90": + draw (0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + if nbpas="180": + fill ((0,0)--(subpath(6,8) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white]; + draw (point(6) of CercleBouss)--(0,0)--(point(8) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + if nbpas="-90": + fill ((0,0)--(subpath(0,4) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white]; + draw (point(0) of CercleBouss)--(0,0)--(point(4) of CercleBouss) withpen pencircle scaled 1.25 withcolor white; + fi; + for k=0 upto 17: + draw 0.6[(0,0),point ((k/18)*length CercleBouss) of CercleBouss]--0.8[(0,0),point ((k/18)*length CercleBouss) of CercleBouss] withcolor white; + endfor; + picture FlecheBouss; + FlecheBouss=image( + fill fullcircle scaled 4mm withcolor white; + draw fullcircle scaled 4mm; + drawarrow (-1mm,0)--(1mm,0) withpen pencircle scaled 2 withcolor BleuMouvTrois; + ); + draw FlecheBouss shifted (point(0) of CercleBouss); + draw (FlecheBouss rotated 90) shifted (point(2) of CercleBouss); + draw (FlecheBouss rotated 180) shifted (point(4) of CercleBouss); + draw (FlecheBouss rotated -90) shifted (point(6) of CercleBouss); + ); + $ +enddef; diff --git a/macros/latex/contrib/profcollege/metapost/PfCSolid.mp b/macros/latex/contrib/profcollege/metapost/PfCSolid.mp new file mode 100644 index 0000000000..829fad5d30 --- /dev/null +++ b/macros/latex/contrib/profcollege/metapost/PfCSolid.mp @@ -0,0 +1,991 @@ +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; + +color CouleurTraits; +CouleurTraits=black; + +input marith; +input sarith; +input PfCObjets; + +color Sommet[]; + +%Anthony Phan +vardef Norm primary z = + abs (abs(Xpart z, Ypart z), Zpart z) +enddef; + +let Xpart = redpart; +let Ypart = greenpart; +let Zpart = bluepart; +% + +string typerepre,pointilles; +typerepre:="persp"; + +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"; + Lumiere:=Oeil; +enddef; + +vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2) +enddef; + +vardef sin(expr t) = sind(c*t) enddef; + +vardef cos(expr t) = cosd(c*t) enddef; + +vardef tan(expr t) = sin(t)/cos(t) enddef; + +vardef exp(expr x) = mexp(256)**x enddef; + +vardef Exp primary x = mexp(256)**x enddef; + +vardef ln(expr t) = mlog(t)/256 enddef; + +vardef log(expr t) = ln(t)/ln(10) enddef; + +vardef ch(expr x)=(exp(x)+exp (-x))/2 enddef; + +vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; + +vardef th(expr x)=sh(x)/ch(x) enddef; + +vardef arcsin(expr x)=%Définition mathématique en radian + pi*angle((sqrt(1-x**2),x))/180 +enddef; + +vardef arccos(expr x)=%Définition mathématique en radian + pi*angle((x,sqrt(1-x**2)))/180 +enddef; + +vardef arctan(expr x)=arcsin(x/(1++x)) +enddef; + +numeric satu,lum; +satu:=0.45; +lum:=1; + +%Coordonnées dans le repère Oeil +vardef GCoord(expr N)= + (-Xpart(N)*Aux1+Ypart(N)*Aux3,-Xpart(N)*Aux5-Ypart(N)*Aux6+Zpart(N)*Aux4,-Xpart(N)*Aux7-Ypart(N)*Aux8-Zpart(N)*Aux2+Rho) +enddef; + +unit:=1;%pour les mises à l'échelle :) Merci pst-solides3d + +vardef Projette(expr M)= + %if typerepre="proj": + % unit*(DE*(Xpart(GCoord(M)/Zpart(GCoord(M))),(Ypart(GCoord(M))/Zpart(GCoord(M))))) + %elseif typerepre="persp": + unit*(DE*(Xpart(GCoord(M)),Ypart(GCoord(M)))) + %fi +enddef; + +vardef TraceAxes= + color Origine,Unitex,Unitey,Unitez; + Origine=(0,0,0); + Unitex=(5,0,0); + Unitey=(0,5,0); + Unitez=(0,0,5); + drawoptions(dashed dashpattern(on 12bp off 6bp on 3bp off 6bp)); + drawarrow Projette(Origine)--Projette(Unitex) withcolor blue; + drawarrow Projette(Origine)--Projette(Unitey) withcolor vert; + drawarrow Projette(Origine)--Projette(Unitez); + drawoptions(); +enddef; + +vardef TraceAxesD(expr xd,yd,zd)= + drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp));; + drawarrow Projette((0,0,0))--Projette((xd,0,0)); + drawarrow Projette((0,0,0))--Projette((0,yd,0)); + drawarrow Projette((0,0,0))--Projette((0,0,zd)); + drawoptions(); + label(btex $x$ etex,Projette((xd+0.3,0,0))); + label(btex $y$ etex,Projette((0,yd+0.3,0))); + label(btex $z$ etex,Projette((0,0,zd+0.3))); +enddef; + +vardef TraceAxesDD(expr xd,yd,zd,xf,yf,zf)= + drawoptions(dashed evenly); + draw Projette((0,0,0))--Projette((xd,0,0)); + draw Projette((0,0,0))--Projette((0,yd,0)); + draw Projette((0,0,0))--Projette((0,0,zd)); + drawoptions(); + drawarrow Projette((xd,0,0))--Projette((xf,0,0)); + drawarrow Projette((0,yd,0))--Projette((0,yf,0)); + drawarrow Projette((0,0,zd))--Projette((0,0,zf)); + label(btex $x$ etex,Projette((xf+0.3,0,0))); + label(btex $y$ etex,Projette((0,yf+0.3,0))); + 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, + Xpart u * Ypart v - Ypart u * Xpart v) +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)= + %Mexp(Mlog redpart(wec) Mmul Mlog redpart(mor))+Mexp(Mlog greenpart(wec) Mmul Mlog greenpart(mor))+Mexp(Mlog bluepart(wec) Mmul Mlog bluepart(mor)) + Xpart(wec)*Xpart(mor)+Ypart(wec)*Ypart(mor)+Zpart(wec)*Zpart(mor) +enddef; +%pour les rotations et translations + +vardef RotX(expr ptx)= + (Xpart(ptx),Ypart(ptx)*cosd(angx)-Zpart(ptx)*sind(angx),Ypart(ptx)*sind(angx)+Zpart(ptx)*cosd(angx)) +enddef; + +vardef RotY(expr ptx)= + (Xpart(ptx)*cosd(angy)+Zpart(ptx)*sind(angy),Ypart(ptx),-Xpart(ptx)*sind(angy)+Zpart(ptx)*cosd(angy)) +enddef; + +vardef RotZ(expr ptx)= + (Xpart(ptx)*cosd(angz)-Ypart(ptx)*sind(angz),Xpart(ptx)*sind(angz)+Ypart(ptx)*cosd(angz),Zpart(ptx)) +enddef; + +vardef RotXYZ(expr ptx)= + RotZ(RotY(RotX(ptx))) +enddef; + +angx:=0; +angy:=0; +angz:=0; +color TR; +TR:=(0,0,0); +%pour les tubes +vardef VT(expr t)=Fp(t)/Norm(Fp(t)) +enddef; + +vardef VN(expr t)=Fd(t)/Norm(Fd(t)) +enddef; + +vardef VBN(expr t)=VT(t) Vectprod VN(t) +enddef; + +path feuillet; +numeric _tfig,_nfig; +pair coinbg,coinbd,coinhd,coinhg; +_nfig:=0; + +def feuille(expr xa,ya,xb,yb) = + feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle; + coinbg := (xa,ya); + coinbd := (xb,ya); + coinhd := (xb,yb); + coinhg := (xa,yb); + %modifié le 29.09.04 + z.so=(xpart(coinbg/1cm),ypart(coinbg/1cm)); + z.ne=(xpart(coinhd/1cm),ypart(coinhd/1cm)); + %fin modification + extra_endfig := "clip currentpicture to feuillet;" & extra_endfig; +enddef; + +def figureespace(expr xa,ya,xb,yb) = + _nfig:=_nfig+1; + beginfig(_nfig); + feuille(xa,ya,xb,yb); + _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi; + _tfig:=2*_tfig; +enddef; + +def finespace= +endfig; +enddef; + +def QS(expr ndeb,nfin)= + begingroup + save v,m,x; + if ndeb<nfin: + v:=ALT[cpt[ndeb]]; + m:=ndeb; + for i=(ndeb+1) upto nfin: + if ALT[cpt[i]]<v: + m:=m+1; + x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x; + fi + endfor; + x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x; + QS(ndeb,m-1); + QS(m+1,nfin); + fi + endgroup +enddef; + +boolean Pointilles; +Pointilles:=false; + +boolean Vue[]; +color Fc[].iso; +boolean Creux; +Creux:=false; + +vardef DessineObjetNew= + numeric ALT[]; + %on détermine les zmax dans le repère spatial de l'écran + for k=1 upto apj: + Fc[k].iso:=(0,0,0) for l=1 upto ns[k][0]: + +Fc[k][l] + endfor; + Fc[k].iso:=Fc[k].iso/ns[k][0]; + endfor; + for k=1 upto apj: + %ALT[k]=-Zpart(GCoord(Fc[k].iso)); + zmax:=infinity; + for l=1 upto ns[k][0]: + t:=-Zpart(GCoord(Fc[k][l])); + if t<zmax: + zmax:=t; + fi; + endfor; + ALT[k]=zmax; + cpt[k]:=k; + endfor; + %On trie suivant les zmax + QS(1,apj); + %On dessine + if Pointilles: + for k=1 upto apj: + draw for l=1 upto ns[cpt[k]][0]: + Projette(Fc[cpt[k]][l])-- + endfor + cycle if Vue[cpt[k]]=false: dashed evenly fi; + endfor; + else: + for k=1 upto apj: + if Creux=false: + if Vue[cpt[k]]: + fill for l=1 upto ns[cpt[k]][0]: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor + if arcenciel: + lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum)) + else: + lumin(cpt[k])*outcolor + fi; + if traits: + draw for l=1 upto ns[cpt[k]][0]: + Projette(Fc[cpt[k]][l])-- + endfor + cycle; + fi; + fi; + else: + fill for l=1 upto ns[cpt[k]][0]: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor + if Vue[cpt[k]]: + if arcenciel: + lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum)) + else: + lumin(cpt[k])*outcolor + fi + else: + lumin(cpt[k])*incolor + fi; + if traits: + draw for l=1 upto ns[cpt[k]][0]: + Projette(Fc[cpt[k]][l])-- + endfor + cycle; + fi; + fi; + endfor; + fi; +enddef; + +color Fc[][];%représente les sommets des différentes faces; + +invnormale:=1;%Parfois dans la lecture des fichiers OFF, il est nécessaire d'opposer la normale pour obtenir un bon intérieur-extérieur +boolean OFF,OBJ;%pour utiliser la lumière "correctement" +OFF:=false; +OBJ:=false; + +vardef LectureOFF(expr nomsolide)= + OFF:=true; + %Détermination du nombre de sommets et de faces. + string s_; + s_=readfrom nomsolide; + string ss[]; + if s_<>EOF: + ss1 := loptok s_; + t_ := if ss1="%": 0 else: 1 fi; + forever: + ss[incr t_] := loptok s_; + exitif ss[t_]=""; + endfor + else: false + fi; + NbS:=round(Mexp Mlog_str ss1); + NF:=round(Mexp Mlog_str ss2); + message("Il y a "&decimal(NbS)&" sommets."); + message("Il y a "&decimal(NF)&" faces au total."); + %Détermination des coordonnées des sommets + message("Création des sommets."); + s_:=readfrom nomsolide; + if debut=0: + for k=0 upto NbS-1: + s_:=readfrom nomsolide; + if s_<>EOF: + ss1 := loptok s_; + n_ := if ss1="%": 0 else: 1 fi; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor + else: false + fi; + Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle))); + %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle; + %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle); + endfor; + else: + for k=1 upto NbS: + s_:=readfrom nomsolide; + if s_<>EOF: + ss1 := loptok s_; + n_ := if ss1="%": 0 else: 1 fi; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor + else: false + fi; + Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle))); + %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle; + %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle); + endfor; + fi; + message("Création des faces."); + %Détermination des faces + apj:=0;color cc,dd; + nbfvues:=0; + for nf=-4000 upto (-4000+NF)-1: + s_:=readfrom nomsolide; + if s_<>EOF: + ss1 := loptok s_; + n_ := if ss1="%": 0 else: 1 fi; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor + else: false + fi; + apj:=apj+1; + ns[apj][0]:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face + for nl=1 upto ns[apj][0]: + Fc[apj][nl]:=Sommet[round(Mexp Mlog_str ss[nl+1])]; + endfor; + dd:=Oeil-Fc[apj][1]; + cc:=invnormale*Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]); + if (ProduitScalaire(dd,cc)>=0): + Vue[apj]:=true; + nbfvues:=nbfvues+1; + else: + if Creux=true: + Vue[apj]:=false; + else: + apj:=apj-1; + fi; + fi; + endfor; + message("Faces vues déterminees : il y en a "&decimal(nbfvues)&"."); + closefrom nomsolide; + DessineObjetNew; +enddef; + +vardef LectureOBJ(expr nomfichier)= + OBJ:=true; + string s_; + string ss[]; + nbss:=1; + apj:=0; + forever: + s_:=readfrom nomfichier; + if s_<>EOF: + ss0 := loptok s_; + if ss0="v": + n_:=0; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor + Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle))); + nbss:=incr nbss; + elseif ss0="f": + n_:=0; + forever: + ss[incr n_] := loptok s_; + exitif ss[n_]=""; + endfor; + ns[apj][0]:=n_-1; + for k=1 upto ns[apj][0]: + if invnormale=1: + Fc[apj][ns[apj][0]-k+1] := Sommet[round(Mexp(Mlog_str ss[k]))] + %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]: + % show OTFc.@[apj][OTFc.@[apj].nb-k+1]; + %fi; + else: + Fc[apj][k] := Sommet[round(Mexp(Mlog_str ss[k]))] + %if unknown OTFc.@[apj][k]: + % show OTFc.@[apj][k]; + %fi; + fi; + endfor; + if ProduitScalaire(Oeil-Fc[apj][1],Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]))>=0: + Vue[apj]:=true; + apj:=apj+1; + else: + if Creux=true: + Vue[apj]:=false; + apj:=apj+1; + fi; + fi; + fi; + fi; + exitif s_=EOF; + endfor; + apj:=apj-1; + closefrom nomfichier; + DessineObjetNew +enddef; + +nb:=8; + +%tube +vardef Tube(expr Fn,dp,ds,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas + save _tube; + picture _tube; + scantokens("vardef F(expr t)="&Fn&" enddef;"); + scantokens("vardef Fp(expr t)="&dp&" enddef;"); + scantokens("vardef Fd(expr t)="&ds&" enddef;"); + color G[][]; +%nb point sur le cercle + NB:=nbp;%nb de pas + for l=0 upto NB: + for k=0 upto nb: + G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*(360/nb))*VN(tmin+l*pas)+sind(k*(360/nb))*VBN(tmin+l*pas)); + endfor; + endfor; + apj:=0; + for l=0 upto (NB-1): + for k=0 upto nb-1: + apj:=apj+1; + cpt[apj]:=apj; + Fc[apj][1]:=G[l][k]; + Fc[apj][2]:=G[l][k+1]; + Fc[apj][3]:=G[l+1][k+1]; + Fc[apj][4]:=G[l+1][k]; + Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4; + ALT[apj]:=-Zpart(GCoord(Fc[apj][1])); + endfor; + endfor; + QS(1,apj); + _tube=image( + for k=1 upto apj: + fill for l=1 upto 4: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum)) + else: lumin(cpt[k])*outcolor fi; + draw for l=1 upto 4: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + endfor; + ); + _tube +enddef; + +%Tube new :) +%pour les tubes new :) +vardef T(expr t)=Fp(t) +enddef; + +vardef VTn(expr t)=if Norm(T(t))=0: + T(t) + else: + T(t)/Norm(T(t)) + fi +enddef; + +vardef VNn(expr t)= + save _VNBis,__VN; + color _VNBis,__VN; + __VN=T(t) Vectprod ((T(t+nn)-T(t-nn))/2); + if __VN=(0,0,0): + _VNBis=(0,0,1); + else: + __VN:=__VN/Norm(__VN); + if ProduitScalaire(VNbisprec[t-nn],__VN)>0: + _VNBis=__VN/Norm(__VN) + else: + _VNBis=-(__VN/Norm(__VN)) + fi; + fi; + VNbisprec[t]=_VNBis; + _VNBis +enddef; + +vardef VBNn(expr t)=VTn(t) Vectprod VNn(t) +enddef; + +vardef Tuben(expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,paramètre départ,nb points, pas + save _tuben; + picture _tuben; + scantokens("vardef F(expr t)="&Fn&" enddef;"); + scantokens("vardef Fp(expr t)="&dp&" enddef;"); + color G[][]; +%nb point sur le cercle + NB:=nbp;%nb de pas + nn:=pas; + %pour gérer le "flip" aux points d'inflexion + color VNbisprec[]; + VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2); + % + ang:=360/nb; + for l=0 upto NB: + for k=0 upto nb: + G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas)); + endfor; + endfor; + apj:=0; + for l=0 upto (NB-1): + for k=0 upto nb-1: + apj:=apj+1; + cpt[apj]:=apj; + Fc[apj][1]:=G[l][k]; + Fc[apj][2]:=G[l][k+1]; + Fc[apj][3]:=G[l+1][k+1]; + Fc[apj][4]:=G[l+1][k]; + Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4; + ALT[apj]:=-Zpart(GCoord(Fc[apj].iso)); + endfor; + endfor; + QS(1,apj); + _tuben=image( + for k=1 upto apj: + fill for l=1 upto 4: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum)) + else: lumin(cpt[k])*outcolor fi; + draw for l=1 upto 4: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withpen pencircle scaled0.25bp; + endfor; + ); + _tuben +enddef; + + +vardef Fonction(expr fn,tmin,tmax,pas)=%fonction + scantokens("vardef F(expr t)="&fn&" enddef;"); + save _f; + path _f; + _f=Projette(F(tmin)) + for k=tmin+pas step pas until tmax: + --Projette(F(k)) + endfor; + _f +enddef; + +color outcolor,incolor,outcolorbis; + +boolean Spar; +Spar:=false; + +vardef Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)=%fonction + Spar:=true; + save _Sparam; + scantokens("vardef Famille(expr u,v)="&fn&" enddef;"); + apj:=0; + picture _Sparam; + %On crée les facettes et on calcule la profondeur en Z. + for k=umin step upas until umax: + for l=vmin step vpas until vmax: + apj:=apj+1; + cpt[apj]:=apj; + Fc[apj][1]:=Image(Famille(k+upas,l)); + Fc[apj][2]:=Image(Famille(k,l)); + Fc[apj][3]:=Image(Famille(k,l+vpas)); + Fc[apj][4]:=Image(Famille(k+upas,l+vpas)); + Fc[apj].iso:=(Fc[apj][1]+Fc[apj][3])/2;%(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,invnormale*Normal(Fc[apj].iso,Fc[apj][1],Fc[apj][2]))>=0: + Vue[apj]:=true + else: + Vue[apj]:=false + fi; + endfor; + endfor; + %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. + _Sparam=image( + for k=1 upto apj: + 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; + if traits=true: + draw for l=1 upto 4: + Projette(Fc[cpt[k]][l])-- + endfor + cycle withcolor CouleurTraits; + 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; + _Sparam +enddef; + +vardef Revolution(expr fn,umin,umax,upas,vmin,vmax,vpas)= + Sparam("(xpart(point(u) of "&fn&")*cos(v),xpart(point(u) of "&fn&")*sin(v),ypart(point(u) of "&fn&"))",umin,umax,upas,vmin,vmax,vpas) +enddef; + +boolean traits;%sur une idée d'Herbert Voss à propos de pst-solides :) +%sert à désactiver le tracer des traits +%15/07/08:pour l'instant implanter uniquement pour les surfaces en z +traits=true; + +boolean arcenciel;%pour essayer d'obtenir des dégradés tels que pst-solides :) +arcenciel=false; + +boolean surfz; +surfz:=false; +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; + color alt[]; + 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; + 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; + 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; + 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. + _SurfZ=image( + pickup pencircle scaled 0.25bp; + for k=1 upto apj: + fill for l=1 upto 4: + Projette(Fc[cpt[k]][l])-- + endfor + 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])-- + endfor + cycle; + fi; + endfor; + ); + surfz:=false; + _SurfZ +enddef; + +%Objet prédéfinis +vardef ObjetCube(expr ar)= + NbS:=8; + Sommet1:=(ar,0,0); + Sommet2:=(ar,ar,0); + Sommet3:=(0,ar,0); + Sommet4:=(0,0,0); + Sommet5:=(0,0,ar); + Sommet6:=(ar,0,ar); + Sommet7:=(ar,ar,ar); + Sommet8:=(0,ar,ar); +%%Faces + NF:=6; + ns[1][0]:=4;Fc[1][1]:=Sommet1;Fc[1][2]:=Sommet2;Fc[1][3]:=Sommet3;Fc[1][4]:=Sommet4; + ns[2][0]:=4;Fc[2][1]:=Sommet4;Fc[2][2]:=Sommet3;Fc[2][3]:=Sommet8;Fc[2][4]:=Sommet5; + ns[3][0]:=4;Fc[3][1]:=Sommet1;Fc[3][2]:=Sommet4;Fc[3][3]:=Sommet5;Fc[3][4]:=Sommet6; + ns[4][0]:=4;Fc[4][1]:=Sommet5;Fc[4][2]:=Sommet8;Fc[4][3]:=Sommet7;Fc[4][4]:=Sommet6; + ns[5][0]:=4;Fc[5][1]:=Sommet2;Fc[5][2]:=Sommet7;Fc[5][3]:=Sommet8;Fc[5][4]:=Sommet3; + ns[6][0]:=4;Fc[6][1]:=Sommet1;Fc[6][2]:=Sommet6;Fc[6][3]:=Sommet7;Fc[6][4]:=Sommet2; + % + %Détermination des faces + apj:=0;color cc,dd; + for nf=1 upto NF: + apj:=apj+1; + dd:=Oeil-Fc[nf][1]; + cc:=invnormale*Normal(Fc[nf][1],Fc[nf][2],Fc[nf][3]); + if (ProduitScalaire(dd,cc)>=0): + Vue[apj]=true + else: + Vue[apj]=false; + fi; + endfor; +enddef; + +%coloriage et lumière +vardef Hsvtorgb(expr CC)=%CC couleur donnée en hsv d'après http://en.wikipedia.org/wiki/HSL_color_space + save $; + color $; + SSw:=floor(Xpart(CC)/60); + SSh:=SSw mod 6; + SSf:=(Xpart(CC)/60)-floor(SSw); + SSs:=Ypart((CC)); + SSv:=Zpart((CC)); + SSp:=SSv*(1-SSs); + SSq:=SSv*(1-SSf*SSs); + SSt:=SSv*(1-(1-SSf)*SSs); + if SSh=0: $=(SSv,SSt,SSp) elseif SSh=1:$=(SSq,SSv,SSp) elseif SSh=2:$=(SSp,SSv,SSt) elseif SSh=3:$=(SSp,SSq,SSv) elseif SSh=4:$=(SSt,SSp,SSv) elseif SSh=5:$=(SSv,SSp,SSq) fi; + $ +enddef; + +marron=Hsvtorgb((60,1,0.3)); + +intensite:=2; +boolean eclairage; +eclairage:=true; + +color Lumiere; + +invnormalelum:=1; + +vardef lumin(expr nbt)= + save $; + numeric $; + if eclairage=false: + $=1; + else: + color uu,vv; + uu=Lumiere-Fc[nbt].iso; + uu:=uu/Norm(uu); + vv=invnormalelum*Normal(Fc[nbt].iso,Fc[nbt][1],Fc[nbt][2]); + if Norm(vv)<>0: + vv:=vv/Norm(vv) + fi; + if (surfz) or (Spar) or (OFF) or (OBJ): + $=intensite*abs(ProduitScalaire(vv,uu)) + else: + $=intensite*(ProduitScalaire(vv,uu)); + fi; + if $>1: + $:=1; + fi; + fi; + $ +enddef; + + +%%sucre + +%%Transparence fait par Anthony Phan +picture alphapict_; alphapict_=nullpicture; +color fillcolor; fillcolor=gris; +fgalpha := 0.5; % usual alpha parameter +bgalpha:= 1; % alpha parameter with respect to the background + +vardef transparence expr c = + alphapict_ := nullpicture; + alphafill_(currentpicture, c); + addto currentpicture also alphapict_; +enddef; + +def alphafill_(expr p, c) = + begingroup + save p_, xmax_, xmin_, ymax_, ymin_; picture p_; + p_ = nullpicture; + (xmin_, ymin_) = llcorner c; (xmax_, ymax_) = urcorner c; + addto p_ contour c withcolor bgalpha[background, fillcolor]; + for p__ within p: + numeric xmin__, xmax__, ymin__, ymax__; + (xmin__, ymin__) = llcorner p__; (xmax__, ymax__) = urcorner p__; + if (xmax__<= xmin_) or (xmin__ >= xmax_): + else: + if (ymax__<= ymin_) or (ymin__ >= ymax_): + else: + if (not clipped p__) and (not bounded p__): + addto p_ also p__ withcolor + fgalpha[(redpart p__, greenpart p__, bluepart p__), + fillcolor]; + else: + begingroup save alphapict_; + picture alphapict_; alphapict_ = nullpicture; + alphafill_(p__, pathpart p__); + addto p_ also alphapict_; + endgroup; + fi + fi + fi + endfor + clip p_ to c; + addto alphapict_ also p_; + endgroup; +enddef; + +endinput; diff --git a/macros/latex/contrib/profcollege/metapost/PfCTurtleTestRemplis.mp b/macros/latex/contrib/profcollege/metapost/PfCTurtleTestRemplis.mp new file mode 100644 index 0000000000..90d9e7944a --- /dev/null +++ b/macros/latex/contrib/profcollege/metapost/PfCTurtleTestRemplis.mp @@ -0,0 +1,98 @@ +boolean Poser,Etapes,STOP; +Poser=true; +STOP=false; + +color CouleurRemplis; + +vardef Stop= + if Etapes: + if k>Total-1: + STOP:=true; + fi; + fi; +enddef; + +vardef Av(expr pas)= + Stop; + if STOP=false: + A[k+1]-A[k]=ut*pas*VecteurDpt; + B[tt+1]:=A[k+1]; + RetiensAngle[k+1]:=RetiensAngle[k]; + if Poser: + draw A[k]--A[k+1] withpen pencircle scaled Epaisseur; + %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue; + fi; + fi; + k:=k+1; + tt:=tt+1; +enddef; + +vardef Re(expr pas)= + Stop; + if STOP=false: + A[k+1]-A[k]=-ut*pas*VecteurDpt; + B[tt+1]:=A[k+1]; + RetiensAngle[k+1]:=RetiensAngle[k]; + if Poser: + draw A[k]--A[k+1] withpen pencircle scaled Epaisseur; + %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue; + fi; + fi; + k:=k+1; + tt:=tt+1; +enddef; + +vardef Tg(expr pas)= + Stop; + if STOP=false: + VecteurDpt:=rotation(VecteurDpt,(0,0),pas); + A[k+1]:=A[k]; + B[tt+1]:=A[k+1]; + %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue; + RetiensAngle[k+1]:=RetiensAngle[k]+pas; + Angle:=Angle+pas; + fi; + k:=k+1; + tt:=tt+1; +enddef; + +vardef Td(expr pas)= + Stop; + if STOP=false: + VecteurDpt:=rotation(VecteurDpt,(0,0),-pas); + A[k+1]:=A[k]; + B[tt+1]:=A[k+1]; + %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue; + RetiensAngle[k+1]:=RetiensAngle[k]-pas; + Angle:=Angle-pas; + fi; + k:=k+1; + tt:=tt+1; +enddef; + +vardef Bc= + Stop; + if STOP=false: + Poser:=true; + fi; +enddef; + +vardef Lc= + Stop; + if STOP=false: + Poser:=false; + fi; +enddef; + +vardef Teleporter(expr xpas,ypas)= + Stop; + if STOP=false: + A[k+1]:=A[k]+ut*(xpas,ypas); + B[tt+1]:=A[k+1]; + fi; + k:=k+1; + tt:=tt+1; +enddef; + +k=0; +tt=0; |