% proflycee-tools-geom.tex % Copyright 2023-2024 Cédric Pierquet % Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt %%------PaveDroitTikZ \defKV[paramspave]{% Largeur=\xdef\PFPaveLg{#1},% Profondeur=\xdef\PFPavePf{#1},% Hauteur=\xdef\PFPaveHt{#1},% Angle=\xdef\PFPaveAngl{#1},% Fuite=\xdef\PFPaveFuite{#1},% Sommets=\def\PFPaveSommets{#1},% Epaisseur=\xdef\PFPaveThick{#1} } \setKVdefault[paramspave]{% Aff=false,% Plein=false,% Largeur=2,% Profondeur=1,% Hauteur=1.25,% Angle=30,% Fuite=0.5,% Epaisseur=thick,% Sommets=A§B§C§D§E§F§G§H,% Cube=false,% Math=false } \newcommand\PaveTikz[1][]{% \useKVdefault[paramspave]% \setKV[paramspave]{#1}% \ifboolKV[paramspave]{Cube} {\xdef\PFPavePf{\PFPaveLg}% \xdef\PFPaveHt{\PFPaveLg}} {} \setsepchar{§}% \readlist*\PFListeSommets\PFPaveSommets \itemtomacro\PFListeSommets[1]\PaveA \itemtomacro\PFListeSommets[2]\PaveB \itemtomacro\PFListeSommets[3]\PaveC \itemtomacro\PFListeSommets[4]\PaveD \itemtomacro\PFListeSommets[5]\PaveE \itemtomacro\PFListeSommets[6]\PaveF \itemtomacro\PFListeSommets[7]\PaveG \itemtomacro\PFListeSommets[8]\PaveH %les nœuds du pave \coordinate (\PaveA) at (0,0) ; \coordinate (\PaveB) at ({\PFPaveLg},0) ; \coordinate (\PaveC) at ($(\PaveB) + ({\PFPaveAngl}:{\PFPaveFuite*\PFPavePf})$) ; \coordinate (\PaveD) at ($(\PaveA) + ({\PFPaveAngl}:{\PFPaveFuite*\PFPavePf})$) ; \coordinate (\PaveE) at ($(\PaveA) + (0,{\PFPaveHt})$) ; \coordinate (\PaveF) at ($(\PaveB) + (0,{\PFPaveHt})$) ; \coordinate (\PaveG) at ($(\PaveC) + (0,{\PFPaveHt})$) ; \coordinate (\PaveH) at ($(\PaveD) + (0,{\PFPaveHt})$) ; \ifboolKV[paramspave]{Aff} {\draw (\PaveA) node[below left] {\ifboolKV[paramspave]{Math}{$\PaveA$}{\PaveA}} ; \draw (\PaveB) node[below right] {\ifboolKV[paramspave]{Math}{$\PaveB$}{\PaveB}} ; \draw (\PaveC) node[above right] {\ifboolKV[paramspave]{Math}{$\PaveC$}{\PaveC}} ; \ifboolKV[paramspave]{Plein} {} {\draw (\PaveD) node[above left] {\ifboolKV[paramspave]{Math}{$\PaveD$}{\PaveD}} ;} \draw (\PaveE) node[below left] {\ifboolKV[paramspave]{Math}{$\PaveE$}{\PaveE}} ; \draw (\PaveF) node[below right] {\ifboolKV[paramspave]{Math}{$\PaveF$}{\PaveF}} ; \draw (\PaveG) node[above right] {\ifboolKV[paramspave]{Math}{$\PaveG$}{\PaveG}} ; \draw (\PaveH) node[above left] {\ifboolKV[paramspave]{Math}{$\PaveH$}{\PaveH}} ;} {}%on affiche rien \draw[\PFPaveThick,line join=bevel] (\PaveA)--(\PaveB)--(\PaveF)--(\PaveE)--cycle (\PaveB)--(\PaveC)--(\PaveG)--(\PaveF)--cycle (\PaveG)--(\PaveH)--(\PaveE) ; \ifboolKV[paramspave]{Plein} {} {\draw[dashed,\PFPaveThick,line join=bevel] (\PaveA)--(\PaveD)--(\PaveC) (\PaveD)--(\PaveH) ;} } %%------TétraèdreTikZ \defKV[paramstetra]{% Largeur=\xdef\PFTetraLg{#1},% Profondeur=\xdef\PFTetraPf{#1},% Hauteur=\xdef\PFTetraHt{#1},% Alpha=\xdef\PFTetraAlpha{#1},% Beta=\xdef\PFTetraBeta{#1},% Sommets=\def\PFTetraSommets{#1},% Epaisseur=\xdef\PFTetraThick{#1} } \setKVdefault[paramstetra]{% Aff=false,% Plein=false,% Largeur=4,% Profondeur=1.25,% Hauteur=3,% Alpha=40,% Beta=60,% Epaisseur=thick,% Sommets=A§B§C§D,% Math=false } \newcommand\TetraedreTikz[1][]{% \useKVdefault[paramstetra]% \setKV[paramstetra]{#1}% \setsepchar{§}% \readlist*\PFListeSommets\PFTetraSommets \itemtomacro\PFListeSommets[1]\TetraA \itemtomacro\PFListeSommets[2]\TetraB \itemtomacro\PFListeSommets[3]\TetraC \itemtomacro\PFListeSommets[4]\TetraD %les nœuds du tétraèdre \coordinate (\TetraA) at (0,0) ; \coordinate (\TetraB) at ($(\TetraA) + ({-\PFTetraAlpha}:{\PFTetraPf})$) ; \coordinate (\TetraC) at ({\PFTetraLg},0) ; \coordinate (\TetraD) at ($(\TetraA) + ({\PFTetraBeta}:{\PFTetraHt})$) ; \ifboolKV[paramstetra]{Aff} {\draw (\TetraA) node[left] {\ifboolKV[paramstetra]{Math}{$\TetraA$}{\TetraA}} ; \draw (\TetraB) node[below] {\ifboolKV[paramstetra]{Math}{$\TetraB$}{\TetraB}} ; \draw (\TetraC) node[right] {\ifboolKV[paramstetra]{Math}{$\TetraC$}{\TetraC}} ; \draw (\TetraD) node[above] {\ifboolKV[paramstetra]{Math}{$\TetraD$}{\TetraD}} ;} {}%on affiche rien \draw[\PFTetraThick,line join=bevel] (\TetraA)--(\TetraD)--(\TetraC)--(\TetraB)--cycle (\TetraD)--(\TetraB) ; \ifboolKV[paramstetra]{Plein} {} {\draw[dashed,\PFTetraThick,line join=bevel] (\TetraA)--(\TetraC) ;} } %%Equations Cartésiennes + Affichages coordonnées \RequirePackage{nicematrix} %\RequirePackage{ifpdf} \NewDocumentCommand\AffCoeffSgn{ s O{} m m D<>{} }{% \IfStrEq{#5}{}%si argument vide, on convertit en fraction {% \xintifboolexpr{\xinteval{#3} == 0}% {}%on n'affiche rien si le coeff est nul {%sinon on teste >0 puis else \xintifboolexpr{\xinteval{#3} > 0}% {% \IfBooleanTF{#1}{}{+}% \xintifboolexpr{\xinteval{#3} == 1}% {#4}% {\ConversionFraction[#2]{#3}#4}% }% {% \xintifboolexpr{\xinteval{#3} == -1}% {-#4\relax}% {\ConversionFraction[#2]{#3}#4}% }% }% }% %sinon on met en brut {% #3#4% }% } \NewDocumentCommand\AffCoeffSgnSimpl{ s O{} m D<>{} }{% \IfStrEq{#4}{}%si argument vide, on convertit en fraction {% \xintifboolexpr{\xinteval{#3} == 0}% {}%on n'affiche rien si le coeff est nul {%sinon on teste >0 puis else \xintifboolexpr{\xinteval{#3} > 0}% {% \IfBooleanTF{#1}{}{+}% \xintifboolexpr{\xinteval{#3} == 1}% {+1}% {+\ConversionFraction[#2]{#3}}% }% {% \xintifboolexpr{\xinteval{#3} == -1}% {-1}% {\ConversionFraction[#2]{#3}}% } % }% }% %sinon on met en brut {% #3% }% } \defKV[eqcartplan]{% OptionCoeffs=\def\eqcartplformat{#1},% Facteur=\def\eqcartplfact{#1} } \setKVdefault[eqcartplan]{% OptionCoeffs={d},% SimplifCoeffs=false,% Facteur=1 } \NewDocumentCommand\TrouveEqCartPlan{ }{% \begingroup \catcode`\;12 \TrouveEqCartPlanAux } \NewDocumentCommand\TrouveEqCartPlanAux{ O{} r() r() d() }{%test commande générique avec VP ou PPP ou PVV \endgroup \restoreKV[eqcartplan]% revenir au valeurs par défaut \setKV[eqcartplan]{#1}% lit les arguments optionnels \IfNoValueTF{#4}%c'est Vect+Point {% \setsepchar{;}\readlist*\CoordVecNorm{#2}% \setsepchar{,}\readlist*\CoordPt{#3}% \itemtomacro\CoordVecNorm[1]\vecnx% \itemtomacro\CoordVecNorm[2]\vecny% \itemtomacro\CoordVecNorm[3]\vecnz% \itemtomacro\CoordPt[1]\xpta% \itemtomacro\CoordPt[2]\ypta% \itemtomacro\CoordPt[3]\zpta% %calculs \xdef\coeffd{-((\xpta)*(\vecnx)+(\ypta)*(\vecny)+(\zpta)*(\vecnz))}% \xdef\PPCMDenom{\xinteval{lcm([\xintDenominator{\xintIrr{\xinteval{\vecnx}}},\xintDenominator{\xintIrr{\xinteval{\vecny}}},\xintDenominator{\xintIrr{\xinteval{\vecnz}}},\xintDenominator{\xintIrr{\xinteval{\coeffd}}}])}}% \xdef\PGCDsiEntiers{1}% \xintifboolexpr{\xinteval{isint(\vecnx)}*\xinteval{isint(\vecny)}*\xinteval{isint(\vecnz)}*\xinteval{isint(\coeffd)} == 1}%tous les coeffs sont entiers {% \xdef\PGCDsiEntiers{\xinteval{gcd([\xinteval{\vecnx},\xinteval{\vecny},\xinteval{\vecnz},\xinteval{\coeffd}])}}% }% {}% %affichages \ifboolKV[eqcartplan]{SimplifCoeffs}% {% \AffCoeffSgn*[\eqcartplformat]{(\vecnx)*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{x} \AffCoeffSgn[\eqcartplformat]{(\vecny)*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{y} \AffCoeffSgn[\eqcartplformat]{(\vecnz)*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{z} \AffCoeffSgnSimpl*[\eqcartplformat]{\coeffd*\PPCMDenom/\PGCDsiEntiers} = 0% }% {% \AffCoeffSgn*[\eqcartplformat]{\vecnx}{x} \AffCoeffSgn[\eqcartplformat]{\vecny}{y} \AffCoeffSgn[\eqcartplformat]{\vecnz}{z} \AffCoeffSgnSimpl*[\eqcartplformat]{\coeffd} = 0% }% }%sinon c'est Point+Point+Point ou vectdir+vectdir+point {% \IfSubStr{#2}{,}%c'est point+point+point {% \setsepchar{,}\readlist*\CoordPtA{#2}% \setsepchar{,}\readlist*\CoordPtB{#3}% \setsepchar{,}\readlist*\CoordPtC{#4}% \itemtomacro\CoordPtA[1]\ptxa% \itemtomacro\CoordPtA[2]\ptya% \itemtomacro\CoordPtA[3]\ptza% \itemtomacro\CoordPtB[1]\ptxb% \itemtomacro\CoordPtB[2]\ptyb% \itemtomacro\CoordPtB[3]\ptzb% \itemtomacro\CoordPtC[1]\ptxc% \itemtomacro\CoordPtC[2]\ptyc% \itemtomacro\CoordPtC[3]\ptzc% %calculs \xdef\vecxab{(\ptxb-\ptxa)}% \xdef\vecyab{(\ptyb-\ptya)}% \xdef\veczab{(\ptzb-\ptza)}% \xdef\vecxac{(\ptxc-\ptxa)}% \xdef\vecyac{(\ptyc-\ptya)}% \xdef\veczac{(\ptzc-\ptza)}% %coeffs a/b/c \xdef\coeffa{(\vecyab*\veczac-\veczab*\vecyac)}% \xdef\coeffb{(\vecxac*\veczab-\vecxab*\veczac)}% \xdef\coeffc{(\vecxab*\vecyac-\vecxac*\vecyab)}% %coeffd \xdef\coeffd{(-(\ptxa)*\vecyab*\veczac-(\ptza)*\vecxab*\vecyac-(\ptya)*\vecxac*\veczab+(\ptza)*\vecyab*\vecxac+(\ptxa)*\veczab*\vecyac+(\ptya)*\vecxab*\veczac)}% %pour simplifier \xdef\PPCMDenom{\xinteval{lcm([\xintDenominator{\xintIrr{\xinteval{\coeffa}}},\xintDenominator{\xintIrr{\xinteval{\coeffb}}},\xintDenominator{\xintIrr{\xinteval{\coeffc}}},\xintDenominator{\xintIrr{\xinteval{\coeffd}}}])}}% \xdef\PGCDsiEntiers{1}% \xintifboolexpr{\xinteval{isint(\coeffa)}*\xinteval{isint(\coeffb)}*\xinteval{isint(\coeffc)}*\xinteval{isint(\coeffd)} == 1}%tous les coeffs sont entiers {% \xdef\PGCDsiEntiers{\xinteval{gcd([\xinteval{\coeffa},\xinteval{\coeffb},\xinteval{\coeffc},\xinteval{\coeffd}])}}% }% {}% %affichages \ifboolKV[eqcartplan]{SimplifCoeffs}% {% \AffCoeffSgn*[\eqcartplformat]{\coeffa*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{x} \AffCoeffSgn[\eqcartplformat]{\coeffb*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{y} \AffCoeffSgn[\eqcartplformat]{\coeffc*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{z} \AffCoeffSgnSimpl*[\eqcartplformat]{\coeffd*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers} = 0% }% {% \AffCoeffSgn*[\eqcartplformat]{\coeffa}{x} \AffCoeffSgn[\eqcartplformat]{\coeffb}{y} \AffCoeffSgn[\eqcartplformat]{\coeffc}{z} \AffCoeffSgnSimpl*[\eqcartplformat]{\coeffd} = 0% }% }% {% \setsepchar{;}\readlist*\CoordVecA{#2}% \setsepchar{;}\readlist*\CoordVecB{#3}% \setsepchar{,}\readlist*\CoordPtC{#4}% \itemtomacro\CoordVecA[1]\vecxab% \itemtomacro\CoordVecA[2]\vecyab% \itemtomacro\CoordVecA[3]\veczab% \itemtomacro\CoordVecB[1]\vecxac% \itemtomacro\CoordVecB[2]\vecyac% \itemtomacro\CoordVecB[3]\veczac% \itemtomacro\CoordPtC[1]\ptxc% \itemtomacro\CoordPtC[2]\ptyc% \itemtomacro\CoordPtC[3]\ptzc% %coeff a/b/c \xdef\coeffa{((\vecyab)*(\veczac)-(\vecyac)*(\veczab))}% \xdef\coeffb{((\veczab)*(\vecxac)-(\veczac)*(\vecxab))}% \xdef\coeffc{((\vecxab)*(\vecyac)-(\vecxac)*(\vecyab))}% %coeffd \xdef\coeffd{-((\ptxc)*\coeffa+(\ptyc)*\coeffb+(\ptzc)*\coeffc)}% %pour simplifier \xdef\PPCMDenom{\xinteval{lcm([\xintDenominator{\xintIrr{\xinteval{\coeffa}}},\xintDenominator{\xintIrr{\xinteval{\coeffb}}},\xintDenominator{\xintIrr{\xinteval{\coeffc}}},\xintDenominator{\xintIrr{\xinteval{\coeffd}}}])}}% \xdef\PGCDsiEntiers{1}% \xintifboolexpr{\xinteval{isint(\coeffa)}*\xinteval{isint(\coeffb)}*\xinteval{isint(\coeffc)}*\xinteval{isint(\coeffd)} == 1}%tous les coeffs sont entiers {% \xdef\PGCDsiEntiers{\xinteval{gcd([\xinteval{\coeffa},\xinteval{\coeffb},\xinteval{\coeffc},\xinteval{\coeffd}])}}% }% {}% %affichages \ifboolKV[eqcartplan]{SimplifCoeffs}% {% \AffCoeffSgn*[\eqcartplformat]{\coeffa*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{x} \AffCoeffSgn[\eqcartplformat]{\coeffb*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{y} \AffCoeffSgn[\eqcartplformat]{\coeffc*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers}{z} \AffCoeffSgnSimpl*[\eqcartplformat]{\coeffd*(\eqcartplfact)*\PPCMDenom/\PGCDsiEntiers} = 0% }% {% \AffCoeffSgn*[\eqcartplformat]{\coeffa}{x} \AffCoeffSgn[\eqcartplformat]{\coeffb}{y} \AffCoeffSgn[\eqcartplformat]{\coeffc}{z} \AffCoeffSgnSimpl*[\eqcartplformat]{\coeffd} = 0% }% }% }% } \defKV[eqcartdroite]{% OptionCoeffs=\def\eqcartdteformat{#1},% Facteur=\def\eqcartdtefact{#1} } \setKVdefault[eqcartdroite]{% OptionCoeffs={d},% SimplifCoeffs=false,% VectDirecteur=false,% Facteur=1 } \NewDocumentCommand\TrouveEqCartDroite{ }{% \begingroup \catcode`\;12 \TrouveEqCartDroiteAux } \NewDocumentCommand\TrouveEqCartDroiteAux{ O{} r() r() }{%vect/point ou point/point \endgroup \restoreKV[eqcartdroite]% revenir au valeurs par défaut \setKV[eqcartdroite]{#1}% lit les arguments optionnels %on teste si c'est point/point \IfSubStr{#2}{,}%c'est point+point, sinon c'est vecteur+point {% \setsepchar{,}\readlist*\CoordPtA{#2}% \setsepchar{,}\readlist*\CoordPtB{#3}% \itemtomacro\CoordPtA[1]\xpta% \itemtomacro\CoordPtA[2]\ypta% \itemtomacro\CoordPtB[1]\xptb% \itemtomacro\CoordPtB[2]\yptb% \xdef\vecnx{((\xptb)-(\xpta))}% \xdef\vecny{((\yptb)-(\ypta))}% %calculs \xdef\coeffd{((\xpta)*(\vecny)-(\ypta)*(\vecnx))}% \xdef\PPCMDenom{\xinteval{lcm([\xintDenominator{\xintIrr{\xinteval{\vecnx}}},\xintDenominator{\xintIrr{\xinteval{\vecny}}},\xintDenominator{\xintIrr{\xinteval{\coeffd}}}])}}% \xdef\PGCDsiEntiers{1}% \xintifboolexpr{\xinteval{isint(\vecnx)}*\xinteval{isint(\vecny)}*\xinteval{isint(\coeffd)} == 1}%tous les coeffs sont entiers {% \xdef\PGCDsiEntiers{\xinteval{gcd([\xinteval{\vecnx},\xinteval{\vecny},\xinteval{\coeffd}])}}% }% {}% %affichages \ifboolKV[eqcartdroite]{SimplifCoeffs}% {% \AffCoeffSgn*[\eqcartdteformat]{-\vecny*(\eqcartdtefact)*\PPCMDenom/\PGCDsiEntiers}{x} \AffCoeffSgn[\eqcartdteformat]{\vecnx*(\eqcartdtefact)*\PPCMDenom/\PGCDsiEntiers}{y} \AffCoeffSgnSimpl*[\eqcartdteformat]{\coeffd*(\eqcartdtefact)*\PPCMDenom/\PGCDsiEntiers} = 0% }% {% \AffCoeffSgn*[\eqcartdteformat]{-(\vecny)}{x} \AffCoeffSgn[\eqcartdteformat]{(\vecnx)}{y} \AffCoeffSgnSimpl*[\eqcartdteformat]{(\coeffd)} = 0% }% } {% \setsepchar{;}\readlist*\CoordVec{#2}% \setsepchar{,}\readlist*\CoordPt{#3}% \itemtomacro\CoordVec[1]\vecnx% \itemtomacro\CoordVec[2]\vecny% \itemtomacro\CoordPt[1]\xpta% \itemtomacro\CoordPt[2]\ypta% %calculs \ifboolKV[eqcartdroite]{VectDirecteur}% {% \xdef\coeffd{((\xpta)*(\vecny)-(\ypta)*(\vecnx))}% }% {% \xdef\coeffd{-((\xpta)*(\vecnx)+(\ypta)*(\vecny))}% }% \xdef\PPCMDenom{\xinteval{lcm([\xintDenominator{\xintIrr{\xinteval{\vecnx}}},\xintDenominator{\xintIrr{\xinteval{\vecny}}},\xintDenominator{\xintIrr{\xinteval{\coeffd}}}])}}% \xdef\PGCDsiEntiers{1}% \xintifboolexpr{\xinteval{isint(\vecnx)}*\xinteval{isint(\vecny)}*\xinteval{isint(\coeffd)} == 1}%tous les coeffs sont entiers {% \xdef\PGCDsiEntiers{\xinteval{gcd([\xinteval{\vecnx},\xinteval{\vecny},\xinteval{\coeffd}])}}% }% {}% %affichages \ifboolKV[eqcartdroite]{SimplifCoeffs}% {% \ifboolKV[eqcartdroite]{VectDirecteur}% {% \AffCoeffSgn*[\eqcartdteformat]{-(\vecny)*(\eqcartdtefact)*(\PPCMDenom)/(\PGCDsiEntiers)}{x} \AffCoeffSgn[\eqcartdteformat]{(\vecnx)*(\eqcartdtefact)*(\PPCMDenom)/(\PGCDsiEntiers)}{y} \AffCoeffSgnSimpl*[\eqcartdteformat]{(\coeffd)*(\eqcartdtefact)*(\PPCMDenom)/(\PGCDsiEntiers)} = 0% }% {% \AffCoeffSgn*[\eqcartdteformat]{(\vecnx)*(\eqcartdtefact)*(\PPCMDenom)/(\PGCDsiEntiers)}{x} \AffCoeffSgn[\eqcartdteformat]{(\vecny)*(\eqcartdtefact)*(\PPCMDenom)/(\PGCDsiEntiers)}{y} \AffCoeffSgnSimpl*[\eqcartdteformat]{(\coeffd)*(\eqcartdtefact)*(\PPCMDenom)/(\PGCDsiEntiers)} = 0% }% }% {% \ifboolKV[eqcartdroite]{VectDirecteur}% {% \AffCoeffSgn*[\eqcartdteformat]{-(\vecny)}{x} \AffCoeffSgn[\eqcartdteformat]{\vecnx}{y} \AffCoeffSgnSimpl*[\eqcartdteformat]{(\coeffd)} = 0% }% {% \AffCoeffSgn*[\eqcartdteformat]{\vecnx}{x} \AffCoeffSgn[\eqcartdteformat]{\vecny}{y} \AffCoeffSgnSimpl*[\eqcartdteformat]{(\coeffd)} = 0% }% }% }%% } \NewDocumentCommand\AffVecteur{ }{% \begingroup \catcode`\;12 \AffVecteurAux } \NewDocumentCommand\AffVecteurAux{ O{d} D<>{} r() }{% \endgroup \setsepchar{;}\readlist*\CoordVec{#3}% \xintifboolexpr{\CoordVeclen == 2}% {% \IfSubStr{#1}{;}% {% \setsepchar{;}\readlist*\OptVec{#1}% \itemtomacro\OptVec[1]\optvecx% \itemtomacro\OptVec[2]\optvecy% }% {% \xdef\optvecx{#1}\xdef\optvecy{#1}% }% \itemtomacro\CoordVec[1]\vecx% \itemtomacro\CoordVec[2]\vecy% \begin{pNiceMatrix}[#2] \ConversionFraction[\optvecx]{\vecx} \\ \ConversionFraction[\optvecy]{\vecy} \end{pNiceMatrix}% }% {}% \xintifboolexpr{\CoordVeclen == 3}% {% \IfSubStr{#1}{;}% {% \setsepchar{;}\readlist*\OptVec{#1}% \itemtomacro\OptVec[1]\optvecx% \itemtomacro\OptVec[2]\optvecy% \itemtomacro\OptVec[3]\optvecz% }% {% \xdef\optvecx{#1}\xdef\optvecy{#1}\xdef\optvecz{#1}% }% \itemtomacro\CoordVec[1]\vecx% \itemtomacro\CoordVec[2]\vecy% \itemtomacro\CoordVec[3]\vecz% \begin{pNiceMatrix}[#2] \ConversionFraction[\optvecx]{\vecx} \\ \ConversionFraction[\optvecy]{\vecy} \\ \ConversionFraction[\optvecz]{\vecz} \end{pNiceMatrix}% }% {}% } \NewDocumentCommand\AffPoint{ O{d} r() }{% \setsepchar{,} \readlist*\CoordPt{#2}% \xintifboolexpr{\CoordPtlen == 2}% {% \IfSubStr{#1}{,}%si l'option est globale... {% \setsepchar{,}\readlist*\OptPt{#1}% \itemtomacro\OptPt[1]\optptx% \itemtomacro\OptPt[2]\optpty% }% {% \xdef\optptx{#1}\xdef\optpty{#1}% }% \itemtomacro\CoordPt[1]\ptx% \itemtomacro\CoordPt[2]\pty% \left( \ConversionFraction[\optptx]{\ptx} ; \ConversionFraction[\optpty]{\pty} \right)% }% {}% \xintifboolexpr{\CoordPtlen == 3}% {% \IfSubStr{#1}{,}%si l'option est globale... {% \setsepchar{,}\readlist*\OptPt{#1}% \itemtomacro\OptPt[1]\optptx% \itemtomacro\OptPt[2]\optpty% \itemtomacro\OptPt[3]\optptz% }% {% \xdef\optptx{#1}\xdef\optpty{#1}\xdef\optptz{#1}% }% \itemtomacro\CoordPt[1]\ptx% \itemtomacro\CoordPt[2]\pty% \itemtomacro\CoordPt[3]\ptz% \left( \ConversionFraction[\optptx]{\ptx} ; \ConversionFraction[\optpty]{\pty} ; \ConversionFraction[\optptz]{\ptz} \right)% }% {}% } %%Équation paramétrique de droite \defKV[eqparamdroite]{% OptionCoeffs=\def\eqparamdteformat{#1},% Reel=\def\eqparamdtereel{#1} } \setKVdefault[eqparamdroite]{% OptionCoeffs={d},% Reel=k,% Aligne=false,% Oppose=false,% Rgras=false } \NewDocumentCommand\AffVarDteParam{ m m }{% \xdef\restmp{\ConversionFraction[\eqparamdteformat]{#1} \AffCoeffSgn[\eqcartdteformat]{#2}{\eqparamdtereel}}% \xintifboolexpr{\xinteval{#1} == 0 'and' \xinteval{#2} == 0}{\xdef\restmp{0}}{}% \xintifboolexpr{\xinteval{#1} == 0 'and' \xinteval{#2} != 0}{\xdef\restmp{\AffCoeffSgn*[\eqcartdteformat]{#2}{\eqparamdtereel}}}{}% \restmp% } \NewDocumentCommand\AffVarDteParamAlign{ m m }{% \xdef\restmp{\ConversionFraction[\eqparamdteformat]{#1} & \AffCoeffSgn[\eqcartdteformat]{#2}{\eqparamdtereel}}% \xintifboolexpr{\xinteval{#1} == 0 'and' \xinteval{#2} == 0}{\xdef\restmp{0 & }}{}% \xintifboolexpr{\xinteval{#1} == 0 'and' \xinteval{#2} != 0}{\xdef\restmp{ & \AffCoeffSgn*[\eqcartdteformat]{#2}{\eqparamdtereel}}}{}% \restmp% } \NewDocumentCommand\TrouveEqParamDroite{ }{% \begingroup \catcode`\;12 \TrouveEqParamDroiteAux } \NewDocumentCommand\TrouveEqParamDroiteAux{ O{} r() r() }{%vect/point ou point/point \endgroup \restoreKV[eqparamdroite]% revenir au valeurs par défaut \setKV[eqparamdroite]{#1}% lit les arguments optionnels %on teste si c'est point/point \IfSubStr{#2}{,}%c'est point+point, sinon c'est vecteur+point {% \setsepchar{,}\readlist*\CoordPtA{#2}% \setsepchar{,}\readlist*\CoordPtB{#3}% \itemtomacro\CoordPtA[1]\xpta% \itemtomacro\CoordPtA[2]\ypta% \itemtomacro\CoordPtA[2]\zpta% \itemtomacro\CoordPtB[1]\xptb% \itemtomacro\CoordPtB[2]\yptb% \itemtomacro\CoordPtB[2]\zptb% \ifboolKV[eqparamdroite]{Oppose}% {% \xdef\vecdirx{((\xpta)-(\xptb))}% \xdef\vecdiry{((\ypta)-(\yptb))}% \xdef\vecdirz{((\zpta)-(\zptb))}% }% {% \xdef\vecdirx{((\xptb)-(\xpta))}% \xdef\vecdiry{((\yptb)-(\ypta))}% \xdef\vecdirz{((\zptb)-(\zpta))}% }% }% {% \setsepchar{;}\readlist*\CoordVec{#2}% \setsepchar{,}\readlist*\CoordPt{#3}% \itemtomacro\CoordVec[1]\vecdirx% \itemtomacro\CoordVec[2]\vecdiry% \itemtomacro\CoordVec[3]\vecdirz% \itemtomacro\CoordPt[1]\xpta% \itemtomacro\CoordPt[2]\ypta% \itemtomacro\CoordPt[3]\zpta% }% \ifboolKV[eqparamdroite]{Aligne}% {% \left\lbrace\begin{array}{@{\,}l@{\;=\;}l@{\;}r} x & \AffVarDteParamAlign{\xpta}{\vecdirx} \\ y & \AffVarDteParamAlign{\ypta}{\vecdiry} \\ z & \AffVarDteParamAlign{\zpta}{\vecdirz} \\ \end{array}\right. \text{, } \eqparamdtereel \in \ifboolKV[eqparamdroite]{Rgras}{\textbf{R}}{\mathbb{R}}% }% {% \begin{dcases} x = \AffVarDteParam{\xpta}{\vecdirx} \\ y = \AffVarDteParam{\ypta}{\vecdiry} \\ z = \AffVarDteParam{\zpta}{\vecdirz} \\ \end{dcases} \text{, } \eqparamdtereel \in \ifboolKV[eqparamdroite]{Rgras}{\textbf{R}}{\mathbb{R}}% }% } \NewDocumentCommand\TrouveDistancePtPlan{ }{% \begingroup \catcode`\;12 \TrouveDistancePtPlanAux } \NewDocumentCommand\TrouveDistancePtPlanAux{ r() r() d() }{%pt+vect+pt \endgroup \IfNoValueTF{#3}%c'est Point + Equation // sinon c'est point + vectnorm + point {% \StrDel{#2}{=0}[\tmpeq]% %%\tmpeq \text{ et }% \setsepchar{,}\readlist*\CoordPtA{#1}% \itemtomacro\CoordPtA[1]\xa% \itemtomacro\CoordPtA[2]\ya% \itemtomacro\CoordPtA[3]\za%. %calcul de d \StrSubstitute{\tmpeq}{x}{(0)}[\tmpcoeffd]% \StrSubstitute{\tmpcoeffd}{y}{(0)}[\tmpcoeffd]% \StrSubstitute{\tmpcoeffd}{z}{(0)}[\tmpcoeffd]% \xdef\coeffd{\tmpcoeffd}% %%d=\xinteval{\coeffd} \text{ et }% %calcul de a \StrSubstitute{\tmpeq}{x}{(1)}[\tmpcoeffa]% \StrSubstitute{\tmpcoeffa}{y}{(0)}[\tmpcoeffa]% \StrSubstitute{\tmpcoeffa}{z}{(0)}[\tmpcoeffa]% \xdef\vectx{(\tmpcoeffa)-(\coeffd)}% %%a=\xinteval{\vectx} \text{ et }% %calcul de b \StrSubstitute{\tmpeq}{x}{(0)}[\tmpcoeffb]% \StrSubstitute{\tmpcoeffb}{y}{(1)}[\tmpcoeffb]% \StrSubstitute{\tmpcoeffb}{z}{(0)}[\tmpcoeffb]% \xdef\vecty{(\tmpcoeffb)-(\coeffd)}% %%b=\xinteval{\vecty} \text{ et }% %calcul de c \StrSubstitute{\tmpeq}{x}{(0)}[\tmpcoeffc]% \StrSubstitute{\tmpcoeffc}{y}{(0)}[\tmpcoeffc]% \StrSubstitute{\tmpcoeffc}{z}{(1)}[\tmpcoeffc]% \xdef\vectz{(\tmpcoeffc)-(\coeffd)}% %c=\xinteval{\vectz} \text{ et }% %calcul du numérateur \StrSubstitute{\tmpeq}{x}{(\xa)}[\resnum]% \StrSubstitute{\resnum}{y}{(\ya)}[\resnum]% \StrSubstitute{\resnum}{z}{(\za)}[\resnum]% %%\text{num}=\xinteval{\resnum} \text{ et } %le carré \xdef\restmp{(\resnum)**2/((\vectx)**2+(\vecty)**2+(\vectz)**2)}% %%\text{resultatcarré}=\xinteval{\restmp} \text{ et }% }% {% \setsepchar{,}\readlist*\CoordPtA{#1}% \setsepchar{;}\readlist*\CoordVec{#2}% \setsepchar{,}\readlist*\CoordPtB{#3}% \itemtomacro\CoordPtA[1]\xa% \itemtomacro\CoordPtA[2]\ya% \itemtomacro\CoordPtA[3]\za% \itemtomacro\CoordVec[1]\vectx% \itemtomacro\CoordVec[2]\vecty% \itemtomacro\CoordVec[3]\vectz% \itemtomacro\CoordPtB[1]\xb% \itemtomacro\CoordPtB[2]\yb% \itemtomacro\CoordPtB[3]\zb% \def\restmp{((\vectx)*((\xb)-(\xa))+(\vecty)*((\yb)-(\ya))+(\vectz)*((\zb)-(\za)))**2/((\vectx)**2+(\vecty)**2+(\vectz)**2)}% }% \SimplificationRacine{\restmp}% } \NewDocumentCommand\TrouveNorme{ }{% \begingroup \catcode`\;12 \TrouveNormeAux } \NewDocumentCommand\TrouveNormeAux{ r() d() }{%pt+vect+pt \endgroup \IfNoValueTF{#2}%c'est Vecteur // sinon c'est point point {% \setsepchar{;}\readlist*\CoordVec{#1}% \xintifboolexpr{\CoordVeclen == 2}% {% \itemtomacro\CoordVec[1]\xveca% \itemtomacro\CoordVec[2]\yveca% \xdef\restmp{(\xveca)**2+(\yveca)**2}% } {}% \xintifboolexpr{\CoordVeclen == 3}%% {% \itemtomacro\CoordVec[1]\xveca% \itemtomacro\CoordVec[2]\yveca% \itemtomacro\CoordVec[3]\zveca% \xdef\restmp{(\xveca)**2+(\yveca)**2+(\zveca)**2}% }% {}% }% {% \setsepchar{,}\readlist*\CoordPtA{#1}% \setsepchar{,}\readlist*\CoordPtB{#2}% \xintifboolexpr{\CoordPtAlen == 2}% {% \itemtomacro\CoordPtA[1]\xa% \itemtomacro\CoordPtA[2]\ya% \itemtomacro\CoordPtB[1]\xb% \itemtomacro\CoordPtB[2]\yb% \xdef\restmp{((\xb)-(\xa))**2+((\yb)-(\ya))**2}% }% {} \xintifboolexpr{\CoordPtAlen == 3}% {% \itemtomacro\CoordPtA[1]\xa% \itemtomacro\CoordPtA[2]\ya% \itemtomacro\CoordPtA[3]\za% \itemtomacro\CoordPtB[1]\xb% \itemtomacro\CoordPtB[2]\yb% \itemtomacro\CoordPtB[3]\zb% \xdef\restmp{((\xb)-(\xa))**2+((\yb)-(\ya))**2+((\zb)-(\za))**2} }% {}% }% \SimplificationRacine{\restmp}% } \endinput