summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex')
-rw-r--r--Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex695
1 files changed, 62 insertions, 633 deletions
diff --git a/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex b/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex
index a4f46d22378..c6579e09029 100644
--- a/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex
+++ b/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex
@@ -1,223 +1,15 @@
+% tkz-tools-math.tex
% Copyright 2011 by Alain Matthes
-%
% This file may be distributed and/or modified
-%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
-
-
-\def\fileversion{1.16 d}
-\def\filedate{2018/09/19}
-
-
-
-% Objet : outils mathématiques pour la géométrie euclideienne avec pgf/tikz
-% utilisable de préférence avec un repère orthonormé et le cm comme unité
-% utile pour la compatibilité avec pgf 2
-%<--------------------------------------------------------------------------–>
-%<--------------------------------------------------------------------------–>
-% Duplicate Length à revoir pas de pt pas de global
-% ||v(CN)||= ||v(AB)|| et v(CN) colineaire à v(CD)
-% A-->#1 B-->#2 C-->#3 D-->#4 N-->#5 ?????
-%<--------------------------------------------------------------------------–>
-\def\tkzDuplicateLen(#1,#2)(#3,#4){%
-\begingroup
- \tkzCalcLength(#1,#2)\tkzGetLength{tkz@firstlen}%
- \tkzCalcLength(#3,#4)\tkzGetLength{tkz@secondlen}%
- \FPdiv\tkz@ratio{\tkz@firstlen}{\tkz@secondlen}%
- \tkz@VecKCoLinear[\tkz@ratio](#3,#4,#3){tkzPointResult}%
-\endgroup
-}
-\let\tkzDuplicateSegment\tkzDuplicateLen %<--------------------------------------------------------------------------–>
-% Coordonnées d'un vecteur (couple de points)
-% Deux points A et B donc un vecteur on récupère les coordonnées de v(AB)
-% en cm
-% tkzGetVecCoord en cm ou en pt ???
-%<--------------------------------------------------------------------------–>
-%result in #3x et #3y #1 et #2 sont les points
-% passage en cm avec fp ?
-\def\tkzGetVectxy(#1,#2)#3{%
-\begingroup
-\pgfpointdiff{\pgfpointanchor{#1}{center}}%
- {\pgfpointanchor{#2}{center}}%
-\pgfmathparse{\pgf@sys@tonumber{\pgf@x}/28.45274}%
-\global\let\tkzresultx\pgfmathresult
-\pgfmathparse{\pgf@sys@tonumber{\pgf@y}/28.45274}%
-\global\let\tkzresulty\pgfmathresult
-\global\expandafter\edef\csname #3x\endcsname{\tkzresultx}%
-\global\expandafter\edef\csname #3y\endcsname{\tkzresulty}%
-\endgroup
-}
-\let\tkzGetVecCoord\tkzGetVectxy
-%<--------------------------------------------------------------------------–>
-%<--------------------------------------------------------------------------–>
-\def\tkz@numv{0}
-\pgfkeys{/tkzdefv/.cd,
-K/.code = {\pgfmathparse{#1}\global\def\tkz@ratio{\pgfmathresult}},
-colinear/.code args = {at #1}{\global\def\tkz@numv{0}%
- \global\def\tkz@frompoint{#1}},
-orthogonal/.code = {\global\def\tkz@numv{1}},
-linear/.code = {\global\def\tkz@numv{2}}\pgfmathparse{#1},
-normed orthogonal/.code = {\global\def\tkz@numv{3}},
-normed linear/.code = {\global\def\tkz@numv{4}},
-}
-\def\tkzDefVector[#1](#2,#3)#4{%
-\begingroup
-\pgfkeys{/tkzdefv/.cd,K=1}
-\pgfqkeys{/tkzdefv}{#1}
-\ifcase\tkz@numv%
- % first case 0
- \tkzDefVectorfrom[\tkz@ratio](#2,#3){#4}
- \or% 1
- \tkz@VecKOrth[\tkz@ratio](#2,#3){#4}
- \or% 2
- \tkz@VecK[\tkz@ratio](#2,#3){#4}
- \or% 3
- \tkz@VecKOrthNorm[\tkz@ratio](#2,#3){#4}
- \or% 4
- \tkz@VecKCoLinear[#1](#2,#3)#4
- \fi
-\endgroup
-}
-
-\def\tkzDefVectorfrom[#1](#2,#3)#4{%
-\begingroup
- \pgfpointdiff{\pgfpointanchor{#2}{center}}%
- {\pgfpointanchor{#3}{center}}%
- \pgf@xa=\pgf@x%
- \pgf@ya=\pgf@y%
- \path[coordinate](\tkz@frompoint)--+(\tkz@ratio\pgf@xa,%
- \tkz@ratio\pgf@ya) coordinate (#4);
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-% VecKCoLinear CN = K x AB #1 pt #2 pt #3 pt #4 nb #5 pt result
-% il faut modifier cette macro : on supprime #3 pour la colinéarité
-% Il suffit d'utiliser Replicate ou Duplicate coeff dans #1
-% v(CD)=#1 x v(AB) #1 le coeff; #2-->A #3-->B #4-->C #5-->N
-%<--------------------------------------------------------------------------–>
-\def\tkzVecKCoLinear{\pgfutil@ifnextchar[{\tkz@VecKCoLinear}{\tkz@VecKCoLinear[1]}}
-\def\tkz@VecKCoLinear[#1](#2,#3,#4)#5{%
-\begingroup
- \pgfpointdiff{\pgfpointanchor{#2}{center}}%
- {\pgfpointanchor{#3}{center}}%
- \pgf@xa=\pgf@x%
- \pgf@ya=\pgf@y%
- \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult}
- \path[coordinate](#4)--+(\tkz@coeff\pgf@xa,\tkz@coeff\pgf@ya)%
- coordinate (#5);%
-\endgroup
-}%
-%<--------------------------------------------------------------------------–>
-% v(AN)=#1 x v(AB)
-% #1 le coeff; #2--> A #3--> B #4-->N tq #4-#2 = #1*(#3-#2)
-%<--------------------------------------------------------------------------–>
-\pgfkeys{
- /tkzscalev/.cd,
- ratio/.code = {\pgfmathparse{#1}\global\edef\tkz@ratio{\pgfmathresult}}
- }
-\def\tkzScaleVector{\pgfutil@ifnextchar[{\tkz@ScaleVector}{%
- \tkz@ScaleVector[]}}
-\def\tkz@ScaleVector[#1](#2,#3)#4{%
-\begingroup
-\pgfkeys{/tkzscalev/.cd,ratio=-1}
-\pgfqkeys{/tkzscalev}{#1}
- \pgfpointdiff{\pgfpointanchor{#2}{center}}%
- {\pgfpointanchor{#3}{center}}%
- \pgf@xa=\pgf@x%
- \pgf@ya=\pgf@y%
- \path[coordinate](#2)--++(\pgf@xa *\tkz@ratio,\pgf@ya *\tkz@ratio)%
- coordinate (#4);%
-\endgroup
-}%
-%<--------------------------------------------------------------------------–>
-% Outils pour les vecteurs
-%<--------------------------------------------------------------------------–>
-% ce sont des outils élémentaires qui à partir de deux points en définissent
-% un troisième
-% #1 si c'est une option alors c'est un nombre réel
-% #2 et #3 sont deux points
-% #4 est le nom du point qui résulte de la transformation
-% exemple : \tkzVecKNorm (A,B){C} définit un point C tel que AC = 1 et C est % % un point de la droite (AC). #1 peut être négatif
-
-%<--------------------------------------------------------------------------–>
-% VectorNormalised ou K*VectorNormalised
-% A-->#2 B-->#3 N-->#4 v(AB) devient v(AN) tq ||v(AN)||=1 si #1=1
-% sinon ||v(AN)||=#1
-%<--------------------------------------------------------------------------–>
-\def\tkzVecKNorm{\pgfutil@ifnextchar[{\tkz@VecKNorm}{\tkz@VecKNorm[1]}}
-\def\tkz@VecKNorm[#1](#2,#3)#4{%
-\begingroup
- \tkzpointnormalised{%
- \pgfpointdiff{\pgfpointanchor{#2}{center}}
- {\pgfpointanchor{#3}{center}}}
- \pgf@xa=\pgf@x\relax%
- \pgf@ya=\pgf@y\relax%
- \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult}
- \FPmul\tkz@coeff{28.45274}{\tkz@coeff}
- \FPmul\tkz@x{\tkz@coeff}{\pgf@sys@tonumber{\pgf@xa}}
- \FPmul\tkz@y{\tkz@coeff}{\pgf@sys@tonumber{\pgf@ya}}
- \path[coordinate](#2)--++(\tkz@x pt,\tkz@y pt)%
- coordinate (#4);%
-\endgroup
-}%
-%<--------------------------------------------------------------------------–>
-% v(AN)=#1 x v(AB)
-% #1 le coeff; #2--> A #3--> B #4-->N tq #4-#2 = #1*(#3-#2)
-%<--------------------------------------------------------------------------–>
-\def\tkzVecK{\pgfutil@ifnextchar[{\tkz@VecK}{\tkz@VecK[1]}}
-\def\tkz@VecK[#1](#2,#3)#4{%
-\begingroup
- \pgfpointdiff{\pgfpointanchor{#2}{center}}%
- {\pgfpointanchor{#3}{center}}%
- \pgf@xa=\pgf@x%
- \pgf@ya=\pgf@y%
- \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult}
- \path[coordinate](#2)--++(\pgf@xa *\tkz@coeff,%
- \pgf@ya *\tkz@coeff)%
- coordinate (#4);%
-\endgroup
-}%
-%<--------------------------------------------------------------------------–>
-% tkzVector K Orth coeff dans #1
-% v(AN) perp v(AB) v(AB) v(AN) sens direct cercle trigo
-% ||v(AN)||=||v(AB)||
-%<--------------------------------------------------------------------------–>
-\def\tkzVecKOrth{\pgfutil@ifnextchar[{\tkz@VecKOrth}{\tkz@VecKOrth[1]}}
-\def\tkz@VecKOrth[#1](#2,#3)#4{%
-\begingroup
- \pgfpointdiff{\pgfpointanchor{#2}{center}}%
- {\pgfpointanchor{#3}{center}}%
- \pgf@xa=-\pgf@y%
- \pgf@ya=\pgf@x%
- \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult}
- \path[coordinate](#2)--++(\tkz@coeff\pgf@xa,\tkz@coeff\pgf@ya)%
- coordinate (#4);%
-\endgroup
-}%
-%<--------------------------------------------------------------------------–>
-% tkzVecKOrthNorm coeff dans #1
-% v(AN) perp v(AB) v(AB) v(AN) sens direct cercle trigo
-% ||v(AN||=1 si #1 est vide ou =1 sinon ||v(AN||=K
-%<--------------------------------------------------------------------------–>
-\def\tkzVecKOrthNorm{\pgfutil@ifnextchar[{\tkz@VecKOrthNorm}%
- {\tkz@VecKOrthNorm[1]}}
-\def\tkz@VecKOrthNorm[#1](#2,#3)#4{%
-\begingroup
- \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#2}{center}}%
- {\pgfpointanchor{#3}{center}}}
- \pgf@xa=-\pgf@y%
- \pgf@ya=\pgf@x%
- \FPmul\tkz@coeff{28.45274}{#1}
- \FPmul\tkz@x{\tkz@coeff}{\pgf@sys@tonumber{\pgf@xa}}
- \FPmul\tkz@y{\tkz@coeff}{\pgf@sys@tonumber{\pgf@ya}}
- \path[coordinate](#2)--++(\tkz@x pt,\tkz@y pt)%
- coordinate (#4);%
-\endgroup
-}%
-%<--------------------------------------------------------------------------–>
+\def\fileversion{3.01c}
+\def\filedate{2020/01/23}
+\typeout{2020/01/23 3.01c tkz-tools-math.tex}
+\makeatletter
+%<-------------------------------------------------------------------------->
% \tkzpointnormalised normalise un point A-->A' tq ||v(OA')=1||
-% équivalent de \pgfpointnormalised avec fp
+% équivalent de \pgfpointnormalised avec fp
% example
% \tkzpointnormalised{%
% \pgfpointdiff{\pgfpointanchor{A}{center}}
@@ -226,463 +18,100 @@ normed linear/.code = {\global\def\tkz@numv{4}},
% or
% \pgf@x=1 cm
% \pgf@y=12 cm
-% \tkzpointnormalised{} %<--------------------------------------------------------------------------–>
+% \tkzpointnormalised{}
+%<--------------------------------------------------------------------------
\def\tkzpointnormalised#1{%
\pgf@process{#1}%
-\FPmul{\tkz@sx}{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@x}}
-\FPmul{\tkz@sy}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@y}}
-\FPadd{\tkz@sxy}{\tkz@sx}{\tkz@sy}
-\FProot{\tkz@den}{\tkz@sxy}{2}
-\FPdiv{\tkz@coordx}{\pgf@sys@tonumber{\pgf@x}}{\tkz@den}
-\FPround{\tkz@coordx}{\tkz@coordx}{5}
-\FPdiv{\tkz@coordy}{\pgf@sys@tonumber{\pgf@y}}{\tkz@den}
-\FPround{\tkz@coordy}{\tkz@coordy}{5}
+\edef\tkz@den{\fpeval{sqrt((\pgf@x)^2+(\pgf@y)^2)}}
+\edef\tkz@coordx{\fpeval{\pgf@x/\tkz@den}}
+\edef\tkz@coordx{\fpeval{round(\tkz@coordx,5)}}
+\edef\tkz@coordy{\fpeval{\pgf@y/\tkz@den}}
+\edef\tkz@coordy{\fpeval{round(\tkz@coordy,5)}}
\pgf@x = \tkz@coordx pt
\pgf@y = \tkz@coordy pt
}
-%<--------------------------------------------------------------------------–>
+%<-------------------------------------------------------------------------->
% restaure and save length
\def\tkz@save@length{%
\global\let\tkz@temp@length\tkzLengthResult}%
\def\tkz@restore@length{%
\global\let\tkzLengthResult\tkz@temp@length }%
-%<--------------------------------------------------------------------------–>
-%<--------------------------------------------------------------------------–>
-% \tkzCalcLength Distance entre deux points en pt ou en cm avec FP
+%<-------------------------------------------------------------------------->
+% \tkzCalcLength Distance entre deux points en pt ou en cm avec xfp
% \veclen mais avec fp
-% option cm le résultat est en cm sinon en pt
-%<--------------------------------------------------------------------------–>
-
-\newif\iftkzLengthIncm
-\pgfkeys{
-DefVecLen/.cd,
+% option cm le résultat est en cm sinon en pt
+%<-------------------------------------------------------------------------->
+\pgfkeys{@CalcLength/.cd,
cm/.is if = tkzLengthIncm,
cm/.default = true}
\def\tkzCalcLength{\pgfutil@ifnextchar[{\tkz@CalcLength}{\tkz@CalcLength[]}}
\def\tkz@CalcLength[#1](#2,#3){%
-\pgfkeys{DefVecLen/.cd, cm = false}
-\pgfqkeys{/DefVecLen}{#1}%
+\pgfkeys{@CalcLength/.cd, cm = false}
+\pgfqkeys{/@CalcLength}{#1}%
\begingroup
\tkz@@CalcLength(#2,#3){tkzLengthResult}
-\iftkzLengthIncm
- \FPdiv\tkzFPMathLen{\tkzFPMathLen}{28.45274}
- \FPround\tkzFPMathLen\tkzFPMathLen5\relax%
- \global\let\tkzLengthResult\tkzFPMathLen
+\iftkzLengthIncm
+ \pgfmathparse{\tkz@xfpMathLen pt/1cm}
+ \edef\tkz@xfpMathLen{\fpeval{round(\pgfmathresult,5)}}
+ \global\let\tkzLengthResult\tkz@xfpMathLen
\fi
\endgroup
}%
\def\tkz@@CalcLength(#1,#2)#3{%
\pgfpointdiff{\pgfpointanchor{#1}{center}}%
{\pgfpointanchor{#2}{center}}%
-\pgf@xa=\pgf@x%
-\pgf@ya=\pgf@y%
-\FPeval\tkz@temp@a{\pgfmath@tonumber{\pgf@xa}}%
-\FPeval\tkz@temp@b{\pgfmath@tonumber{\pgf@ya}}%
-\FPeval\tkz@temp@sum{(\tkz@temp@a*\tkz@temp@a+\tkz@temp@b*\tkz@temp@b)}%
-\FProot{\tkzFPMathLen}{\tkz@temp@sum}{2}%
-\FPround\tkzFPMathLen\tkzFPMathLen5\relax
-\global\expandafter\edef\csname #3\endcsname{\tkzFPMathLen}
+\edef\tkz@xfpMathLen{\fpeval{sqrt((\pgf@x)^2+(\pgf@y)^2)}}
+\edef\tkz@xfpMathLen{\fpeval{round(\tkz@xfpMathLen,5)}}
+\global\expandafter\edef\csname #3\endcsname{\tkz@xfpMathLen}
}
-%<--------------------------------------------------------------------------–>
+%<-------------------------------------------------------------------------->
\def\tkzGetLength#1{%
\global\expandafter\edef\csname #1\endcsname{\tkzLengthResult}}
-%<--------------------------------------------------------------------------–>
-% \tkzpttocm passage de pt à cm div par 28.45274
-%<--------------------------------------------------------------------------–>
+%<-------------------------------------------------------------------------->
+% \tkzpttocm passage de pt   cm div par 28.45274
+%<-------------------------------------------------------------------------->
\def\tkzpttocm(#1)#2{%
\begingroup
- \FPdiv\tkz@mathresult{#1}{28.45274}
- \FPround\tkz@mathresult\tkz@mathresult5\relax%
- \global\let\tkz@mathresult\tkz@mathresult
- \global\expandafter\edef\csname #2\endcsname{\tkz@mathresult}%
+ \pgfmathparse{#1/1cm}
+ \edef\tkz@mathresult{\fpeval{round(\pgfmathresult,5)}}
+ \global\let\tkz@mathresult\tkz@mathresult
+ \global\expandafter\edef\csname #2\endcsname{\tkz@mathresult}%
\endgroup
}%
-%<--------------------------------------------------------------------------–>
-% \tkzcmtopt passage de cm à pt mul par 28.45274 %<--------------------------------------------------------------------------–
+%<-------------------------------------------------------------------------->
+% \tkzcmtopt passage de cm   pt mul par 28.45274
+%<--------------------------------------------------------------------------
\def\tkzcmtopt(#1)#2{%
\begingroup
- \FPmul\tkz@mathresult{#1}{28.45274}
- \FPround\tkz@mathresult\tkz@mathresult5\relax%
- \global\let\tkz@mathresult\tkz@mathresult
-\global\expandafter\edef\csname #2\endcsname{\tkz@mathresult}%
+ \pgfmathparse{#1/1pt}
+ \edef\tkz@mathresult{\fpeval{round(\pgfmathresult,5)}}
+ \global\let\tkz@mathresult\tkz@mathresult
+ \global\expandafter\edef\csname #2\endcsname{\tkz@mathresult}%
\endgroup
}%
-%<--------------------------------------------------------------------------–>
+%<-------------------------------------------------------------------------->
% Slope
-%<--------------------------------------------------------------------------–>
+%<-------------------------------------------------------------------------->
\def\tkzFindSlope{\tkz@FindSlope}
\def\tkz@FindSlope(#1,#2)#3{%
- \begingroup
- \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#1}{center}}%
- {\pgfpointanchor{#2}{center}}}
- \tkz@ax=\pgf@x\relax%
- \tkz@ay=\pgf@y\relax%
- \FPdiv{\tkz@Slope}{\pgfmath@tonumber{\tkz@ay}}{\pgfmath@tonumber{\tkz@ax}}
- \FPround{\tkz@Slope}{\tkz@Slope}{5}
+\begingroup
+ \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#1}{center}}%
+ {\pgfpointanchor{#2}{center}}}
+ \edef\tkz@Slope{\fpeval{\pgfmath@tonumber{\pgf@y}/\pgfmath@tonumber{\pgf@x}}}
+ \edef\tkz@Slope{\fpeval{round(\tkz@Slope,5)}}
\global\expandafter\edef\csname #3\endcsname{\tkz@Slope}%
\endgroup
}
-%<--------------------------------------------------------------------------–>
-%<----------------– for compatibility --------------------------------------–>
-%<--------------------------------------------------------------------------–>
-\def\tkzmathanglebetweenpoints#1#2{%
-\begingroup
- \pgf@process{\pgfpointdiff{#1}{#2}}%
- %
- % First approximate the angle of the external point...
- %
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \pgf@xb\pgf@x%
- \pgf@yb\pgf@y%
- \ifdim\pgf@xa<0pt\relax%
- \pgf@xa-\pgf@xa%
- \fi
- \ifdim\pgf@ya<0pt\relax%
- \pgf@ya-\pgf@ya%
- \fi
- \ifdim\pgf@ya>\pgf@xa%
- \pgf@x\pgf@xa%
- \pgf@y\pgf@ya%
- \else
- \pgf@x\pgf@ya%
- \pgf@y\pgf@xa%
- \fi
- \ifdim\pgf@y=0pt\relax%
- \pgf@x0pt%
- \else
- \FPdiv\pgfmathresult{1}{\pgfmath@tonumber{\pgf@y}}
- \FPround\pgfmathresult\pgfmathresult5\relax%
- \pgf@x\pgfmathresult\pgf@x%
- \fi
- \multiply\pgf@x1000\relax%
- \afterassignment\pgfmath@gobbletilpgfmath@%
- \expandafter\c@pgf@counta\the\pgf@x\relax\pgfmath@%
-\expandafter\pgf@x\csname pgfmath@atan@\the\c@pgf@counta\endcsname pt\relax%
- \ifdim\pgfmath@ya>\pgfmath@xa\relax%
- \pgf@x-\pgf@x%
- \advance\pgf@x90pt%
- \fi
- \ifdim\pgf@xb<0pt%
- \ifdim\pgf@yb>0pt%
- \pgf@x-\pgf@x%
- \fi
- \advance\pgf@x180pt\relax%
- \else
- \ifdim\pgf@yb<0pt%
- \pgf@x-\pgf@x%
- \advance\pgf@x360pt\relax%
- \fi
- \fi
- \ifdim\pgf@x>180pt%
- \advance\pgf@x-360pt\relax%
- \fi
- \pgfmath@returnone\pgf@x%
- \endgroup
-}
-
-% \tkzmathrotatepointaround
-%
-% Rotate point #1 about point #2 by #3 degrees.
-%
-\def\tkzmathrotatepointaround#1#2#3{%
- \pgf@process{%
- \pgf@process{#1}%
- \pgf@xc=\pgf@x%
- \pgf@yc=\pgf@y%
- \pgf@process{#2}%
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \pgf@xb\pgf@x%
- \pgf@yb\pgf@y%
- \pgf@x=\pgf@xc%
- \pgf@y=\pgf@yc%
- \advance\pgf@x-\pgf@xa%
- \advance\pgf@y-\pgf@ya%
- \pgfmathsetmacro\tkz@angle{#3}%
- \pgfmathsin@{\tkz@angle}%
- \let\sineangle\pgfmathresult%
- \pgfmathcos@{\tkz@angle}%
- \let\cosineangle\pgfmathresult%
- \pgf@xa\cosineangle\pgf@x%
- \advance\pgf@xa-\sineangle\pgf@y%
- \pgf@ya\sineangle\pgf@x%
- \advance\pgf@ya\cosineangle\pgf@y%
- \pgf@x\pgf@xb%
- \pgf@y\pgf@yb%
- \advance\pgf@x\pgf@xa%
- \advance\pgf@y\pgf@ya%
- }%
-}
-
-
-% \tkzmathanglebetweenlines
-%
-% Calculate the clockwise angle between a line from point #1
-% to point #2 and a line from #3 to point #4.
-%
-\def\tkzmathanglebetweenlines#1#2#3#4{%
- \begingroup
- \tkzmathanglebetweenpoints{#1}{#2}%
- \let\firstangle\pgfmathresult%
- \tkzmathanglebetweenpoints{#3}{#4}%
- \let\secondangle\pgfmathresult%
- \ifdim\firstangle pt>\secondangle pt\relax%
- \pgfmathadd@{\secondangle}{360}%
- \let\secondangle\pgfmathresult%
- \fi
- \pgfmathsubtract@{\secondangle}{\firstangle}%
- \pgfmath@smuggleone\pgfmathresult%
- \endgroup
-}
-% \pgfmathpointreflectalongaxis
-%
-% Reflects point #2 around an axis centered on #2 at an angle #3.
-%
-\def\tkzmathreflectpointalongaxis#1#2#3{%
- \pgf@process{%
- \pgfmathanglebetweenpoints{#2}{#1}%
- \pgfmath@tempdima\pgfmathresult pt\relax%
- \pgfmathparse{#3}%
- \advance\pgfmath@tempdima-\pgfmathresult pt\relax%
- \pgfmath@tempdima-2.0\pgfmath@tempdima%
- \pgfmathrotatepointaround{#1}{#2}{\pgfmath@tonumber{\pgfmath@tempdima}}%
- }%
-}
-
-
-% \pgfmathpointintersectionoflineandarc
-%
-% A bit experimental at the moment:
-%
-% Locates the point where a line crosses an eliptical arc. If the line
-% does not cross the arc, a meaningless point will result.
-%
-% #1 the point of the line on the "convex" side of the arc.
-% #2 the point of the line on the "concave" side of the arc.
-% #3 the center of the eliptical arc.
-% #4 start angle of the arc.
-% #5 end angle of the arc.
-% #6 radii of the arc.
-%
-\def\tkzmathpointintersectionoflineandarc#1#2#3#4#5#6{%
- \pgf@process{%
- %
- % Get the required angle.
- %
- \pgfmathanglebetweenpoints{#2}{#1}%
- \let\x\pgfmathresult%
- %
- % Get the radii of the arc.
- %
- \pgfmath@in@{and }{#6}%
- \ifpgfmath@in@%
- \pgf@polar@#6\@@%
- \else
- \pgf@polar@#6 and #6\@@%
- \fi
- \edef\xarcradius{\the\pgf@x}%
- \edef\yarcradius{\the\pgf@y}%
- %
- % Get the start and end angles of the arc...
- %
- \pgfmathsetmacro\s{#4}%
- \pgfmathsetmacro\e{#5}%
- %
- % ...and also with rounding.
- %
- \pgfmathmod@{\s}{360}%
- \ifdim\pgfmathresult pt<0pt\relax%
- \pgfmathadd@{\pgfmathresult}{360}%
- \fi
- \let\ss\pgfmathresult%
- \pgfmathmod@{\e}{360}%
- \ifdim\pgfmathresult pt<0pt\relax%
- \pgfmathadd@{\pgfmathresult}{360}%
- \fi
- \let\ee\pgfmathresult%
- %
- % Hackery for when arc straddles zero.
- %
- \ifdim\ee pt<\ss pt\relax%
- \pgfmathadd@{\x}{180}%
- \pgfmathmod@{\pgfmathresult}{360}%
- \let\x\pgfmathresult%
- \fi
- \def\m{360}% Measure of nearness.
- \pgfmathadd@{\s}{\e}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\n\pgfmathresult% The best estimate (default to middle of arc).
- \pgfmathloop%
- \pgfmathadd@{\s}{\e}%
- \pgfmathdivide@{\pgfmathresult}{2}%
- \let\p\pgfmathresult%
- \ifdim\p pt=\s pt\relax%
- \else
- \tkzmathanglebetweenpoints{#2}{%
- \pgfpointadd{#3}{%
- \pgf@x\xarcradius\relax%
- \pgfmathcos@{\p}%
- \pgf@x\pgfmathresult\pgf@x%
- \pgf@y\yarcradius\relax%
- \pgfmathsin@{\p}%
- \pgf@y\pgfmathresult\pgf@y%
- }%
- }%
- %
- % Hackery for when arc straddles zero.
- %
- \ifdim\ee pt<\ss pt\relax%
- \pgfmathadd@{\pgfmathresult}{180}%
- \pgfmathmod@{\pgfmathresult}{360}%
- \fi
- \let\q\pgfmathresult%
- %
- % More hackery...
- %
- \ifdim\x pt>335pt\relax%
- \ifdim\q pt<45pt\relax%
- \pgfmathadd@{\q}{360}%
- \let\q\pgfmathresult%
- \fi
- \fi
- \ifdim\x pt=\q pt% Found it!
- \pgfmathbreakloop% Breaks after current iteration is complete.
- \else
- \ifdim\x pt<\q pt\relax%
- \let\e\p%
- \else
- \let\s\p%
- \fi
- \fi
- \pgfmathsubtract@{\x}{\q}%
- \pgfmathabs@{\pgfmathresult}%
- %
- % Save the estimate if it is better than any previous estimate.
- %
- \ifdim\pgfmathresult pt<\m pt\relax%
- \let\m\pgfmathresult%
- \let\n\p%
- \fi
- \repeatpgfmathloop%
- \pgfpointadd{#3}{\pgfpointpolar{\n}{\xarcradius and \yarcradius}}%
- }%
-}
-
-% \tkzmathangleonellipse
-%
-% Find the angle corresponding to a point on the border of an ellispe.
-%
-% #1 - the point on the border.
-% #2 - the radii of the ellipse.
-%
-\def\tkzmathangleonellipse#1#2{%
- \begingroup
- \pgfmath@in@{and }{#2}%
- \ifpgfmath@in@%
- \pgf@polar@#2\@@%
- \else
- \pgf@polar@#2 and #2\@@%
- \fi
- \pgf@xa\pgf@x%
- \pgf@ya\pgf@y%
- \pgf@process{#1}%
- \ifdim\pgf@x=0pt\relax%
- \pgfutil@tempdima1pt\relax%
- \else
- \pgfutil@tempdima\pgf@x%
-%\pgfmathdivide@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgfutil@tempdima}}%
-\FPdiv\pgfmathresult{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgfutil@tempdima}}
-\FPround\pgfmathresult\pgfmathresult5\relax%
- \pgfutil@tempdima\pgfmathresult pt\relax%
- \fi
- \ifdim\pgf@y=0pt\relax%
- \pgfutil@tempdima1pt\relax%
- \else
- % \pgfmathdivide@{\pgfmath@tonumber{\pgf@y}}{\pgfmath@tonumber{\pgf@ya}}%
- \FPdiv\pgfmathresult{\pgfmath@tonumber{\pgf@y}}{%
- \pgfmath@tonumber{\pgf@ya}}%
- \FPround\pgfmathresult\pgfmathresult5\relax%
- \pgfutil@tempdima\pgfmathresult\pgfutil@tempdima%
- \pgfmathatan@{\pgfmath@tonumber{\pgfutil@tempdima}}%
- \fi
- %
- \pgfutil@tempdima\pgfmathresult pt\relax%
- \ifdim\pgfutil@tempdima<0pt\relax%
- \advance\pgfutil@tempdima360pt\relax%
- \fi
- \ifdim\pgf@x<0pt\relax%
- \ifdim\pgf@y=0pt\relax%
- \pgfutil@tempdima180pt\relax%
- \else
- \ifdim\pgf@y<0pt\relax%
- \advance\pgfutil@tempdima180pt\relax%
- \else
- \advance\pgfutil@tempdima-180pt\relax%
- \fi
- \fi
- \else
- \ifdim\pgf@x=0pt\relax%
- \ifdim\pgf@y<0pt\relax%
- \pgfutil@tempdima270pt\relax%
- \else
- \pgfutil@tempdima90pt\relax%
- \fi
- \else
- \ifdim\pgf@y=0pt\relax%
- \pgfutil@tempdima0pt\relax%
- \fi
- \fi
- \fi
- \pgfmath@returnone\pgfutil@tempdima%
- \endgroup
-}
-
-\def\tkzpointborderellipse#1#2{%
- \pgf@process{#2}%
- \pgf@xa=\pgf@x%
- \pgf@ya=\pgf@y%
- \ifdim\pgf@xa=\pgf@ya% circle. that's easy!
- \pgf@process{\pgfpointnormalised{#1}}%
- \pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
- \pgf@y=\pgf@sys@tonumber{\pgf@xa}\pgf@y%
- \else
- \ifdim\pgf@xa<\pgf@ya%
- % Ok, first, let's compute x/y:
- \c@pgf@countb=\pgf@ya%
- \divide\c@pgf@countb by65536\relax%
- \divide\pgf@x by\c@pgf@countb%
- \divide\pgf@y by\c@pgf@countb%
- \pgf@xc=\pgf@x%
- \pgf@yc=8192pt%
- \pgf@y=.125\pgf@y%
- \c@pgf@countb=\pgf@y%
- \divide\pgf@yc by\c@pgf@countb%
- \pgf@process{#1}%
- \pgf@y=\pgf@sys@tonumber{\pgf@yc}\pgf@y%
- \pgf@y=\pgf@sys@tonumber{\pgf@xc}\pgf@y%
- \pgf@process{\pgfpointnormalised{}}%
- \pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
- \pgf@y=\pgf@sys@tonumber{\pgf@ya}\pgf@y%
- \else
- % Ok, now let's compute y/x:
- \c@pgf@countb=\pgf@xa%
- \divide\c@pgf@countb by65536\relax%
- \divide\pgf@x by\c@pgf@countb%
- \divide\pgf@y by\c@pgf@countb%
- \pgf@yc=\pgf@y%
- \pgf@xc=8192pt%
- \pgf@x=.125\pgf@x%
- \c@pgf@countb=\pgf@x%
- \divide\pgf@xc by\c@pgf@countb%
- \pgf@process{#1}%
- \pgf@x=\pgf@sys@tonumber{\pgf@yc}\pgf@x%
- \pgf@x=\pgf@sys@tonumber{\pgf@xc}\pgf@x%
- \pgf@process{\pgfpointnormalised{}}%
- \pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x%
- \pgf@y=\pgf@sys@tonumber{\pgf@ya}\pgf@y%
- \fi
- \fi
-}
+% Schrodinger's cat idea 03/01/20
+\tikzset{xfp/.code={%
+\pgfmathdeclarefunction*{veclen}{2}{%
+\begingroup%
+ \pgfmath@x##1pt\relax%
+ \pgfmath@y##2pt\relax%
+ \edef\tkz@xfpMathLen{\fpeval{sqrt((\pgf@x)^2+(\pgf@y)^2)}}
+ \pgfmath@returnone\tkz@xfpMathLen pt%
+\endgroup%
+}}}
+ \makeatother
\endinput \ No newline at end of file