diff options
Diffstat (limited to 'macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex')
-rw-r--r-- | macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex | 525 |
1 files changed, 525 insertions, 0 deletions
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex new file mode 100644 index 0000000000..8f827908ae --- /dev/null +++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex @@ -0,0 +1,525 @@ +% proflycee-tools-graphiques.tex +% Copyright 2023 Cédric Pierquet +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. + +%%------SPLINES +%commande utile pour extraire des infos d'une liste +\newcommand\extractcoeff[2]{%1=liste,2=numero + \setsepchar{§}% + \readlist*\lcoeffs{#1} + \ifnum \lcoeffslen=1 + \def\COEFFA{#1} + \def\COEFFB{#1} + \else + \itemtomacro\lcoeffs[#2]\COEFF + \IfSubStr{\COEFF}{/}% + {\StrCut{\COEFF}{/}{\COEFFA}{\COEFFB}}% + {\def\COEFFA{\COEFF}\def\COEFFB{\COEFF}} + \fi +} + +%splines en tikz avec ..controls +\defKV[spline]{% + Epaisseur=\def\SPLepaisseur{#1},% + Couleur=\def\SPLcouleur{#1},% + Coeffs=\def\SPLcoeffs{#1},% + CouleurPoints=\def\SPLcouleurpoints{#1},% + TaillePoints=\def\SPLtaillepoints{#1},% + Style=\def\SPLstyle{#1} +} + +\setKVdefault[spline]{% + Epaisseur=1.25pt,% + Couleur=red,% + Coeffs=3,% + CouleurPoints=black,% + TaillePoints=2pt,% + AffPoints=false,% + Style={} +} + +\newcommand\SplineTikz[2][]{% + \useKVdefault[spline] + \setKV[spline]{#1}% on paramètres les nouvelles clés et on les simplifie + %on lit la liste des points/nbderivés et on stocke dans \listepoints + \setsepchar[.]{§./}% + \readlist*\SPLlistepoints{#2}% + \def\SPLnbsplines{\inteval{\SPLlistepointslen-1}}% + %si uniquement deux points, pas de boucle... + \ifnum \SPLlistepointslen=2 + %extraction des coeffs de compensation + \extractcoeff{\SPLcoeffs}{1}% + %extraction des coordonnées + \itemtomacro\SPLlistepoints[1,1]\xa + \itemtomacro\SPLlistepoints[1,2]\ya + \itemtomacro\SPLlistepoints[1,3]\fprimea + \itemtomacro\SPLlistepoints[2,1]\xb + \itemtomacro\SPLlistepoints[2,2]\yb + \itemtomacro\SPLlistepoints[2,3]\fprimeb + \draw[line width=\SPLepaisseur,\SPLcouleur,\SPLstyle] (\xa,\ya) ..controls +({atan \fprimea}:{(\xb-\xa)/\COEFFA}) and +({-180 + atan \fprimeb}:{(\xb-\xa)/\COEFFA}).. (\xb,\yb) ;% + %sinon on construit bout par bout ! + \else + \foreach \i in {1,2,...,\SPLnbsplines}{ + %extraction des coeffs de compensation + \extractcoeff{\SPLcoeffs}{\i} + \def\j{\inteval{\i+1}} + \itemtomacro\SPLlistepoints[\i,1]\xa + \itemtomacro\SPLlistepoints[\i,2]\ya + \itemtomacro\SPLlistepoints[\i,3]\fprimea + \itemtomacro\SPLlistepoints[\j,1]\xb + \itemtomacro\SPLlistepoints[\j,2]\yb + \itemtomacro\SPLlistepoints[\j,3]\fprimeb + \draw[line width=\SPLepaisseur,\SPLcouleur,\SPLstyle] (\xa,\ya) ..controls +({atan \fprimea}:{(\xb-\xa)/\COEFFA}) and +({-180 + atan \fprimeb}:{(\xb-\xa)/\COEFFB}).. (\xb,\yb) ;% + } + \fi + \ifboolKV[spline]{AffPoints}%on affiche les points de contrôle + {% + \foreach \i in {1,2,...,\SPLlistepointslen}{% + \itemtomacro\SPLlistepoints[\i,1]\xa + \itemtomacro\SPLlistepoints[\i,2]\ya + \filldraw[\SPLcouleurpoints] (\xa,\ya) circle[radius=\SPLtaillepoints] ;% + } + } + {} +} + +%tangente(s) en TikZ, avec point/dérivée ou liste points/dérivées +\defKV[tgte]{% + Epaisseur=\def\TGTepaisseur{#1},% + Couleur=\def\TGTcouleur{#1},% + xl=\def\TGTXL{#1},% + xr=\def\TGTXR{#1},% + Style=\def\TGTstyle{#1},% + Point=\def\TGTnumpt{#1} +} + +\setKVdefault[tgte]{ + Epaisseur=1.25pt,% + Couleur=red,% + xl=0.5,xr=0.5,% + Style={},% + Point=1 +} + +\newcommand\TangenteTikz[2][]{% + \useKVdefault[tgte]% + \setKV[tgte]{#1}% on paramètres les nouvelles clés et on les simplifie + \setsepchar[.]{§./}% + \readlist*\TGTlistepoints{#2}% + \itemtomacro\TGTlistepoints[\TGTnumpt,1]\xa + \itemtomacro\TGTlistepoints[\TGTnumpt,2]\ya + \itemtomacro\TGTlistepoints[\TGTnumpt,3]\fprimea + \def\TGTDEB{\fpeval{\xa-\TGTXL}}\def\TGTFIN{\fpeval{\xa+\TGTXR}}% + \draw[line width=\TGTepaisseur,\TGTcouleur,domain=\TGTDEB:\TGTFIN,\TGTstyle] plot (\x,{\fprimea*(\x-\xa)+\ya}) ;% +} + +%%------STATS2VAR +%variables directement dans tikzpicture +\tikzset{% + Ox/.store in=\axexOx,Ox/.default=0,Ox=0,%essai + Oy/.store in=\axeyOy,Oy/.default=0,Oy=0,%essai + xmin/.store in=\xmin,xmin/.default=-5,xmin=-5, + xmax/.store in=\xmax,xmax/.default=5,xmax=5, + ymin/.store in=\ymin,ymin/.default=-5,ymin=-5, + ymax/.store in=\ymax,ymax/.default=5,ymax=5, + xgrille/.store in=\xgrille,xgrille/.default=1,xgrille=1, + xgrilles/.store in=\xgrilles,xgrilles/.default=0.5,xgrilles=0.5, + ygrille/.store in=\ygrille,ygrille/.default=1,ygrille=1, + ygrilles/.store in=\ygrilles,ygrilles/.default=0.5,ygrilles=0.5, + xunit/.store in=\xunit,xunit/.default=1,xunit=1, + yunit/.store in=\yunit,yunit/.default=1,yunit=1 +} + +%style point croix +\tikzset{pics/PLdotcross/.style args={#1/#2}{ + code={ + \draw[line width={0.5*#1},rotate=#2] (-#1,0) -- (#1,0); + \draw[line width={0.5*#1},rotate=#2] (0,-#1) -- (0, #1); + } + }, + pics/PLdotcross/.default={4pt/0} +} + +%affichage d'un label en radians +\NewDocumentCommand\AffAngleRadian{ s m }{%étoilée en dfrac + \IfStrEq{#2}{0}%cas où l'argument vaut 0 + {\def\restmp{0}}% + {% + \StrDel{#2}{*}[\restmpsansmoins]% + \StrSubstitute{\restmpsansmoins}{pi}{\pi}[\restmppi]% + \IfSubStr{#2}{/}% + {% + \StrCut{\restmppi}{/}\tmpnum\tmpdenom% + \IfSubStr{\tmpnum}{-} + {% + \StrDel{\tmpnum}{-}[\restmppinum]% + \IfBooleanTF{#1} + {\def\restmp{-\dfrac{\restmppinum}{\tmpdenom}}} + {\def\restmp{-\frac{\restmppinum}{\tmpdenom}}} + }% + {% + \IfBooleanTF{#1} + {\def\restmp{\dfrac{\tmpnum}{\tmpdenom}}} + {\def\restmp{\frac{\tmpnum}{\tmpdenom}}} + }% + }% + {% + \def\restmp{\restmppi}% + }% + }% + \restmp% +} + +%axeOx +\defKV[PLaxextkz]{% + Epaisseur=\def\axexwidth{#1},% + Police=\def\axexfont{#1},% + HautGrad=\def\axextickwidth{#1},% + PosGrad=\def\axexposlabel{#1} +} + +\setKVdefault[PLaxextkz]{% + Epaisseur=1pt,% + Police=\normalsize\normalfont,% + PosGrad=below,% + HautGrad=4pt,% + AffGrad=true,% + AffOrigine=true,% + Annee=false,% + Dfrac=false,% + Trigo=false +} + +\DeclareDocumentCommand\AxexTikz{ O{} m }{% + \useKVdefault[PLaxextkz] + \setKV[PLaxextkz]{#1}% on paramètres les nouvelles clés et on les simplifie + %récupération des tickwidth H/B + \IfSubStr{\axextickwidth}{/} + {\StrCut{\axextickwidth}{/}{\axextickwidthA}{\axextickwidthB}} + {\def\axextickwidthA{\axextickwidth}\def\axextickwidthB{\axextickwidth}} + %en fonction de Trigo ou non + \ifboolKV[PLaxextkz]{Trigo} + { + \foreach \x in {#2}{% + \draw[line width=\axexwidth] ({\x-\axexOx},{\axextickwidthA}) -- ({\x-\axexOx},{-\axextickwidthB})% + \ifboolKV[PLaxextkz]{AffGrad}%on affiche les graduations + {% + node[\axexposlabel,font=\axexfont] {\ifboolKV[PLaxextkz]{Dfrac}{$\AffAngleRadian*{\x}$}{$\AffAngleRadian{\x}$}} + }% + {}% + ;} + } + { + \foreach \x in {#2}{% + \draw[line width=\axexwidth] ({\x-\axexOx},{\axextickwidthA}) -- ({\x-\axexOx},{-\axextickwidthB})% + \ifboolKV[PLaxextkz]{AffGrad}%on affiche les graduations + {% + \ifboolKV[PLaxextkz]{AffOrigine}%si on demande d'afficher l'origine + {node[\axexposlabel,font=\axexfont] + {\ifboolKV[PLaxextkz]{Annee}% + {\num[group-digits=none]{\x}}% + {\num[text-family-to-math=true,text-series-to-math=true]{\x}}% + } + } + {\xintifboolexpr{\x==\axexOx}{}{node[\axexposlabel,font=\axexfont] {\ifboolKV[PLaxextkz]{Annee}% + {\num[group-digits=none]{\x}}% + {\num[text-family-to-math=true,text-series-to-math=true]{\x}}% + } + } + } + } + {} + ;} + } + +} + +%axeOy +\defKV[PLaxeytkz]{% + Epaisseur=\def\axeywidth{#1},% + Police=\def\axeyfont{#1},% + HautGrad=\def\axeytickwidth{#1},% + PosGrad=\def\axeyposlabel{#1} +} + +\setKVdefault[PLaxeytkz]{% + Epaisseur=1pt,% + Police=\normalsize\normalfont,% + PosGrad=left,% + HautGrad=4pt,% + AffGrad=true,% + AffOrigine=true,% + Annee=false +} + +\DeclareDocumentCommand\AxeyTikz{ O{} m }{% + \useKVdefault[PLaxeytkz] + \setKV[PLaxeytkz]{#1}% on paramètres les nouvelles clés et on les simplifie + \IfSubStr{\axeytickwidth}{/} + {\StrCut{\axeytickwidth}{/}{\axeytickwidthA}{\axeytickwidthB}} + {\def\axeytickwidthA{\axeytickwidth}\def\axeytickwidthB{\axeytickwidth}} + \foreach \y in {#2}{% + \draw[line width=\axeywidth] ({\axeytickwidthA},{\y-\axeyOy}) -- ({-\axeytickwidthB},{\y-\axeyOy})% + \ifboolKV[PLaxeytkz]{AffGrad}%on affiche les graduations + {% + \ifboolKV[PLaxeytkz]{AffOrigine}%si on demande d'afficher l'origine + {node[\axeyposlabel,font=\axeyfont] + {\ifboolKV[PLaxeytkz]{Annee}% + {\num[group-digits=none]{\y}}% + {\num[text-family-to-math=true,text-series-to-math=true]{\y}}% + } + } + {\xintifboolexpr{\y==\axeyOy}{}{node[\axeyposlabel,font=\axeyfont] {\ifboolKV[PLaxeytkz]{Annee}% + {\num[group-digits=none]{\y}}% + {\num[text-family-to-math=true,text-series-to-math=true]{\y}}% + } + } + } + } + {} + ;} +} + +%axes +\defKV[PLaxestkz]{% + Epaisseur=\def\axeswidth{#1},% + Police=\def\axesfont{#1},% + Labelx=\def\axeslabelx{#1},% + Labely=\def\axeslabely{#1},% + PosLabelx=\def\axesposlabelx{#1},% + PosLabely=\def\axesposlabely{#1},% + EchelleFleche=\def\axesechellefleche{#1},% + TypeFleche=\def\axestypefleche{#1},% + AffLabel=\def\axesafflabel{#1},% + ElargirOx=\def\axeselargx{#1},% + ElargirOy=\def\axeselargy{#1} +} + +\setKVdefault[PLaxestkz]{% + Epaisseur=1pt,% + Police=\normalsize\normalfont,% + Labelx=$x$,% + Labely=$y$,% + AffLabel=z,% + PosLabelx=right,% + PosLabely=above,% + EchelleFleche=1,% + TypeFleche=latex,% + ElargirOx=0/0.05,% + ElargirOy=0/0.05 +} + +\DeclareDocumentCommand\AxesTikz{ O{} }{% + \useKVdefault[PLaxestkz] + \setKV[PLaxestkz]{#1}% + %les petits élargissements + \IfSubStr{\axeselargx}{/} + {\StrCut{\axeselargx}{/}{\axeselargxG}{\axeselargxD}} + {\def\axeselargxG{\axeselargx}\def\axeselargxD{\axeselargx}} + \def\axesenlargxG{\fpeval{\axeselargxG*(\xmax-\xmin)}} + \def\axesenlargxD{\fpeval{\axeselargxD*(\xmax-\xmin)}} + \IfSubStr{\axeselargy}{/} + {\StrCut{\axeselargy}{/}{\axeselargyG}{\axeselargyD}} + {\def\axeselargyG{\axeselargy}\def\axeselargyD{\axeselargy}} + \def\axesenlargyG{\fpeval{\axeselargyG*(\ymax-\ymin)}} + \def\axesenlargyD{\fpeval{\axeselargyD*(\ymax-\ymin)}} + %on affiche les deux axes + \draw[line width=\axeswidth,-{\axestypefleche[scale=\axesechellefleche]}] ({\xmin-\axexOx-\axesenlargxG},0) -- ({\xmax-\axexOx+\axesenlargxD},0) ; + \draw[line width=\axeswidth,-{\axestypefleche[scale=\axesechellefleche]}] (0,{\ymin-\axeyOy-\axesenlargyG}) -- (0,{\ymax-\axeyOy++\axesenlargyD}) ; + %les labels éventuels + \IfSubStr{\axesafflabel}{x}% + {\draw ({\xmax-\axexOx},0) node[\axesposlabelx,font=\axesfont] {\axeslabelx} ;} + {} + \IfSubStr{\axesafflabel}{y}% + {\draw (0,{\ymax-\axeyOy}) node[\axesposlabely,font=\axesfont] {\axeslabely} ;} + {} +} + +%fenêtre clippée +\newcommand\FenetreTikz{% + \clip ({\xmin-\axexOx},{\ymin-\axeyOy}) rectangle ({\xmax-\axexOx},{\ymax-\axeyOy}) ; +} + +%origine +\defKV[PLaxesorig]{% + Police=\def\axesorfont{#1},% + Pos=\def\axesorpos{#1},% + Decal=\def\axesordecal{#1},% + Valeur=\def\axesorval{#1} +} + +\setKVdefault[PLaxesorig]{% + Police=\normalsize\normalfont,% + Pos={below left},% + Decal=2pt,% + Valeur=0 +} + +\DeclareDocumentCommand\OrigineTikz{ O{} }{% + \useKVdefault[PLaxesorig]% + \setKV[PLaxesorig]{#1}% + \draw (0,0) node[\axesorpos=\axesordecal,font=\axesorfont] {\axesorval} ; +} + +%grilles +\setKVdefault[PLgrillestkz]{% + Affp=true,% + Affs=true +} + +\DeclareDocumentCommand\GrilleTikz{ O{} O{thin,lightgray} O{ultra thin,lightgray} }{% + \useKVdefault[PLgrillestkz] + \setKV[PLgrillestkz]{#1}% + \ifboolKV[PLgrillestkz]{Affs} + {\draw[xstep=\xgrilles,ystep=\ygrilles,#3] ({\xmin-\axexOx},{\ymin-\axeyOy}) grid ({\xmax-\axexOx},{\ymax-\axeyOy});} + {} + \ifboolKV[PLgrillestkz]{Affp} + {\draw[xstep=\xgrille,ystep=\ygrille,#2] ({\xmin-\axexOx},{\ymin-\axeyOy}) grid ({\xmax-\axexOx},{\ymax-\axeyOy});} + {} +} + +%point(s) avec changement origines +\defKV[PLpts]{% + Taille=\def\ptstaille{#1},% + Couleur=\def\ptscouleur{#1},% + Style=\def\ptsstyle{#1} +} + +\setKVdefault[PLpts]{% + Taille=2pt,% + Couleur=blue,% + Style=o +} + +\newcommand\PLnuagepoints[2][]{% + \useKVdefault[PLpts] + \setKV[PLpts]{#1}% + \setsepchar{§}% + \readlist\listepointsaffiches{#2} + \foreachitem\point\in\listepointsaffiches{% + \StrBetween{\point}{(}{,}[\XPT] + \StrBetween{\point}{,}{)}[\YPT] + \IfStrEq{\ptsstyle}{o}% + {\filldraw[\ptscouleur] ({\XPT-\axexOx},{\YPT-\axeyOy}) circle[radius=\ptstaille] ;} + {} + \IfStrEq{\ptsstyle}{x}% + {\draw[\ptscouleur] ({\XPT-\axexOx},{\YPT-\axeyOy}) pic {PLdotcross=\ptstaille/45} ;} + {} + \IfStrEq{\ptsstyle}{+}% + {\draw[\ptscouleur] ({\XPT-\axexOx},{\YPT-\axeyOy}) pic {PLdotcross=\ptstaille/0} ;} + {} + } +} + +\newcommand\NuagePointsTikz[3][]{% + \useKVdefault[PLpts] + \setKV[PLpts]{#1}% on paramètres les nouvelles clés et on les simplifie + \def\xliste{#2} + \def\yliste{#3} + \readlist*\LX{\xliste} + \readlist*\LY{\yliste} + %taille des listes + \def\LNB{\inteval{\LXlen}} + \foreach \i in {1,2,...,\LNB} { + \IfStrEq{\ptsstyle}{o}% + { + \IfSubStr{\ptscouleur}{/} + {\StrCut{\ptscouleur}{/}{\ptscouleurA}{\ptscouleurB}\draw[thick,\ptscouleurA,fill=\ptscouleurB] ({\LX[\i]-\axexOx},{\LY[\i]-\axeyOy}) circle[radius=\ptstaille] ;} + {\draw[\ptscouleur,fill=\ptscouleur] ({\LX[\i]-\axexOx},{\LY[\i]-\axeyOy}) circle[radius=\ptstaille] ;} + } + {} + \IfStrEq{\ptsstyle}{x}% + {\draw[\ptscouleur] ({\LX[\i]-\axexOx},{\LY[\i]-\axeyOy}) pic {PLdotcross=\ptstaille/45} ;} + {} + \IfStrEq{\ptsstyle}{+}% + {\draw[\ptscouleur] ({\LX[\i]-\axexOx},{\LY[\i]-\axeyOy}) pic {PLdotcross=\ptstaille/0} ;} + {} + } +} + +\defKV[PLptmoy]{% + Police=\def\ptmoyfont{#1},% + Taille=\def\ptmoytaille{#1},% + Couleur=\def\ptmoycouleur{#1},% + Style=\def\ptmoystyle{#1},% + xg=\def\ptmoyx{#1},% + yg=\def\ptmoyy{#1},% + Nom=\def\ptmoynom{#1},% + Pos=\def\ptmoypos{#1},% + Decal=\def\ptmoydecal{#1}% +} + +\setKVdefault[PLptmoy]{% + Police=\normalsize\normalfont,% + Taille=4pt,% + Couleur=red,% + Style=x,% + xg=\LXmoy,% + yg=\LYmoy,% + Nom=G,% + Pos=above,% + Decal=0pt,% + AffNom=true +} + +\newcommand\PointMoyenTikz[1][]{% + \useKVdefault[PLptmoy] + \setKV[PLptmoy]{#1}% on paramètres les nouvelles clés et on les simplifie + \IfStrEq{\ptmoystyle}{o}% + { + \IfSubStr{\ptmoycouleur}{/} + {\StrCut{\ptmoycouleur}{/}{\ptmoycouleurA}{\ptmoycouleurB}\draw[thick,\ptmoycouleurA,fill=\ptmoycouleurB] ({\ptmoyx-\axexOx},{\ptmoyy-\axeyOy}) circle[radius=\ptmoytaille] ;} + {\draw[\ptmoycouleur,fill=\ptmoycouleur] ({\ptmoyx-\axexOx},{\ptmoyy-\axeyOy}) circle[radius=\ptmoytaille] ;} + } + {} + \IfStrEq{\ptmoystyle}{x}% + {\draw[\ptmoycouleur] ({\ptmoyx-\axexOx},{\ptmoyy-\axeyOy}) pic {PLdotcross=\ptmoytaille/45} ;} + {} + \IfStrEq{\ptmoystyle}{+}% + {\draw[\ptmoycouleur] ({\ptmoyx-\axexOx},{\ptmoyy-\axeyOy}) pic {PLdotcross=\ptmoytaille/0} ;} + {} + \ifboolKV[PLptmoy]{AffNom} + {\draw ({\ptmoyx-\axexOx},{\ptmoyy-\axeyOy}) node[\ptmoypos={\ptmoytaille+\ptmoydecal},font=\ptmoyfont] {\ptmoynom} ;} + {} + +} + +%courbe ? +\newcommand\CourbeTikz[3][]{% + \setsepchar{:}% + \readlist\PLdomaine{#3} + \itemtomacro\PLdomaine[1]\PLDm + \itemtomacro\PLdomaine[2]\PLDM + \saveexpandmode\noexpandarg + \StrSubstitute{#2}{\x}{(\x+\axexOx)}[\fctdecx] + \restoreexpandmode % restore the previous mode + \draw[#1] plot[domain={\PLDm-\axexOx}:{\PLDM-\axexOx}] (\x,{\fctdecx-\axeyOy}) ; +} + +\setKVdefault[PLsimplewindow]{% + Axes=true,% + Grille=true,% +} + +\DeclareDocumentCommand\FenetreSimpleTikz{ O{} D(){} D<>{} m D<>{} m }{% + \useKVdefault[PLsimplewindow]% + \setKV[PLsimplewindow]{#1}% on paramètres les nouvelles clés et on les simplifie + \ifboolKV[PLsimplewindow]{Grille}% + {\GrilleTikz}% + {}% + \ifboolKV[PLsimplewindow]{Axes}% + {\AxesTikz[#2]% + \AxexTikz[#3]{#4} + \AxeyTikz[#5]{#6}}% + {}% +} + + + +\endinput
\ No newline at end of file |