diff options
author | Karl Berry <karl@freefriends.org> | 2022-11-27 20:51:41 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-11-27 20:51:41 +0000 |
commit | 5f691328dabfaa4a6c21d498e4b4931c230c3692 (patch) | |
tree | 259f22ad89c81024efe745181d3a45e0d6f06cd4 /Master/texmf-dist/tex | |
parent | 8c51a87140f38a4acf9bbafd5c88cc95a7b0f37f (diff) |
profcollege (27nov22)
git-svn-id: svn://tug.org/texlive/trunk@65122 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty | 1411 |
1 files changed, 1202 insertions, 209 deletions
diff --git a/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty b/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty index e6cc0a8a68f..5238a5e97ee 100644 --- a/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty +++ b/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty @@ -4,7 +4,7 @@ \NeedsTeXFormat{LaTeX2e}% \def\filedate{2022/12/01}% \let\PfCfiledate\filedate% -\def\fileversion{0.99-z-b}% +\def\fileversion{0.99-z-c}% \let\PfCfileversion\fileversion% \ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college] @@ -51,6 +51,7 @@ \RequirePackage{iftex} \ifluatex +\RequirePackage{luacas} \RequirePackage{luamplib} \everymplib{input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur; beginfig(1);} \everyendmplib{endfig;} @@ -347,6 +348,954 @@ } %%% +% Barres de calculs +%%% +\setKVdefault[SuiteBarre]{Litteral=false,Perso=false,Decimaux=false} + +\NewDocumentCommand\BarresCalculs{o m m}{% + \useKVdefault[SuiteBarre]% + \setKV[SuiteBarre]{#1}% + \xdef\PfCListeCalculsBarre{}% + \xdef\PfCListeResultatsBarre{}% + \ignoreemptyitems% + \ifboolKV[SuiteBarre]{Perso}{% + \setsepchar[*]{,*§}% + \readlist*\PfCListeBarresCalculs{#2}% + \foreachitem\compteur\in\PfCListeBarresCalculs{% + \StrChar{#3}{\compteurcnt}[\PfCLettreB]% + \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% + \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \PfCLettreC,}% + }% + \setsepchar{,}% + \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% + \begin{NiceTabular}{ccc}[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% + \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{\ifboolKV[SuiteBarre]{Decimaux}{% + \num{\fpeval{\PfCListeBarresCalculs[\fpeval{##1-1},1]}}% + }{% + \begin{CAS} + c = \PfCListeBarresCalculs[\fpeval{##1-1},1] + \end{CAS}$\print{c:autosimplify()}$}% + }}&\Block{2-1}{\PfCListeResultats[##1]}&\Block{2-1}{$\PfCListeBarresCalculs[##1,2]$}\\ + &&\\ + }% + \end{NiceTabular} + }{% + \setsepchar{,}%\ignoreemptyitems% + \readlist*\PfCListeBarresCalculs{#2}% + \ifboolKV[SuiteBarre]{Litteral}{% + \foreachitem\compteur\in\PfCListeBarresCalculs{% + \StrChar{#3}{\compteurcnt}[\PfCLettreB]% + \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% + \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \PfCLettreC,}% + }% + \setsepchar[*]{,*/}% + \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% + \setsepchar{,}% + \readlist*\PfCListeCalculs{#2}% + \begin{NiceTabular}{ccc}[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% + \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{$\print{c:expand():topolynomial()}$}}&\Block{2-1}{\PfCListeResultats[##1,1]}&\Block{2-1}{\begin{CAS} + vars('x') + c = \PfCListeCalculs[##1] + \end{CAS}$\print{c}$}\\ + &&\\ + }% + \end{NiceTabular} + }{% + \foreachitem\compteur\in\PfCListeBarresCalculs{% + \StrChar{#3}{\compteurcnt}[\PfCLettreB]% + \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% + \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \num{\fpeval{\compteur}}/\PfCLettreC,}% + \StrSubstitute[0]{\compteur}{*}{\times}[\PfCListeResultatEtapeA]% + \StrSubstitute[0]{\PfCListeResultatEtapeA}{/}{\div}[\PfCListeResultatEtapeB]% + \StrSubstitute[0]{\PfCListeResultatEtapeB}{(}{\left(}[\PfCListeResultatEtapeC]% + \StrSubstitute[0]{\PfCListeResultatEtapeC}{)}{\right)}[\PfCListeResultatEtapeD]% + \xdef\PfCListeCalculsBarre{\PfCListeCalculsBarre $\PfCListeResultatEtapeD$,}% + }% + \setsepchar[*]{,*/}% + \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% + \setsepchar{,}% + \readlist*\PfCListeCalculs{\PfCListeCalculsBarre}% + \begin{NiceTabular}{ccc}[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% + \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{\PfCListeResultats[\fpeval{##1-1},1]}}&\Block{2-1}{\PfCListeResultats[##1,2]}&\Block{2-1}{\PfCListeCalculs[##1]}\\ + &&\\ + }% + \end{NiceTabular} + }% + }% + \reademptyitems% +}% + +%%% +% Solide et sections +%%% +\setKVdefault[ClesSolides]{Nom=cube,Aretes,Sommets,Pointilles,Largeur=1.5,Hauteur=1,Profondeur=0.75,ListeSommets={A,B,C,D,E,F,G,H},Rho=1500,Phi=30,Theta=20,Distance=50,Code=false,Couleur=white,Anglex=0,RayonCone=1,HauteurCone=2,HauteurPyramide=2,SommetsPyramide=5,Reguliere=false,DecalageSommet={(0,0,0)},RayonCylindre=1,HauteurCylindre=2,RayonSphere=1,AutoLabel=true,Sections=false,CoefSection=0.3,Axes=false,PointsSection={M,N,O,P},RemplisSection=false,ObjetSection={0.5,E,H,0.25,F,G,G,B}}% +\defKV[ClesSolides]{Traces=\setKV[ClesSolides]{Code}}% +\defKV[ClesSolides]{Section=\setKV[ClesSolides]{Sections}}% +\defKV[ClesSolides]{CouleurSection=\setKV[ClesSolides]{RemplisSection}}% + +\newcommand\MPSolideCylindre[3]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCSolid; + + boolean NommeSommets,Code,Sections,Axes,RemplisSection; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Sections:=\useKV[ClesSolides]{Sections}; + Axes:=\useKV[ClesSolides]{Axes}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + rayoncylindre=\useKV[ClesSolides]{RayonCylindre}; + hauteurcylindre=\useKV[ClesSolides]{HauteurCylindre}; + + string Section; + if Sections:Section=\useKV[ClesSolides]{Section};fi; + + color PfCOutColor; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + + vardef BaseCylindre(text t)= + save Cer; + picture Cer; + save n; + n:=0; + for p_=t: + if color p_: + n:=n+1; + _T[n]:=p_; + fi; + endfor; + pascercle:=5; + color ptcer[]; + for k=0 step pascercle until (360+pascercle) : + ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); + endfor; + % + color ddcer,cccer; + nbpointilles:=0; + nbtraces:=0; + path PathSection[]; + nbpathsection:=0; + Cer=image(% + for k=0 step pascercle until 360: + ddcer:=Oeil-ptcer[k div pascercle]; + cccer:=-Normal(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); + if (ProduitScalaire(ddcer,cccer)>=0): + nbtraces:=nbtraces+1; + if (nbtraces=1) and (nbpointilles>0): + draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); + fi; + nbpathsection:=nbpathsection+1; + PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2); + else: + nbpointilles:=nbpointilles+1; + nbtraces:=0; + if (nbpointilles=1): + draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); + fi; + if k mod (2*pascercle)=0: + nbpathsection:=nbpathsection+1; + PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2); + fi; + fi; + endfor; + ); + Cer + enddef; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); +% Initialisation(1500,30,20,50); + typetrace:="3D"; + typerepre:="persp"; + eclairage:=false; + nb:=36;%36 + subh:=1;% + incolor:=white; + outcolor:=PfCOutColor; + Ferme1:=true; + angx:=anglerotationx; + Objetcylindre1("r="&decimal(rayoncylindre),"h="&decimal(hauteurcylindre)); + eclairage:=false; +% traits:=false; +% AffichageObjet1; + + color O,S,A,M,B,C,D,Sommet[]; + Sommet2=(0,0,0); + Sommet1-Sommet2=(0,0,hauteurcylindre); + Sommet3-Sommet2=rayoncylindre*(cosd(0),-sind(0),0); + Sommet4-Sommet2=rayoncylindre*(cosd(90),-sind(90),0); + color MSection[]; + MSection[1]-Sommet2=rayoncylindre*(CoefSection,sin(arccos(CoefSection)),0); + MSection[7]-Sommet2=rayoncylindre*(CoefSection+0.01,sin(arccos(CoefSection+0.01)),0); + MSection[2]-Sommet2=rayoncylindre*(CoefSection,-sin(arccos(CoefSection)),0); + MSection[3]-MSection[2]=Sommet1-Sommet2; + MSection[4]-MSection[1]=Sommet1-Sommet2; + MSection[5]-Sommet2=CoefSection[Sommet1,Sommet2]; + MSection[6]-MSection[5]=MSection[2]-MSection[1]; + Sommet1:=RotXYZ(Sommet1); + Sommet2:=RotXYZ(Sommet2); + Sommet3:=RotXYZ(Sommet3); + Sommet4:=RotXYZ(Sommet4); + MSection[1]:=RotXYZ(MSection[1]); + MSection[2]:=RotXYZ(MSection[2]); + MSection[3]:=RotXYZ(MSection[3]); + MSection[4]:=RotXYZ(MSection[4]); + MSection[5]:=RotXYZ(MSection[5]); + MSection[6]:=RotXYZ(MSection[6]); + MSection[7]:=RotXYZ(MSection[7]); + + trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + currentpicture:=nullpicture; + + if Sections: + if Section="parallele": + if RemplisSection: + fill polygone(MSection[1],MSection[2],MSection[3],MSection[4]) withcolor CouleurSection; + fi; + color dcer,ccer; + invnormale:=if CoefSection<=0:-1 else:1 fi; + %1er côté et 3eme côté : face "basse" et face "haute" + dcer:=Oeil-Sommet3; + ccer:=-Normal(Sommet3,MSection1,MSection2); + draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi; + % 2eme côté et 4eme coté + dcer:=Oeil-MSection7; + ccer:=-Normal(MSection7,MSection4,MSection1); + draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi; + else: + if RemplisSection: + fill (PathSection[1] for p_=2 upto nbpathsection:--PathSection[p_] endfor--cycle) shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2)) withcolor CouleurSection; + fi; + for p_=1 upto nbpathsection: + draw (PathSection[p_] shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2))); + endfor; + fi; + fi; + + trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + + color dcer,ccer; + dcer:=Oeil-Sommet2; + ccer:=Normal(Sommet2,Sommet3,Sommet4); + if (ProduitScalaire(dcer,ccer)>=0): + draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + fi; + dcer:=Oeil-Sommet1; + ccer:=Normal(Sommet1,Sommet4+Sommet1-Sommet2,Sommet3+Sommet1-Sommet2); + if (ProduitScalaire(dcer,ccer)>=0): + draw Cercles(Sommet1,Sommet3+Sommet1-Sommet2,Sommet1,Sommet3+Sommet1-Sommet2,Sommet4+Sommet1-Sommet2); + fi; + + vardef EcrireSommets(text t)= + nb:=0; + for p_=t: + nb:=nb+1; + if bluepart(Sommet1)>bluepart(Sommet2): + if nb=1: + label.ulft(TEX(p_),Projette(Sommet1));%p_ + elseif nb=2: + dotlabel.rt(TEX(p_),Projette(Sommet2));%p_ + fi; + else: + if nb=1: + label.bot(TEX(p_),Projette(Sommet1)); + elseif nb=2: + dotlabel.ulft(TEX(p_),Projette(Sommet2)); + fi; + fi; + endfor; + enddef; + + DefinirSommets(#1); + DefinirSommetsSection(#3); + + if Axes: + draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1)); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2)); + fi; + + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\newcommand\MPSolidePyramide[4]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + + input PfCSolid; + + boolean Pointilles,TraceArete,NommeSommets,Code,Reguliere,AutoLabel,Sections,RemplisSection; + Sections:=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + AutoLabel:=\useKV[ClesSolides]{AutoLabel}; + Pointilles=\useKV[ClesSolides]{Pointilles}; + TraceArete=\useKV[ClesSolides]{Aretes}; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Reguliere:=\useKV[ClesSolides]{Reguliere}; + % Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + hauteurpyramide=\useKV[ClesSolides]{HauteurPyramide}; + nombresommets=\useKV[ClesSolides]{SommetsPyramide}; + color PfCOutColor,DecalageSommet; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + DecalageSommet=if Reguliere:(0,0,0) else: #3 fi; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + if Pointilles=false: + pointilles:="non"; + fi; + + Ferme1:=true; + + color O,A[],S; + O=(0,0,0); + S-O=(0,0,hauteurpyramide)+DecalageSommet; + + NbS:=nombresommets; + Sommet1:=S; + ecartangle=360/(NbS-1); + for k=2 upto NbS: + if Reguliere: + repereangle:=(k-2)*ecartangle; + else: + repereangle:=(k-2)*ecartangle+(ecartangle*0.25+uniformdeviate(floor(ecartangle/2))); + fi; + Sommet[k]:=(cosd(repereangle),-sind(repereangle),0); + endfor; + Sommet[NbS+1]:=Sommet[2]; + + color TS[]; + for k=1 upto (NbS+1): + TS[k]=Sommet[k]; + endfor; + color PiedHauteur; + PiedHauteur=ProjectionsurPlan(Sommet1,Sommet2,Sommet3,Sommet4); + eclairage:=false; + traits:=false; + outcolor:=PfCOutColor; + angx:=anglerotationx; + for k=1 upto (NbS+1): + TS[k]:=RotXYZ(TS[k]); + endfor; + angx:=0; + + color MSection[]; + for p_=2 upto NbS: + MSection[p_-1]=CoefSection[Sommet[1],Sommet[p_]]; + endfor; + + DefinirSommetsSection(#4); + + vardef SectionPyramide(expr fracsection)= + save Section; + picture Section; + Section=image(% + if RemplisSection: + remplis polygone(fracsection[Sommet1,Sommet2],for p_=3 upto NbS-1:fracsection[Sommet1,Sommet[p_]],endfor fracsection[Sommet1,Sommet[NbS]]) withcolor CouleurSection; + fi; + color dcer,ccer; + for p_=2 upto NbS: + dcer:=Oeil-Sommet[p_]; + ccer:=-Normal(Sommet1,Sommet[p_],Sommet[p_+1]); + if (ProduitScalaire(dcer,ccer)>=0): + draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]); + else: + draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]) dashed evenly; + fi; + endfor; + ); + Section + enddef; + + ObjetNew1(% + TS1, for k=2 upto NbS:TS[k], endfor TS[NbS+1] + )(% + NbS-1, for p_=2 upto NbS:p_, endfor + for p=2 upto NbS: + 3,1,p+1,p,% + endfor); + AffichageObjet1; + + Sommet[NbS+1]:=Sommet[2]; + + if Sections: + draw SectionPyramide(CoefSection); + fi; + + NF:=NbS;%nombresommets; + % Fc[100] est la base + Fc[100]:=NbS-1; + for k=2 upto NbS: + Fc[100+k-1]:=k; + endfor; + for k=2 upto NF: + Fc[k*100]:=3; + Fc[k*100+1]:=1; + Fc[k*100+2]:=k+1; + Fc[k*100+3]:=k; + endfor; + DessineObjet; + + vardef EcrireSommets(text t)= + if AutoLabel: + nb:=0; + for p_=t: + nb:=nb+1; + if nb<NbS+1: + if nb>1: + label(TEX(""&p_&""),1.1[Projette(Sommet1),Projette(Sommet[nb])]); + else: + label(TEX(p_),1.1[Projette(Sommet[2]),Projette(Sommet[1])]); + fi; + fi; + endfor; + fi; + enddef; + + DefinirSommets(#1); + + if TraceArete=false: + currentpicture:=nullpicture; + fi; + if NommeSommets: + EcrireSommets(#2); + fi; + u:=0.25u; + marque_p:="croix"; + nbcroix=0; + for p_=#1: + nbcroix:=nbcroix+1; + if nbcroix<NbS+1: + pointe(p_); + fi; + endfor; + u:=1cm; + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\newcommand\MPSolideCone[3]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean NommeSommets,Code,Sections,Axes,RemplisSection; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Axes:=\useKV[ClesSolides]{Axes}; + Sections=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + rayoncone=\useKV[ClesSolides]{RayonCone}; + hauteurcone=\useKV[ClesSolides]{HauteurCone}; + + color PfCOutColor; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + input PfCSolid; + + vardef BaseCone(text t)= + save Cer; + picture Cer; + save n; + n:=0; + for p_=t: + if color p_: + n:=n+1; + _T[n]:=p_; + fi; + endfor; + pascercle:=5; + color ptcer[]; + for k=0 step pascercle until (360+pascercle) : + ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); + endfor; + % + color ddcer,cccer; + nbpointilles:=0; + nbtraces:=0; + Cer=image(% + for k=0 step pascercle until 360: + ddcer:=Oeil-ptcer[k div pascercle]; + cccer:=-Normal(Sommet1,ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + if (ProduitScalaire(ddcer,cccer)>=0): + nbtraces:=nbtraces+1; + if (nbtraces=1) and (nbpointilles>0): + draw chemin(ptcer[k div pascercle],Sommet1); + fi; + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + else: + nbpointilles:=nbpointilles+1; + nbtraces:=0; + if (nbpointilles=1): + draw chemin(ptcer[k div pascercle],Sommet1); + fi; + if k mod (2*pascercle)=0: + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + fi; + fi; + endfor; + ); + Cer + enddef; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + eclairage:=false; + nb:=36;%36 + subh:=1;% + incolor:=white; + outcolor:=PfCOutColor; + Ferme1:=true; + angx:=anglerotationx; + Objetcone1("r="&decimal(rayoncone),"h="&decimal(hauteurcone)); + traits:=false; + AffichageObjet1; + + color Sommet[];%O,S,A,M,B,C,D, + Sommet2=(0,0,0); + Sommet1-Sommet2=(0,0,hauteurcone); + Sommet3-Sommet2=rayoncone*(cosd(0),-sind(0),0); + Sommet4-Sommet2=rayoncone*(cosd(90),-sind(90),0); + Sommet1:=RotXYZ(Sommet1); + Sommet3:=RotXYZ(Sommet3); + Sommet4:=RotXYZ(Sommet4); + + color MSection[]; + MSection[1]=CoefSection[Sommet1,Sommet2]; + + DefinirSommetsSection(#3); + + if Sections: + if RemplisSection: + remplis Cercles(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]) withcolor CouleurSection; + fi; + trace BaseCone(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]); + fi; + + trace BaseCone(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + color dcer,ccer; + dcer:=Oeil-Sommet2; + ccer:=Normal(Sommet2,Sommet3,Sommet4); + if (ProduitScalaire(dcer,ccer)>=0): + draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + fi; + + vardef EcrireSommets(text t)= + nb:=0; + for p_=t: + nb:=nb+1; + if bluepart(Sommet1)>bluepart(Sommet2): + if nb=1: + label.ulft(TEX(p_),Projette(Sommet1)); + elseif nb=2: + dotlabel.rt(TEX(p_),Projette(Sommet2)); + fi; + else: + if nb=1: + label.bot(TEX(p_),Projette(Sommet1)); + elseif nb=2: + dotlabel.ulft(TEX(p_),Projette(Sommet2)); + fi; + fi; + endfor; + enddef; + + DefinirSommets(#1); + + if Axes: + draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1)); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2)); + fi; + + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\newcommand\MPSolidePave[5]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCSolid; + + boolean Pointilles,TraceArete,NommeSommets,Code,AutoLabel,Sections,RemplisSection; + AutoLabel:=\useKV[ClesSolides]{AutoLabel}; + Pointilles=\useKV[ClesSolides]{Pointilles}; + TraceArete=\useKV[ClesSolides]{Aretes}; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Sections:=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + + string Section; + if Sections:Section=\useKV[ClesSolides]{Section};fi; + + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + if Pointilles=false: + pointilles:="non"; + fi; + color A,B,C,D,E,F,G,H; + color Sommet[]; + trace Pave(A,B,C,D,E,F,G,H)(#3); + currentpicture:=nullpicture; + Sommet1=A; + Sommet2=B; + Sommet3=C; + Sommet4=D; + Sommet5=E; + Sommet6=F; + Sommet7=G; + Sommet8=H; + + DefinirSommets(#1); + + color MSection[]; + numeric RetiensSection[]; + numretienssection:=0; + color RetiensDefSection[]; + numretiensdefsection:=0; + if Sections: + if Section="arete": + for p_=#5: + if numeric p_: + numretienssection:=numretienssection+1; + RetiensSection[numretienssection]=p_; + elseif color p_: + numretiensdefsection:=numretiensdefsection+1; + RetiensDefSection[numretiensdefsection]=p_; + fi; + endfor; + % On dessine la section + MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]]; + MSection[2]=(RetiensSection[2])[RetiensDefSection[3],RetiensDefSection[4]]; + MSection[3]-MSection[2]=RetiensDefSection[6]-RetiensDefSection[5]; + MSection[4]-MSection[1]=RetiensDefSection[6]-RetiensDefSection[5]; + if RemplisSection: + fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; + fi; +% DotLabel.top(TEX("M1"),MSection[1]); +% DotLabel.top(TEX("M2"),MSection[2]); +% DotLabel.top(TEX("M3"),MSection[3]); +% DotLabel.top(TEX("M4"),MSection[4]); +% if RemplisSection: +% fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; +% fi; +% trace polygone(MSection1,MSection2,MSection3,MSection4); + color dcer,ccer; + % 1er cote -> ok + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 2eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]); + draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 3eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + % 4eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]); + draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + else: + %face + for p_=#5: + if numeric p_: + numretienssection:=numretienssection+1; + RetiensSection[numretienssection]=p_; + elseif color p_: + numretiensdefsection:=numretiensdefsection+1; + RetiensDefSection[numretiensdefsection]=p_; + fi; + endfor; + % On dessine la section + MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]]; + MSection[2]-MSection[1]=RetiensDefSection[4]-RetiensDefSection[3]; + MSection[3]-MSection[2]=RetiensDefSection[5]-RetiensDefSection[4]; + MSection[4]-MSection[1]=MSection[3]-MSection[2]; +% DotLabel.top(TEX("M1"),MSection[1]); +% DotLabel.top(TEX("M2"),MSection[2]); +% DotLabel.top(TEX("M3"),MSection[3]); +% DotLabel.top(TEX("M4"),MSection[4]); + if RemplisSection: + fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; + fi; + color dcer,ccer; + % 1er cote -> ok + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 2eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]); + draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 3eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + % 4eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]); + draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + fi; + %On trace la section considérée + %trace polygone(MSection1,MSection2,MSection3,MSection4); + fi; + + trace Pave(A,B,C,D,E,F,G,H)(#3); + + DefinirSommetsSection(#4); + + if TraceArete=false: + currentpicture:=nullpicture; + fi; + if NommeSommets: + EcrireSommetsPave(#2); + fi; + u:=0.25u; + marque_p:="croix"; + nbcroix=0; + for p_=#1: + nbcroix:=nbcroix+1; + if nbcroix=4: + if Pointilles: + pointe(p_); + fi; + else: + pointe(p_); + fi; + endfor; + u:=1cm; + if Code: + \useKV[ClesSolides]{Traces}; + fi; + \end{mplibcode} + \fi +} + +\newcommand\MPSolideSphere[3]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean NommeSommets,Code,Sections,Axes,RemplisSection; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Axes:=\useKV[ClesSolides]{Axes}; + Sections=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=0;%\useKV[ClesSolides]{Phi}; + PfCTheta=10;%\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + rayonsphere=\useKV[ClesSolides]{RayonSphere}; + + color PfCOutColor; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + input PfCSolid; + + vardef BaseSphere= + save Cer; + picture Cer; + color PtInter.iso,PtInter[]; + vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef; + subh:=72; + Cer=image(% + if Sections: + if RemplisSection:fill (Cercles(Image((0,0,0)),Image((0,1,0)),Image((0,0,0)),Image((0,1,0)),Image((-1,0,0))) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)) withcolor CouleurSection; fi; + fi; + %Equateur + umin:=0; umax:=pi/nb; upas:=pi/nb; + vmin:=0; vpas:=2*pi/subh; vmax:=2*pi; + for l=0 upto subh-1: + PtInter[1]:=Image(Famille(umin+(0+1)*upas,vmin+l*vpas)); + PtInter[2]:=Image(Famille(umin+0*upas,vmin+l*vpas)); + PtInter[3]:=Image(Famille(umin+0*upas,vmin+(l+1)*vpas)); + PtInter[4]:=Image(Famille(umin+(0+1)*upas,vmin+(l+1)*vpas)); + PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4; + if ProduitScalaire(Oeil-PtInter.iso,Normal(PtInter.iso,PtInter[4],PtInter[1]))>=0: + if Sections: + draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)); + fi; + draw segment(PtInter[3],PtInter[2]); + else: + if l mod 2=0: + if Sections: + draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)); + fi; + draw segment(PtInter[3],PtInter[2]); + fi; + fi; + endfor; + + % "Exterieur" + nb:=72; + subh:=18; + umin:=-pi; umax:=pi; upas:=2*pi/nb; + vpas:=2*pi/subh; vmin:=pi/2; vmax:=2*pi; + for k=0 upto nb-1: + PtInter[1]:=Image(Famille(umin+(k+1)*upas,vmin+0*vpas)); + PtInter[2]:=Image(Famille(umin+k*upas,vmin+0*vpas)); + PtInter[3]:=Image(Famille(umin+k*upas,vmin+(0+1)*vpas)); + PtInter[4]:=Image(Famille(umin+(k+1)*upas,vmin+(0+1)*vpas)); + PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4; + draw segment(PtInter[2],PtInter[1]); + endfor; + ); + Cer + enddef; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + eclairage:=false; + nb:=24;%36 + subh:=36;% + incolor:=blue; + outcolor:=white;%PfCOutColor; + Ferme1:=true; + angx:=anglerotationx; + Objetsphere1("R="&decimal(rayonsphere)); + % traits:=false; + % AffichageObjet1; + color Sommet[],SommetN,SommetS,SommetB; + Sommet1=(0,0,0); + Sommet2=(0,rayonsphere,0); + Sommet3=(-rayonsphere,0,0); + Sommet4=(0,0,rayonsphere); + SommetN=Sommet4; + SommetS=(0,0,-rayonsphere); + SommetB=(rayonsphere,0,0); + Sommet2:=RotXYZ(Sommet2); + Sommet3:=RotXYZ(Sommet3); + Sommet4:=RotXYZ(Sommet4); + SommetN:=RotXYZ(SommetN); + SommetS:=RotXYZ(SommetS); + SommetB:=RotXYZ(SommetB); + color MSection[]; + MSection[1]=CoefSection[Sommet1,SommetN]; + MSection[2]=Image((0,sqrt(1-CoefSection**2),CoefSection)); + + trace BaseSphere; + + DefinirSommets(#1); + DefinirSommetsSection(#3); + + if Axes: + draw segment(1.25[SommetN,SommetS],1.25[SommetS,SommetN]) dashed dashpattern(on6 off3 on3 off3); + remplis (fullcircle scaled 1mm) shifted(Projette(SommetN)); + remplis (fullcircle scaled 1mm) shifted(Projette(SommetS)); + fi; + + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\def\UpdatetoksSolide#1\nil{\addtotok\toksolidelistesommets{"#1",}} +\newtoks\toksolidelistesommets% +\newtoks\toksolidelistepointssections% + +\newcommand\Solide[1][]{% + \useKVdefault[ClesSolides]% + \setKV[ClesSolides]{#1}% + \setsepchar{,}\ignoreemptyitems% + \xdef\foo{\useKV[ClesSolides]{ListeSommets}}% + \readlist*\ListeNomSommet{\foo}%\showitems\ListeNomSommet + \reademptyitems% + \toksolidelistesommets{} + \foreachitem\compteur\in\ListeNomSommet{\expandafter\UpdatetoksSolide\compteur\nil}%\the\toksolidelistesommets% + \IfStrEqCase{\useKV[ClesSolides]{Nom}}{% + {cube}{% + \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{1,1,1}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}% + }% + {pave}{% + \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{Profondeur},\useKV[ClesSolides]{Largeur},\useKV[ClesSolides]{Hauteur}}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}% + }% + {cone}{% + \MPSolideCone{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% + }% + {pyramide}{% + \MPSolidePyramide{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{DecalageSommet}}{\useKV[ClesSolides]{PointsSection}}% + }% + {cylindre}{% + \MPSolideCylindre{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% + }% + {sphere}{% + \MPSolideSphere{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% + }% + }% +}% + +%%% % 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} @@ -7933,68 +8882,9 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. }% %%% Dessin Gradue %%% -\setKVdefault[DessinGradue]{Lignes=10,Debut=-5,Fin=5,Pas=10,Solution=false,EcartVertical=1.5,LignesIdentiques,Longueur=10,Echelle=1,Droites=false} +\setKVdefault[DessinGradue]{Lignes=10,Debut=-5,Fin=5,Pas=10,Solution=false,EcartVertical=1.5,LignesIdentiques,Longueur=10,Echelle=1,Droites=false,DemiDroites=false} -\def\TraceDessinGradue#1#2#3#4{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair La,Lb,Lab[]; - La=(0,0); - Lb-La=u*(\useKV[DessinGradue]{Longueur},0); - for k=0 upto #4: - Lab[k]=(k/#4)[La,Lb]; - endfor; - picture EnsembleLignes,Lignes; - Lignes=image( - trace segment(La,Lb); - for k=0 upto #4: - trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1)); - endfor; - labeloffset:=labeloffset*1.5; - label.top(TEX("\num{"&decimal(#2)&"}"),La); - label.top(TEX("\num{"&decimal(#3)&"}"),Lb); - labeloffset:=labeloffset/1.5; - ); - EnsembleLignes=image( - for k=0 upto #1-1: - trace Lignes shifted(k*u*(0,-\useKV[DessinGradue]{EcartVertical})); - label(TEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,-k*\useKV[DessinGradue]{EcartVertical})); - endfor; - ); - trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}] - pair La,Lb,Lab[]; - La=(0,0); - Lb-La=u*(LongueurLigne,0); - for k=0 upto #4: - Lab[k]=(k/#4)[La,Lb]; - endfor; - picture EnsembleLignes,Lignes; - Lignes=image( - trace segment(La,Lb); - for k=0 upto #4: - trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1)); - endfor; - labeloffset:=labeloffset*1.5; - label.top(LATEX("\num{"&decimal(#2)&"}"),La); - label.top(LATEX("\num{"&decimal(#3)&"}"),Lb); - labeloffset:=labeloffset/1.5; - ); - EnsembleLignes=image( - for k=0 upto #1-1: - trace Lignes shifted(k*u*(0,-EcartVertical)); - label(LATEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,-k*EcartVertical)); - endfor; - ); - trace EnsembleLignes scaled Echelle; - \end{mpost} - \fi -} - -\def\TraceDessinGradueSolution#1#2#3#4#5#6{% +\def\TraceDessinGradue#1#2#3#4#5#6{% \ifluatex \mplibforcehmode \begin{mplibcode} @@ -8002,12 +8892,20 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; La=(0,0); Lb-La=u*(\useKV[DessinGradue]{Longueur},0); + boolean Solution; + Solution=\useKV[DessinGradue]{Solution}; for k=0 upto #4: Lab[k]=(k/#4)[La,Lb]; endfor; picture EnsembleLignes,Lignes; Lignes=image( + if \useKV[DessinGradue]{Droites}: + drawarrow 1.05[Lb,La]--1.05[La,Lb]; + elseif \useKV[DessinGradue]{DemiDroites}: + drawarrow La--1.05[La,Lb]; + else: trace segment(La,Lb); + fi; for k=0 upto #4: trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1)); endfor; @@ -8016,13 +8914,16 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. label.top(TEX("\num{"&decimal(#3)&"}"),Lb); labeloffset:=labeloffset/1.5; ); - EnsembleLignes=image(% + EnsembleLignes=image( + if Solution: drawoptions(withcolor 0.5white); + fi; for k=0 upto #1-1: trace Lignes shifted(k*u*(0,-\useKV[DessinGradue]{EcartVertical})); - label(TEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,k*(-\useKV[DessinGradue]{EcartVertical}))); + label(TEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,-k*\useKV[DessinGradue]{EcartVertical})); endfor; drawoptions(); + if Solution: n:=0; numeric nblignes,nbpas; for p_=#5: @@ -8038,11 +8939,12 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. for p_=#6: trace p_ withpen pencircle scaled 1.5; endfor; + fi; ); trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; \end{mplibcode} \else - \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}] + \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle}; boolean Solution,Droites,DemiDroites; Solution=\useKV[DessinGradue]{Solution};Droites=\useKV[DessinGradue]{Droites};DemiDroites=\useKV[DessinGradue]{DemiDroites};}] pair La,Lb,Lab[]; pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; La=(0,0); @@ -8052,7 +8954,13 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. endfor; picture EnsembleLignes,Lignes; Lignes=image( + if Droites: + drawarrow 1.05[Lb,La]--1.05[La,Lb]; + elseif DemiDroites: + drawarrow La--1.05[La,Lb]; + else: trace segment(La,Lb); + fi; for k=0 upto #4: trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1)); endfor; @@ -8062,12 +8970,15 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. labeloffset:=labeloffset/1.5; ); EnsembleLignes=image( + if Solution: drawoptions(withcolor 0.5white); + fi; for k=0 upto #1-1: trace Lignes shifted(k*u*(0,-EcartVertical)); - label(LATEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,k*(-EcartVertical))); + label(LATEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,-k*EcartVertical)); endfor; drawoptions(); + if Solution: n:=0; numeric nblignes,nbpas; for p_=#5: @@ -8083,99 +8994,54 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. for p_=#6: trace p_ withpen pencircle scaled 1.5; endfor; + fi; ); trace EnsembleLignes scaled Echelle; \end{mpost} \fi } -\def\TraceDessinGradueMul#1{% +\def\TraceDessinGradueMul#1#2#3{% \ifluatex \mplibforcehmode \begin{mplibcode} pair La,Lb,Lab[]; La=(0,0); + pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; Lb-La=u*(\useKV[DessinGradue]{Longueur},0); + EcartVertical=\useKV[DessinGradue]{EcartVertical}; + boolean Solution; + Solution=\useKV[DessinGradue]{Solution}; picture EnsembleLignes,Lignes; EnsembleLignes=image( + if Solution: + drawoptions(withcolor 0.5white); + fi; n:=0; m:=0; for p_=#1: n:=n+1; - trace segment(La,Lb) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})); - label(TEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical})); - for k=0 upto bluepart(p_): - m:=bluepart(p_); - Lab[k]:=(k/m)[La,Lb]; - trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})); - endfor; - labeloffset:=labeloffset*1.5; - label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}))); - label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}))); - labeloffset:=labeloffset/1.5; - endfor; - ); - trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}] - pair La,Lb,Lab[]; - La=(0,0); - Lb-La=u*(LongueurLigne,0); - picture EnsembleLignes,Lignes; - EnsembleLignes=image( - n:=0; - m:=0; - for p_=#1: - n:=n+1; + if \useKV[DessinGradue]{Droites}: + drawarrow (1.05[Lb,La]--1.05[La,Lb]) shifted((n-1)*u*(0,-EcartVertical)); + elseif \useKV[DessinGradue]{DemiDroites}: + drawarrow (La--1.05[La,Lb]) shifted((n-1)*u*(0,-EcartVertical)); + else: trace segment(La,Lb) shifted((n-1)*u*(0,-EcartVertical)); + fi; + label(TEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*EcartVertical)); for k=0 upto bluepart(p_): m:=bluepart(p_); + retienspas[n]:=m; Lab[k]:=(k/m)[La,Lb]; trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-EcartVertical)); - label(LATEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical})); - endfor; - labeloffset:=labeloffset*1.5; - label.top(LATEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-EcartVertical))); - label.top(LATEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-EcartVertical))); - labeloffset:=labeloffset/1.5; - endfor; - ); - trace EnsembleLignes scaled Echelle; - \end{mpost} - \fi -} - -\def\TraceDessinGradueMulSolution#1#2#3{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair La,Lb,Lab[]; - pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; - La=(0,0); - Lb-La=u*(\useKV[DessinGradue]{Longueur},0); - picture EnsembleLignes,Lignes; - EnsembleLignes=image(% - drawoptions(withcolor 0.5white); - n:=0; - m:=0; - numeric retienspas[]; - for p_=#1: - n:=n+1; - trace segment(La,Lb) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})); - label(TEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical})); - for k=0 upto bluepart(p_): - m:=bluepart(p_); - retienspas[n]:=bluepart(p_); - Lab[k]:=(k/m)[La,Lb]; - trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})); endfor; labeloffset:=labeloffset*1.5; - label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}))); - label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}))); + label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-EcartVertical))); + label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-EcartVertical))); labeloffset:=labeloffset/1.5; endfor; drawoptions(); + if Solution: n:=0; numeric nblignes,nbpas; for p_=#2: @@ -8192,37 +9058,46 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. for p_=#3: trace p_ withpen pencircle scaled 1.5; endfor; + fi; ); trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; \end{mplibcode} \else - \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}] + \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle}; boolean Solution,Droites,DemiDroites; Solution=\useKV[DessinGradue]{Solution}; Droites=\useKV[DessinGradue]{Droites}; DemiDroites=\useKV[DessinGradue]{DemiDroites};}] pair La,Lb,Lab[]; - pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; La=(0,0); + pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; Lb-La=u*(LongueurLigne,0); picture EnsembleLignes,Lignes; EnsembleLignes=image( + if Solution: + drawoptions(withcolor 0.5white); + fi; n:=0; m:=0; - numeric retienspas[]; - drawoptions(withcolor 0.5white); for p_=#1: n:=n+1; + if Droites: + drawarrow (1.05[Lb,La]--1.05[La,Lb]) shifted((n-1)*u*(0,-EcartVertical)); + elseif DemiDroites: + drawarrow (La--1.05[La,Lb]) shifted((n-1)*u*(0,-EcartVertical)); + else: trace segment(La,Lb) shifted((n-1)*u*(0,-EcartVertical)); - label(LATEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical})); + fi; + label(LATEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*EcartVertical)); for k=0 upto bluepart(p_): m:=bluepart(p_); - retienspas[n]:=bluepart(p_); + retienspas[n]:=m; Lab[k]:=(k/m)[La,Lb]; trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-EcartVertical)); endfor; labeloffset:=labeloffset*1.5; - label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-EcartVertical))); - label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-EcartVertical))); + label.top(LATEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-EcartVertical))); + label.top(LATEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-EcartVertical))); labeloffset:=labeloffset/1.5; endfor; drawoptions(); + if Solution: n:=0; numeric nblignes,nbpas; for p_=#2: @@ -8239,6 +9114,7 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. for p_=#3: trace p_ withpen pencircle scaled 1.5; endfor; + fi; ); trace EnsembleLignes scaled Echelle; \end{mpost} @@ -8253,47 +9129,36 @@ couleur indiquée, le nombre de cases donné par le résultat du calcul. \newcommand\DessinGradue[4][]{% \useKVdefault[DessinGradue]% \setKV[DessinGradue]{#1}% - \ifboolKV[DessinGradue]{Droites}{% - %en travail - \setsepchar[*]{,*/}% - \readlist\ListeDefDroites{#2}% - \newtoks\toklistedefdroites% - \foreachitem\compteur\in\ListeDefDroites{\expandafter\UpdateDefDroites\compteur\nil}% - %en travail - }{% - \ifboolKV[DessinGradue]{LignesIdentiques}{% - \ifboolKV[DessinGradue]{Solution}{% - \setsepchar[*]{,*/}% - \readlist\ListePG{#3}% - \setsepchar[*]{§*/}% - \readlist\ListeTraces{#4}% - \newtoks\toklisteptsgrad% - \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}% - \newtoks\toklistetracesgrad% - \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}% - \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}}% - }% - }{% + \ifboolKV[DessinGradue]{LignesIdentiques}{% + \newtoks\toklisteptsgrad% + \newtoks\toklistetracesgrad% + \ifboolKV[DessinGradue]{Solution}{% \setsepchar[*]{,*/}% - \readlist\ListeDefLigne{#2}% - \newtoks\toklistedefligne% - \foreachitem\compteur\in\ListeDefLigne{\expandafter\UpdateDefLignes\compteur\nil}% - \ifboolKV[DessinGradue]{Solution}{% - \setsepchar[*]{,*/}% - \readlist\ListePG{#3}% - \setsepchar[*]{§*/}% - \readlist\ListeTraces{#4}% - \newtoks\toklisteptsgrad% - \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}% - \newtoks\toklistetracesgrad% - \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}% - \TraceDessinGradueMulSolution{\the\toklistedefligne}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% - }{% - \TraceDessinGradueMul{\the\toklistedefligne}% - }% + \readlist\ListePG{#3}% + \setsepchar[*]{§*/}% + \readlist\ListeTraces{#4}% + \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}% + \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}% + }{}% + \TraceDessinGradue{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% + }{% + \setsepchar[*]{,*/}% + \readlist\ListeDefLigne{#2}% + \xdef\toklistedefligne{}% + \foreachitem\compteur\in\ListeDefLigne{% + \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2],\ListeDefLigne[\compteurcnt,3]),}% }% + \newtoks\toklisteptsgrad% + \newtoks\toklistetracesgrad% + \ifboolKV[DessinGradue]{Solution}{% + \setsepchar[*]{,*/}% + \readlist\ListePG{#3}% + \setsepchar[*]{§*/}% + \readlist\ListeTraces{#4}% + \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}% + \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}% + }{}% + \TraceDessinGradueMul{\toklistedefligne}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% }% }% @@ -19024,7 +19889,7 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis %%% % Fonction %%% -\setKVdefault[ClesFonction]{Nom=f,Variable=x,Calcul=x,Tableau=false,Largeur=5mm,Ecriture=false,Definition=false,Points=false,Tangentes=false,PasX=1,PasY=1,UniteX=1,UniteY=1,Prolonge=false,Trace=false} +\setKVdefault[ClesFonction]{Nom=f,Variable=x,Calcul=x,Tableau=false,Largeur=5mm,Ecriture=false,Definition=false,Points=false,Tangentes=false,PasX=1,PasY=1,UniteX=1,UniteY=1,Prolonge=false,Trace=false,Catmull=false,Epaisseur=1} \newtoks\toklistePtsFn%pour la discipline @@ -19109,10 +19974,10 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis draw Fn[0] for k=1 upto N: ..Fn[k] - endfor; + endfor withpen pencircle scaled \useKV[ClesFonction]{Epaisseur}; \end{mplibcode} \else - \begin{mpost} + \begin{mpost}[mpsettings={numeric Epaisseur; Epaisseur=\useKV[ClesFonction]{Epaisseur};}] x.u:=#2; y.u:=#3; X.u:=#4; @@ -19181,7 +20046,7 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis draw Fn[0] for k=1 upto N: ..Fn[k] - endfor; + endfor withpen pencircle scaled Epaisseur; \end{mpost} \fi } @@ -19267,11 +20132,11 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis for k=1 upto (N-1): ..{dir dirav[k]}Fn[k]{dir dirap[k]} endfor - ..{dir dirav[N]}Fn[N]; + ..{dir dirav[N]}Fn[N] withpen pencircle scaled \useKV[ClesFonction]{Epaisseur}; \end{mplibcode} \else - \begin{mpost} - x.u:=#2; + \begin{mpost}[mpsettings={numeric Epaisseur; Epaisseur=\useKV[ClesFonction]{Epaisseur};}] + x.u:=#2; y.u:=#3; X.u:=#4; Y.u:=#5; @@ -19310,7 +20175,7 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis MaxY:=ypart(Gn[k]); fi; endfor; - if #6=0: + if #6=0: for k=MinY-1 step y.u until MaxY+1: draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; endfor; @@ -19348,11 +20213,129 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis for k=1 upto (N-1): ..{dir dirav[k]}Fn[k]{dir dirap[k]} endfor - ..{dir dirav[N]}Fn[N]; + ..{dir dirav[N]}Fn[N] withpen pencircle scaled Epaisseur; \end{mpost} \fi } +\def\MPCatmull#1#2#3#4#5{% + % #1 la liste des points + % #2: pas en x + % #3: pas en y + % #4: unit\'e en x + % #5: unit\'e en y + \ifluatex + \mplibforcehmode + \begin{mplibcode} + x.u:=#2; + y.u:=#3; + X.u:=#4; + Y.u:=#5; + numeric dirav[],dirap[]; + pair Fn[],Gn[]; + n=0; + for p_=#1: + Gn[n]=p_; + Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + n:=n+1; + endfor; + N:=(n-1); + MinX=999; + MaxX=-999; + MinY=999; + MaxY=-999; + for k=0 upto N: + if xpart(Gn[k])<MinX: + MinX:=xpart(Gn[k]); + fi; + if xpart(Gn[k])>MaxX: + MaxX:=xpart(Gn[k]); + fi; + if ypart(Gn[k])<MinY: + MinY:=ypart(Gn[k]); + fi; + if ypart(Gn[k])>MaxY: + MaxY:=ypart(Gn[k]); + fi; + endfor; + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX-1 step x.u until MaxX+1: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + for k=0 upto N: + fill cercles(Fn[k],0.5mm); + endfor; + drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); + drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0); + % + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); + dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); + % + draw Fn[1] + for k=2 upto N-1: + ..{dir angle(Fn[k+1]-Fn[k-1])}Fn[k]{dir angle(Fn[k+1]-Fn[k-1])} + endfor withpen pencircle scaled \useKV[ClesFonction]{Epaisseur}; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric Epaisseur; Epaisseur=\useKV[ClesFonction]{Epaisseur};}] + x.u:=#2; + y.u:=#3; + X.u:=#4; + Y.u:=#5; + numeric dirav[],dirap[]; + pair Fn[],Gn[]; + n=0; + for p_=#1: + Gn[n]=p_; + Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + n:=n+1; + endfor; + N:=(n-1); + MinX=999; + MaxX=-999; + MinY=999; + MaxY=-999; + for k=0 upto N: + if xpart(Gn[k])<MinX: + MinX:=xpart(Gn[k]); + fi; + if xpart(Gn[k])>MaxX: + MaxX:=xpart(Gn[k]); + fi; + if ypart(Gn[k])<MinY: + MinY:=ypart(Gn[k]); + fi; + if ypart(Gn[k])>MaxY: + MaxY:=ypart(Gn[k]); + fi; + endfor; + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX-1 step x.u until MaxX+1: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + for k=0 upto N: + fill cercles(Fn[k],0.5mm); + endfor; + drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); + drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0); + % + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); + dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); + % + draw Fn[1] + for k=2 upto N-1: + ..{dir angle(Fn[k+1]-Fn[k-1])}Fn[k]{dir angle(Fn[k+1]-Fn[k-1])} + endfor withpen pencircle scaled Epaisseur; + \end{mpost} + \fi +}% + \newcommand\Fonction[2][]{% \useKVdefault[ClesFonction]% \setKV[ClesFonction]{#1}% @@ -19365,23 +20348,32 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis \toklistePtsFn{}% \setsepchar[*]{§*/}%\ignoreemptyitems% \readlist*\ListePoints{#2}% - \ifboolKV[ClesFonction]{Tangentes}{% + \ifboolKV[ClesFonction]{Catmull}{% + \xdef\PfCFooListePoints{(\ListePoints[1,2],\ListePoints[1,3]),} \foreachitem\compteur\in\ListePoints{% - \expandafter\UpdatePtsFn\compteur\nil% - }% - \ifboolKV[ClesFonction]{Prolonge}{% - \MPCourbe{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{1}% - }{% - \MPCourbe{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{0}% + \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),}% }% + \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\ListePointslen,2],\ListePoints[\ListePointslen,3]),}% + \MPCatmull{\PfCFooListePoints}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}% }{% - \foreachitem\compteur\in\ListePoints{% - \expandafter\UpdatePtsFN\compteur\nil% - }% - \ifboolKV[ClesFonction]{Prolonge}{% - \MPCourbePoints{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{1}% + \ifboolKV[ClesFonction]{Tangentes}{% + \foreachitem\compteur\in\ListePoints{% + \expandafter\UpdatePtsFn\compteur\nil% + }% + \ifboolKV[ClesFonction]{Prolonge}{% + \MPCourbe{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{1}% + }{% + \MPCourbe{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{0}% + }% }{% - \MPCourbePoints{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{0}% + \foreachitem\compteur\in\ListePoints{% + \expandafter\UpdatePtsFN\compteur\nil% + }% + \ifboolKV[ClesFonction]{Prolonge}{% + \MPCourbePoints{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{1}% + }{% + \MPCourbePoints{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{0}% + }% }% }% }{% @@ -19419,7 +20411,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,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} +\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,Epaisseur=1,Relie=false,RelieSegment=false,Marque=dot} \newcommand\TraceGraphique[2][]{% \useKVdefault[TraceG]% @@ -19637,7 +20629,8 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis gradx=\useKV[TraceG]{PasGradX}; grady=\useKV[TraceG]{PasGradY}; pos=\useKV[TraceG]{LabelC}; - + Epaisseur:=\useKV[TraceG]{Epaisseur}; + color colortrace; colortrace=\useKV[TraceG]{CouleurTrace}; @@ -19720,12 +20713,12 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); endfor; fi; - drawoptions(withpen pencircle scaled1.5); + drawoptions(withpen pencircle scaled(1)); 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; + draw courbe1(borneinf,bornesup,100)(#2) withpen (pencircle scaled Epaisseur) withcolor colortrace; % labelisation numeric t; t=pos*length Cb1; @@ -19743,7 +20736,7 @@ 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};Epaisseur=\useKV[TraceG]{Epaisseur}; 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};}] @@ -19821,7 +20814,7 @@ Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dis drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0)); drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine))); drawoptions(); - draw courbe1(borneinf,bornesup,100)(#2) withcolor colortrace; + draw courbe1(borneinf,bornesup,100)(#2) withpen (pencircle scaled Epaisseur) withcolor colortrace; % % labelisation numeric t; t=pos*length Cb1; @@ -22714,7 +23707,7 @@ u:=\useKV[ClesFormule]{Echelle}; if p_<>"": drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n]-ValeurOrigine,0)); + pointe(unitp*(valeur[n],0)); fi; elseif AffichageCoord=2: if p_<>"": @@ -22856,7 +23849,7 @@ u:=\useKV[ClesFormule]{Echelle}; if p_<>"": drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n]-ValeurOrigine,0)); + pointe(unitp*(valeur[n],0)); fi; elseif AffichageCoord=2: if p_<>"": @@ -25540,7 +26533,7 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V \setlength{\PfCLongInter}{-40pt+\fpeval{\useKV[Tableur]{LargeurUn}}pt+\fpeval{(\useKV[Tableur]{Colonnes}-2)*\useKV[Tableur]{Largeur}}pt+\fpeval{2*\useKV[Tableur]{Colonnes}-6}\tabcolsep+\fpeval{\useKV[Tableur]{Colonnes}+2}\arrayrulewidth}% \ifboolKV[Tableur]{Bandeau}{% \begin{NiceTabular}{p{\PfCTableurLargeur}p{10pt}p{50pt}p{\PfCLongInter}} - \Block[draw]{}{\useKV[Tableur]{Cellule}}&\Block[draw]{}{\scriptsize$\blacktriangledown$}&\Block{}{$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$}&\Block[draw]{}{\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$}\\ + \Block[draw,l]{}{\useKV[Tableur]{Cellule}}&\Block[draw]{}{\scriptsize$\blacktriangledown$}&\Block{}{$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$}&\Block[draw]{}{\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$}\\ \end{NiceTabular}% \nopagebreak% \\% |