% tkz-obj-eu-points-rnd.tex
% Copyright 2020 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{3.02c}
\def\filedate{2020/01/24} 
\typeout{2020/01/24 3.02c  tkz-obj-eu-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#2 %
	\edef\tkz@xa{\fpeval{\tkz@ax*cosd(\tkzrnd)}}
	\edef\tkz@xb{\fpeval{\tkz@ax*sind(\tkzrnd)}}      
  \path[coordinate]($(#1) + (\tkz@xa pt,\tkz@xb pt) $) coordinate (tkzPointResult);
}
\def\tkzRandPointOnCircleThrough(#1,#2){% 
\pgfmathrandominteger{\tkzrnd}{0}{360}
\tkzCalcLength(#1,#2)
	\edef\tkz@xa{\fpeval{\tkzLengthResult*cosd(\tkzrnd)}}
	\edef\tkz@xb{\fpeval{\tkzLengthResult*sind(\tkzrnd)}} 
\path[coordinate]($(#1) + (\tkz@xa pt ,\tkz@xb pt) $) coordinate (tkzPointResult);
}
%<--------------------------------------------------------------------------–>
\def\tkzRandPointOnDisk(#1,#2){% 
  \pgfmathrandominteger{\tkzrnd}{0}{360}
  \tkzCalcLength(#1,#2)
  \edef\tkz@xa{\fpeval{\tkzLengthResult*cosd(\tkzrnd)}}
  \edef\tkz@xb{\fpeval{\tkzLengthResult*sind(\tkzrnd)}}  
  \path[coordinate]($(#1) + (\tkz@xa pt ,\tkz@xb pt) $) coordinate (tkz@tmp);
  \pgfmathparse{rnd}
  \let\myrnd\pgfmathresult 
  \path[coordinate]  ($ (#1)!\myrnd!(tkz@tmp) $) coordinate (tkzPointResult);
}
\makeatother  
\endinput