% tkz-tools-eu-math.tex
% Copyright 2022  Alain Matthes
% 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.
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.

\def\fileversion{4.03}
\def\filedate{2022/01/19} 
\typeout{2022/01/19 4.03 tkz-tools-eu-math.tex}     
\makeatletter
%<-------------------------------------------------------------------------->
% \tkzpointnormalised#
% tkzCalcLength
% \tkzGetLength
% \tkzpttocm
% \tkzcmtopt
% \tkzFindSlope
% option xfp

%  \tkzpointnormalised    normalise un point A-->A' tq ||v(OA')=1||
% Ã©quivalent de \pgfpointnormalised avec fp
% example
% \tkzpointnormalised{%
% \pgfpointdiff{\pgfpointanchor{A}{center}}
%              {\pgfpointanchor{B}{center}}}

% or
% \pgf@x=1 cm
% \pgf@y=12 cm 
% \tkzpointnormalised{}
%<--------------------------------------------------------------------------
\def\tkzpointnormalised#1{%
\pgf@process{#1}%
\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 xfp 
% \veclen mais avec fp 
%  option cm le résultat est en cm sinon en pt
%<-------------------------------------------------------------------------->
%\newif\iftkzLengthIncm \iftkzLengthIncmtrue
\pgfkeys{tkzcalclen/.cd,
       cm/.is if         = tkzLengthIncm,
       cm/.default       = true,
       cm                = true}   

\def\tkzCalcLength{\pgfutil@ifnextchar[{\tkz@CalcLength}{\tkz@CalcLength[]}}  
\def\tkz@CalcLength[#1](#2,#3){%
%\pgfkeys{tkzcalclen/.cd, cm = true}
\pgfqkeys{/tkzcalclen}{#1}%   
\begingroup
\tkz@@CalcLength(#2,#3){tkzLengthResult}
\iftkzLengthIncm 
   \pgfmathparse{\tkzLengthResult 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}}%
\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\tkz@@CalcLengthcm(#1,#2)#3{%
\pgfpointdiff{\pgfpointanchor{#1}{center}}%
             {\pgfpointanchor{#2}{center}}%
\edef\tkz@xfpMathLen{\fpeval{sqrt((\pgf@x)^2+(\pgf@y)^2)}}
\edef\tkz@xfpMathLen{\fpeval{round(\tkz@xfpMathLen,5)}}
\pgfmathparse{\tkz@xfpMathLen pt/1cm}
\edef\tkz@xfpMathLen{\fpeval{round(\pgfmathresult,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
%<-------------------------------------------------------------------------->
\def\tkzpttocm(#1)#2{%
\begingroup  
  \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
%<--------------------------------------------------------------------------
\def\tkzcmtopt(#1)#2{%
\begingroup 
   \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  
}% 

%  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