% 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 c}
\def\filedate{2011/06/01}   

%<--------------------------------------------------------------------------–>
%                 intersection  de deux lignes
%<--------------------------------------------------------------------------–>
\def\tkzInterLL(#1,#2)(#3,#4){% méthode avec FP
\tkz@InterLL(#1,#2)(#3,#4){tkzPointResult}
}
% méthode with tikz
\def\tkz@InterLL(#1,#2)(#3,#4)#5{%
%\path (intersection of #1--#2 and #3--#4) coordinate(#5);%
\pgfextractx{\pgf@x}{\pgfpointanchor{#1}{center}}
\pgfextracty{\pgf@y}{\pgfpointanchor{#1}{center}} 
\tkz@ax\pgf@x %
\tkz@ay\pgf@y %
\pgfextractx{\pgf@x}{\pgfpointanchor{#2}{center}}
\pgfextracty{\pgf@y}{\pgfpointanchor{#2}{center}} 
\tkz@bx\pgf@x %
\tkz@by\pgf@y %
\pgfextractx{\pgf@x}{\pgfpointanchor{#3}{center}}
\pgfextracty{\pgf@y}{\pgfpointanchor{#3}{center}} 
\tkz@cx\pgf@x %
\tkz@cy\pgf@y %
\pgfextractx{\pgf@x}{\pgfpointanchor{#4}{center}}
\pgfextracty{\pgf@y}{\pgfpointanchor{#4}{center}} 
\tkz@dx\pgf@x %
\tkz@dy\pgf@y %
\FPeval\tkz@deltax{\pgf@sys@tonumber{\tkz@ax}-\pgf@sys@tonumber{\tkz@bx}}
\FPdiv\tkz@deltax{\tkz@deltax}{28.45274}
\FPeval\tkz@deltaxx{\pgf@sys@tonumber{\tkz@cx}-\pgf@sys@tonumber{\tkz@dx}}
\FPdiv\tkz@deltaxx{\tkz@deltaxx}{28.45274}
\FPeval\tkz@deltay{\pgf@sys@tonumber{\tkz@ay}-\pgf@sys@tonumber{\tkz@by}}
\FPdiv\tkz@deltay{\tkz@deltay}{28.45274}
\FPeval\tkz@deltayy{\pgf@sys@tonumber{\tkz@cy}-\pgf@sys@tonumber{\tkz@dy}}
\FPdiv\tkz@deltayy{\tkz@deltayy}{28.45274}
\FPeval\tkz@deltaxy{(\pgf@sys@tonumber{\tkz@ax}*\pgf@sys@tonumber{\tkz@by})-(\pgf@sys@tonumber{\tkz@ay}*\pgf@sys@tonumber{\tkz@bx})}
\FPdiv\tkz@deltaxy{\tkz@deltaxy}{28.45274}
\FPdiv\tkz@deltaxy{\tkz@deltaxy}{28.45274}
\FPeval\tkz@deltaxxyy{(\pgf@sys@tonumber{\tkz@cx}*\pgf@sys@tonumber{\tkz@dy})-(\pgf@sys@tonumber{\tkz@cy}*\pgf@sys@tonumber{\tkz@dx})}
\FPdiv\tkz@deltaxxyy{\tkz@deltaxxyy}{28.45274}
\FPdiv\tkz@deltaxxyy{\tkz@deltaxxyy}{28.45274}
\FPeval\tkz@div{(\tkz@deltax*\tkz@deltayy)-(\tkz@deltay*\tkz@deltaxx)}
\FPeval\tkz@numx{(\tkz@deltaxy*\tkz@deltaxx)-(\tkz@deltax*\tkz@deltaxxyy)}
\FPeval\tkz@numy{(\tkz@deltaxy*\tkz@deltayy)-(\tkz@deltay*\tkz@deltaxxyy)}
\FPdiv\tkz@xs{\tkz@numx}{\tkz@div}
\FPdiv\tkz@ys{\tkz@numy}{\tkz@div}
\FPround\tkz@xs{\tkz@xs}{5}
\FPround\tkz@ys{\tkz@ys}{5}
\path[coordinate](\tkz@xs,\tkz@ys) coordinate (#5);
}
%<--------------------------------------------------------------------------–>
%                 intersection  de Ligne Cercle rayon connu
%<--------------------------------------------------------------------------–>
% /*
%    Calculate the intersection of a ray and a sphere
%    The line segment is defined from p1 to p2
%    The sphere is of radius r and centered at sc
%    There are potentially two points of intersection given by
%    p = p1 + mu1 (p2 - p1)
%    p = p1 + mu2 (p2 - p1)
%    Return FALSE if the ray doesn't intersect the sphere.
% */
% int RaySphere(XYZ p1,XYZ p2,XYZ sc,double r,double *mu1,double *mu2)
% {
%    double a,b,c;
%    double bb4ac;
%    XYZ dp;
% 
%    dp.x = p2.x - p1.x;
%    dp.y = p2.y - p1.y;
%    dp.z = p2.z - p1.z;
%    a = dp.x * dp.x + dp.y * dp.y + dp.z * dp.z;
%    b = 2 * (dp.x * (p1.x - sc.x) + dp.y * (p1.y - sc.y) + dp.z * (p1.z - sc.z));
%    c = sc.x * sc.x + sc.y * sc.y + sc.z * sc.z;
%    c += p1.x * p1.x + p1.y * p1.y + p1.z * p1.z;
%    c -= 2 * (sc.x * p1.x + sc.y * p1.y + sc.z * p1.z);
%    c -= r * r;
%    bb4ac = b * b - 4 * a * c;
%    if (ABS(a) < EPS || bb4ac < 0) {
%       *mu1 = 0;
%       *mu2 = 0;
%       return(FALSE);
%    }
% 
%    *mu1 = (-b + sqrt(bb4ac)) / (2 * a);
%    *mu2 = (-b - sqrt(bb4ac)) / (2 * a);
% 
%    return(TRUE);
% }
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkz@numlc{0}
\pgfkeys{
/linecircle/.cd,
 node/.code          = \def\tkz@numlc{0},
 R/.code             = \def\tkz@numlc{1}, 
 with nodes/.code    = \def\tkz@numlc{2}  
 }
%<--------------------------------------------------------------------------–>
\def\tkzInterLC{\pgfutil@ifnextchar[{\tkz@InterLC}{%
                                     \tkz@InterLC[]}}
\def\tkz@InterLC[#1](#2,#3)(#4,#5){%
\begingroup      
\pgfkeys{/linecircle/.cd,node}
\pgfqkeys{/linecircle}{#1}
\ifcase\tkz@numlc%
 % first case 0
\tkzCalcLength(#4,#5)
\tkzInterLCR(#2,#3)(#4,\tkzLengthResult pt){%
             tkzFirstPointResult}{tkzSecondPointResult}
  \or% 1
\tkzInterLCR(#2,#3)(#4,#5){tkzFirstPointResult}{tkzSecondPointResult}%  
  \or% 2
\tkzInterLCWithNodes(#2,#3)(#4,#5){tkzFirstPointResult}{tkzSecondPointResult}% 
\fi    
\endgroup
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
\def\tkzInterLCR(#1,#2)(#3,#4)#5#6{%
\begingroup
  \tkz@radi=#4%
  \tkz@@extractxy{#3}
  \tkz@bx =\pgf@x\relax%
  \tkz@by =\pgf@y\relax%
  \tkz@Projection(#1,#2)(#3){tkz@pth}
  \tkz@@CalcLength(#3,tkz@pth){tkz@mathLen}
   \ifdim\tkz@mathLen pt<0.05pt\relax%
          \pgfpointdiff{\pgfpointanchor{#1}{center}}%
                       {\pgfpointanchor{#2}{center}}%
          \tkz@ax=\pgf@x%
          \tkz@ay=\pgf@y%
          \tkzpointborderellipse{\pgfpoint{\tkz@ax}{\tkz@ay}}%
                                {\pgfpoint{\tkz@radi}{\tkz@radi}}
          \tkz@ax=\pgf@x\relax%
          \tkz@ay=\pgf@y\relax%
          \advance\tkz@bx by\tkz@ax\relax%
          \advance\tkz@by by\tkz@ay\relax%
          \path[coordinate] (\tkz@bx,\tkz@by) coordinate (#6);
          \tkzCSym(#3)(#6){#5} 
    \else  
       \FPdiv\pgfmathresult{\tkz@mathLen}{\pgfmath@tonumber{\tkz@radi}}
       %\pgfmathparse{\tkz@mathLen / \tkz@radi}
          \pgfmathacos@{\pgfmathresult}%
          \let\tkz@angle\pgfmathresult%
          \pgfpointdiff{\pgfpointanchor{#3}{center}}%
                       {\pgfpointanchor{tkz@pth}{center}}%
          \tkz@ax=\pgf@x%
          \tkz@ay=\pgf@y%  
          \tkzpointborderellipse{\pgfpoint{\tkz@ax}{\tkz@ay}}%
                                {\pgfpoint{\tkz@radi}{\tkz@radi}}
          \tkz@ax =\pgf@x\relax%
          \tkz@ay =\pgf@y\relax%
          \advance\tkz@bx by\tkz@ax\relax%
          \advance\tkz@by by\tkz@ay\relax%
          \tkz@@extractxy{#3}
          \tkz@ax =\pgf@x\relax%
          \tkz@ay =\pgf@y\relax%
          \tkz@@extractxy{tkz@pth}
          %\ifdim\pgf@y<\tkz@ay \edef\tkz@angle{-\tkz@angle}%
         % \fi
          \tkzmathrotatepointaround{\pgfpoint{\tkz@bx}{\tkz@by}}%
                                   {\pgfpoint{\tkz@ax}{\tkz@ay}}%
                                   {\tkz@angle}
          \path[coordinate] (\pgf@x,\pgf@y) coordinate (#5);
          \tkzmathrotatepointaround{\pgfpoint{\tkz@bx}{\tkz@by}}%
                                   {\pgfpoint{\tkz@ax}{\tkz@ay}}%
                                   {-\tkz@angle}
           \path[coordinate] (\pgf@x,\pgf@y) coordinate (#6); 
  \fi        
    \endgroup
}
%<--------------------------------------------------------------------------–>
%                 intersection  de Ligne Cercle 
% #4 center #5 point sur le cercle
%<--------------------------------------------------------------------------–>
% \def\tkzInterLC(#1,#2)(#3,#4)#5#6{%
%     \begingroup
%     \tkzCalcLength(#3,#4)\tkzGetLength{tkz@rad}
%     \tkzInterLCR(#1,#2)(#3,\tkz@rad pt){#5}{#6}
% \endgroup
% } 
%<--------------------------------------------------------------------------–>
%                 intersection  de Ligne Cercle rayon inconnu
%<--------------------------------------------------------------------------–>
\def\tkzInterLCWithNodes(#1,#2)(#3,#4,#5)#6#7{%
\begingroup
    \tkzCalcLength(#4,#5)\tkzGetLength{tkz@radius}
    \tkzInterLCR(#1,#2)(#3,\tkz@radius pt){#6}{#7}
\endgroup
}
%<--------------------------------------------------------------------------–>
%    Intersection de deux cercles  
%<--------------------------------------------------------------------------–>
\def\tkz@numcc{0}
\pgfkeys{
/circlecircle/.cd,
 node/.code          = {\global\def\tkz@numcc{0}},
 R/.code             = {\global\def\tkz@numcc{1}},
 with nodes/.code    = {\global\def\tkz@numcc{2}} 
}
%<--------------------------------------------------------------------------–>
\def\tkzInterCC{\pgfutil@ifnextchar[{\tkz@InterCC}{%
                                     \tkz@InterCC[]}}
\def\tkz@InterCC[#1](#2,#3)(#4,#5){%
\begingroup      
\pgfkeys{/circlecircle/.cd,node}
\pgfqkeys{/circlecircle}{#1}
\ifcase\tkz@numcc%
 % first case 0 
\tkz@save@length 
  \tkzCalcLength(#2,#3)\tkzGetLength{tkz@rayA}
  \tkzCalcLength(#4,#5)\tkzGetLength{tkz@rayB}
\tkz@restore@length     
  \tkzInterCCR(#2,\tkz@rayA pt)(#4,\tkz@rayB pt){tkzFirstPointResult}{%
                                                 tkzSecondPointResult}   
  \or% 1
   \tkzInterCCR(#2,#3)(#4,#5){tkzFirstPointResult}{tkzSecondPointResult}%
   \or%2
\tkzInterCCWithNodes(#2,#3)(#4,#5){tkzFirstPointResult}{tkzSecondPointResult}    
     \fi   
\endgroup
} 
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>

% méthode
% /* circle_circle_intersection() *
%  * Determine the points where 2 circles in a common plane intersect.
%  *
%  * int circle_circle_intersection(
%  *                                // center and radius of 1st circle
%  *                                double x0, double y0, double r0,
%  *                                // center and radius of 2nd circle
%  *                                double x1, double y1, double r1,
%  *                                // 1st intersection point      
%  *                                // 2nd intersection point
%  *
%  * This is a public domain work. 3/26/2005 Tim Voght
%  *
% int circle_circle_intersection(double x0, double y0, double r0,
%                                double x1, double y1, double r1,
%                                double *xi, double *yi,
%                                double *xi_prime, double *yi_prime)
% {
%   double a, dx, dy, d, h, rx, ry;
%   double x2, y2;
% 
%   /* dx and dy are the vertical and horizontal distances between
%    * the circle centers.
%    */
%   dx = x1 - x0;
%   dy = y1 - y0;
% 
%   /* Determine the straight-line distance between the centers. */
%   //d = sqrt((dy*dy) + (dx*dx));
%   d = hypot(dx,dy); // Suggested by Keith Briggs
% 
%   /* Check for solvability. */
%   if (d > (r0 + r1))
%   {
%     /* no solution. circles do not intersect. */
%     return 0;
%   }
%   if (d < fabs(r0 - r1))
%   {
%     /* no solution. one circle is contained in the other */
%     return 0;
%   }
% 
%   /* 'point 2' is the point where the line through the circle
%    * intersection points crosses the line between the circle
%    * centers.  
%    */
% 
%   /* Determine the distance from point 0 to point 2. */
%   a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;
% 
%   /* Determine the coordinates of point 2. */
%   x2 = x0 + (dx * a/d);
%   y2 = y0 + (dy * a/d);
% 
%   /* Determine the distance from point 2 to either of the
%    * intersection points.
%    */
%   h = sqrt((r0*r0) - (a*a));
% 
%   /* Now determine the offsets of the intersection points from
%    * point 2.
%    */
%   rx = -dy * (h/d);
%   ry = dx * (h/d);
% 
%   /* Determine the absolute intersection points. */
%   *xi = x2 + rx;
%   *xi_prime = x2 - rx;
%   *yi = y2 + ry;
%   *yi_prime = y2 - ry;
% 
%   return 1;
% } 

\def\tkzInterCCR(#1,#2)(#3,#4)#5#6{%
\begingroup
\tkz@save@length  
\tkzCalcLength(#1,#3)\tkzGetLength{tkz@dd}
\tkz@restore@length 
\pgfextractx{\pgf@x}{\pgfpointanchor{#1}{center}}
\pgfextracty{\pgf@y}{\pgfpointanchor{#1}{center}} 
\tkz@ax\pgf@x %
\tkz@ay\pgf@y %
\pgfextractx{\pgf@x}{\pgfpointanchor{#3}{center}}
\pgfextracty{\pgf@y}{\pgfpointanchor{#3}{center}} 
\tkz@bx\pgf@x %
\tkz@by\pgf@y %
\tkz@cx#2 %
\tkz@cy#4 %
\FPeval\tkz@aa{((\pgf@sys@tonumber{\tkz@cx}+\pgf@sys@tonumber{\tkz@cy})/(2*\tkz@dd))*(\pgf@sys@tonumber{\tkz@cx}-\pgf@sys@tonumber{\tkz@cy})+\tkz@dd/2}

\FPeval\tkz@xx{\pgf@sys@tonumber{\tkz@ax}+\tkz@aa/\tkz@dd*(\pgf@sys@tonumber{\tkz@bx} - \pgf@sys@tonumber{\tkz@ax})}
\FPeval\tkz@yy{\pgf@sys@tonumber{\tkz@ay}+\tkz@aa/\tkz@dd*(\pgf@sys@tonumber{\tkz@by} - \pgf@sys@tonumber{\tkz@ay})}   
\path[coordinate](\tkz@xx pt,\tkz@yy pt) coordinate (tkzRadialCenter);
\FPeval\tkz@hh{(\pgf@sys@tonumber{\tkz@cx}+\tkz@aa)*(\pgf@sys@tonumber{\tkz@cx}-\tkz@aa)}
\FPpow\tkz@hh{\tkz@hh}{0.5}
\FPeval\tkz@rx{\tkz@hh / \tkz@dd * (\pgf@sys@tonumber{\tkz@ay} - \pgf@sys@tonumber{\tkz@by}) } 
\FPeval\tkz@ry{\tkz@hh / \tkz@dd * (\pgf@sys@tonumber{\tkz@bx} - \pgf@sys@tonumber{\tkz@ax}) }
\FPadd\tkz@xs{\tkz@xx}{\tkz@rx }
\FPadd\tkz@ys{\tkz@yy}{\tkz@ry }
\path[coordinate](\tkz@xs pt,\tkz@ys pt) coordinate (#5);
\FPadd\tkz@xss{\tkz@xx}{-\tkz@rx }
\FPadd\tkz@yss{\tkz@yy}{-\tkz@ry }
\path[coordinate](\tkz@xss pt,\tkz@yss pt) coordinate (#6);  
\endgroup
}
%<--------------------------------------------------------------------------–>
% #2 node #3 node #4 node #5 node
% \def\tkzInterCC(#1,#2)(#3,#4)#5#6{%
% \begingroup
%   \tkzCalcLength(#1,#2)\tkzGetLength{tkz@rayA}
%   \tkzCalcLength(#3,#4)\tkzGetLength{tkz@rayB}
%   \tkzInterCCR(#1,\tkz@rayA pt)(#3,\tkz@rayB pt){#5}{#6}
% \endgroup
% }  
%<--------------------------------------------------------------------------–>
%    Intersection de deux cercles   Avec deux points
%<--------------------------------------------------------------------------–>
% la première variante devrait être #2 #3  avec #4 #5
\def\tkzInterCCWithNodes(#1,#2,#3)(#4,#5,#6)#7#8{%
\begingroup
  \tkzCalcLength(#2,#3)\tkzGetLength{tkz@rayA}
  \tkzCalcLength(#5,#6)\tkzGetLength{tkz@rayB}
  \tkzInterCCR(#1,\tkz@rayA pt)(#4,\tkz@rayB pt){#7}{#8}
\endgroup
}

%<--------------------------------------------------------------------------–>
%    tangente à cercle passant par un point donné
%<--------------------------------------------------------------------------–>
\def\tkzTgtFromPR(#1,#2)(#3){%
    \begingroup
    \tkzDefMidPoint(#1,#3) 
    \tkzCalcLength(tkzPointResult,#1)
    \tkzInterCCR(#1,#2)(tkzPointResult,\tkzLengthResult pt){%
    tkzFirstPointResult}{%
    tkzSecondPointResult}%
    \endgroup
}

\def\tkzTgtFromP(#1,#2)(#3){%
    \begingroup
    \tkzDefMidPoint(#1,#3) 
    \tkzCalcLength(#1,#2)\tkzGetLength{tkz@radone}%
    \tkzCalcLength(tkzPointResult,#1)\tkzGetLength{tkz@radtwo}%
    \tkzInterCCR(#1,\tkz@radone pt)(tkzPointResult,\tkz@radtwo pt){%
    tkzFirstPointResult}{%
    tkzSecondPointResult}%
    \endgroup
}     
\def\tkzTgtAt(#1)(#2){%
\begingroup
     \tkz@VecKOrthNorm[-1](#2,#1){tkzPointResult}
 \endgroup
} %<--------------------------------------------------------------------------–> %<--------------------------------------------------------------------------–>
\def\tkz@numtang{0}
\pgfkeys{
/tang/.cd,
at/.code          = {\global\def\tkz@numtang{0}\global\def\tkz@ptat{#1}},
from/.code        = {\global\def\tkz@numtang{1}\global\def\tkz@ptfrom{#1}},
from with R/.code = {\global\def\tkz@numtang{2}\global\def\tkz@ptfrom{#1}}}
%<--------------------------------------------------------------------------–>
\def\tkzTangent{\pgfutil@ifnextchar[{\tkz@Tangent}{\tkz@Tangent[]}}

\def\tkz@Tangent[#1](#2){%
\begingroup
\pgfkeys{tang/.cd}
\pgfqkeys{/tang}{#1}
\ifcase\tkz@numtang
    \tkzTgtAt(#2)(\tkz@ptat)
\or
   \tkzTgtFromP(#2)(\tkz@ptfrom)
 \or
   \tkzTgtFromPR(#2)(\tkz@ptfrom)
\fi 
\endgroup
}   

\endinput