% tkz-obj-eu-points-rnd.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-obj-el-points-rnd.tex} 
%<--------------------------------------------------------------------------–>
\makeatletter
%<-------------------------------------------------------------------------–>
%  Points aléatoires sur un segment, une droite, une demi-droite un cercle 
%<--------------------------------------------------------------------------–>
%                          les points aléatoires
%<--------------------------------------------------------------------------–>
\def\tkz@numrp{0}
\pgfkeys{/@tkzDefRandPoint/.cd,
      rectangle/.code args        = {#1 and #2}{\def\tkz@numrp{0}%
                                               \def\tkz@infl{#1}%
                                               \def\tkz@supr{#2}},
      segment/.code  args         = {#1--#2}{\def\tkz@numrp{1}%
                                             \def\tkz@start{#1}%
                                             \def\tkz@end{#2}}, 
      line/.code args             = {#1--#2}{\def\tkz@numrp{2}%
                                             \def\tkz@start{#1}%
                                             \def\tkz@end{#2}},  
      circle/.code args           = {center #1 radius #2}{\def\tkz@numrp{3}%
                                                          \def\tkz@center{#1}
                                                          \def\tkz@rad{#2}},
      circle through/.code args   = {center #1 through #2}{\def\tkz@numrp{4}%
                                                      \def\tkz@center{#1}
                                                      \def\tkz@point{#2}},
      disk through/.code args     = {center #1 through #2}{\def\tkz@numrp{5}%
                                                      \def\tkz@center{#1}
                                                      \def\tkz@point{#2}},
}
%<------------------------ version 2019 ---------------------------------->
\def\tkzDefRandPointOn{\pgfutil@ifnextchar[{\tkz@DefRandPointOn}{%
           \tkz@DefRandPointOn[]}}
\def\tkz@DefRandPointOn[#1]{%
\begingroup 
\pgfqkeys{/@tkzDefRandPoint}{#1}
\ifcase\tkz@numrp%
 % first case 0
   \tkzRandPointOnRect(\tkz@infl,\tkz@supr)
  \or% 1
   \tkzRandPointOnSegment(\tkz@start,\tkz@end)
  \or% 2
   \tkzRandPointOnLine(\tkz@start,\tkz@end)
  \or% 3
   \tkzRandPointOnCircle(\tkz@center,\tkz@rad)
  \or% 4
   \tkzRandPointOnCircleThrough(\tkz@center,\tkz@point)
   \or% 5
  \tkzRandPointOnDisk(\tkz@center,\tkz@point)
\fi
\endgroup
}
%<--------------------------------------------------------------------------–>
\def\tkzRandPointOnRect(#1,#2){% 
\tkz@@extractxy{#1}
 \pgf@xa=\pgf@x\relax%
 \pgf@ya=\pgf@y\relax%   
 \tkz@@extractxy{#2}
 \pgf@xb=\pgf@x\relax%
 \pgf@yb=\pgf@y\relax%  
 \edef\tkz@a{\fpeval{\pgf@xb-\pgf@xa}}
 \edef\tkz@b{\fpeval{\pgf@yb-\pgf@ya}}      
 \pgfmathparse{rnd}\global\let\tkzrndone\pgfmathresult 
 \pgfmathparse{rnd}\global\let\tkzrndtwo\pgfmathresult  
 \path[coordinate] ($(#1)+(\tkzrndone*\tkz@a pt,\tkzrndtwo*\tkz@b pt)$) coordinate (tkzPointResult);
   } 
%<--------------------------------------------------------------------------–>
\def\tkzRandPointOnSegment(#1,#2){% 
  \pgfmathparse{rnd}
  \let\myrnd\pgfmathresult 
\path[coordinate]  ($ (#1)!\myrnd!(#2) $) coordinate (tkzPointResult);
} 
%<--------------------------------------------------------------------------–>
\def\tkzRandPointOnLine(#1,#2){% 
  \pgfmathparse{rand}
  \let\myrnd\pgfmathresult 
\path[coordinate]  ($ (#1)!\myrnd!(#2) $) coordinate (tkzPointResult);
}
%<--------------------------------------------------------------------------–>
\def\tkzRandPointOnCircle(#1,#2){% 
\pgfmathrandominteger{\tkzrnd}{0}{360}
\tkz@ax#2cm %
  \edef\tkz@pxa{\fpeval{\tkz@ax*cosd(\tkzrnd)}}
  \edef\tkz@pxb{\fpeval{\tkz@ax*sind(\tkzrnd)}}      
  \path[coordinate]($(#1) + (\tkz@pxa pt,\tkz@pxb pt) $) coordinate (tkzPointResult);
}
\def\tkzRandPointOnCircleThrough(#1,#2){% 
\pgfmathrandominteger{\tkzrnd}{0}{360}
\tkz@@CalcLength(#1,#2){tkzLengthResult}
  \edef\tkz@pxa{\fpeval{\tkzLengthResult*cosd(\tkzrnd)}}
  \edef\tkz@pxb{\fpeval{\tkzLengthResult*sind(\tkzrnd)}} 
\path[coordinate]($(#1) + (\tkz@pxa pt ,\tkz@pxb pt) $) coordinate (tkzPointResult);
}
%<--------------------------------------------------------------------------–>
\def\tkzRandPointOnDisk(#1,#2){% 
  \pgfmathrandominteger{\tkzrnd}{0}{360}
  \tkz@@CalcLength(#1,#2){tkzLengthResult}
  \edef\tkz@pxa{\fpeval{\tkzLengthResult*cosd(\tkzrnd)}}
  \edef\tkz@pxb{\fpeval{\tkzLengthResult*sind(\tkzrnd)}}  
  \path[coordinate]($(#1) + (\tkz@pxa pt ,\tkz@pxb pt) $) coordinate (tkz@tmp);
  \pgfmathparse{rnd}
  \let\myrnd\pgfmathresult 
  \path[coordinate]  ($ (#1)!\myrnd!(tkz@tmp) $) coordinate (tkzPointResult);
}
\makeatother  
\endinput