% tkz-obj-eu-triangles.tex
% Copyright 2019 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-triangles.tex} 
\makeatletter  
%<--------------------------------------------------------------------------–>
%                       Triangle Equilateral
%<--------------------------------------------------------------------------–>
\def\tkzDefEquilateral(#1,#2){
\begingroup
\tkzDefMidPoint(#1,#2)
 \tkzURotateAngle(#1,60)(#2)
\endgroup
}
%<--------------------------------------------------------------------------–>

\def\tkzDrawEquilateral{\pgfutil@ifnextchar[{\tkz@Equilateral}{%
                                         \tkz@Equilateral[]}} 

\def\tkz@Equilateral[#1](#2,#3){%
\begingroup
    \tkzURotateAngle(#2,60)(#3)
    \tkzDrawPolygon[#1](#2,#3,tkzPointResult)
\endgroup
}
%<--------------------------------------------------------------------------–>
%                       Triangle OneTwo
%<--------------------------------------------------------------------------–>
\def\tkzPhi{1.618034}
\def\tkzInvPhi{0.618034}
\def\tkzSqrtPhi{1.27202}

\def\tkzDefTwoOne(#1,#2){
\begingroup
 \tkzVecKOrth[-.5](#2,#1)
 \endgroup
}
\def\tkzDefPythagore(#1,#2){
\begingroup
 \tkzVecKOrth[-0.75](#2,#1) 
\endgroup
}
\def\tkzDefSchoolTriangle(#1,#2){
\begingroup
 \tkzVecKOrth[-1](#2,#1) 
 \pgfnodealias{tkz@a}{tkzPointResult}
 \tkzURotateAngle(#1,30)(#2)
 \tkzInterLL(#1,tkzPointResult)(#2,tkz@a)
\endgroup
}
\def\tkzDefGoldTriangle(#1,#2){
\begingroup
 \tkzURotateAngle(#1,36)(#2)
\endgroup
}
\def\tkzDefEuclideTriangle(#1,#2){
\begingroup
 \tkzURotateAngle(#1,72)(#2)
 \tkzUHomo(#1,\tkzPhi)(tkzPointResult)
\endgroup
}
\def\tkzDefGoldenTriangle(#1,#2){
\begingroup
 \tkzVecKOrth[-\tkzInvPhi](#2,#1)
\endgroup
}
\def\tkzDefCheopsTriangle(#1,#2){
\begingroup
\tkzDefMidPoint(#1,#2)
 \tkzVecKOrth[-\tkzSqrtPhi](tkzPointResult,#1)
\endgroup
}
\def\tkzDefTwoAnglesTriangle(#1,#2){
\begingroup
 \tkzURotateAngle(#1,\tkz@alpha)(#2)
 \pgfnodealias{tkz@pta}{tkzPointResult}
 \tkzURotateAngle(#2,-\tkz@beta)(#1)
 \pgfnodealias{tkz@ptb}{tkzPointResult}
 \tkzInterLL(#1,tkz@pta)(#2,tkz@ptb)
\endgroup
}
%<--------------------------------------------------------------------------–>
%                       Triangles
%<--------------------------------------------------------------------------–>

\def\tkz@numtr{0}
\pgfkeys{%
      /deftriangle/.cd,
      equilateral/.code       = \def\tkz@numtr{0},
      half/.code              = \def\tkz@numtr{1},
      pythagore/.code         = \def\tkz@numtr{2},
      school/.code            = \def\tkz@numtr{3},
      golden/.code            = \def\tkz@numtr{4},
      sublime/.code           = \def\tkz@numtr{4},
      euclide/.code           = \def\tkz@numtr{5},
      gold/.code              = \def\tkz@numtr{6},
      cheops/.code            = \def\tkz@numtr{7},
      two angles/.code  args  = {#1 and #2} { \def\tkz@numtr{8}%
                                              \def\tkz@alpha{#1}%
                                             \def\tkz@beta{#2}},
     equilateral
} 

\def\tkzDefTriangle{\pgfutil@ifnextchar[{\tkz@DefTriangle}{\tkz@DefTriangle[]}}
\def\tkz@DefTriangle[#1](#2,#3){% 
\begingroup
\pgfkeys{/deftriangle/.cd,equilateral}   
\pgfqkeys{/deftriangle}{#1}  
\ifcase\tkz@numtr%
  \tkzDefEquilateral(#2,#3)
  \or% 1 
  \tkzDefTwoOne(#2,#3)  
  \or% 2
  \tkzDefPythagore(#2,#3)
  \or% 3
  \tkzDefSchoolTriangle(#2,#3)
  \or% 4
  \tkzDefGoldenTriangle(#2,#3)
  \or% 5
  \tkzDefEuclideTriangle(#2,#3)
  \or% 6
  \tkzDefGoldTriangle(#2,#3) 
  \or% 7
  \tkzDefCheopsTriangle(#2,#3)  
  \or% 8
  \tkzDefTwoAnglesTriangle(#2,#3)  \fi    
\endgroup
}
%<--------------------------------------------------------------------------–>
%                       Draw Triangles
%<--------------------------------------------------------------------------–>

\def\tkz@numdtr{0}
\pgfkeys{/drawtriangle/.cd,
      equilateral/.code         = {\def\tkz@numdtr{0}},
      half/.code                = {\def\tkz@numdtr{1}},
      pythagore/.code           = {\def\tkz@numdtr{2}},
      school/.code              = {\def\tkz@numdtr{3}},
      golden/.code              = {\def\tkz@numdtr{4}},
      sublime/.code             = {\def\tkz@numdtr{4}},
      euclide/.code             = {\def\tkz@numdtr{5}},
      gold/.code                = {\def\tkz@numdtr{6}},
      cheops/.code              = {\def\tkz@numdtr{7}},
      two angles/.code  args    = {#1 and #2}{\def\tkz@numdtr{8}%
                                              \def\tkz@alpha{#1}%
                                              \def\tkz@beta{#2}},
      equilateral,
   /drawtriangle/.search also={/tikz}
} 

\def\tkzDrawTriangle{\pgfutil@ifnextchar[{\tkz@DrawTriangle}{%
                                         \tkz@DrawTriangle[]}}
\def\tkz@DrawTriangle[#1](#2,#3){% 
\begingroup
\pgfkeys{/drawtriangle/.cd,equilateral}   
\pgfqkeys{/drawtriangle}{#1}  
\ifcase\tkz@numdtr%
   \tkzDefEquilateral(#2,#3)
\or% 1
   \tkzDefTwoOne(#2,#3)
\or% 2
   \tkzDefPythagore(#2,#3)
\or% 3
   \tkzDefSchoolTriangle(#2,#3)
\or% 4
   \tkzDefGoldenTriangle(#2,#3)
\or% 5
   \tkzDefEuclideTriangle(#2,#3)
\or% 6
   \tkzDefGoldTriangle(#2,#3) 
\or% 7
   \tkzDefCheopsTriangle(#2,#3)  
\or% 8
   \tkzDefTwoAnglesTriangle(#2,#3)  
\fi
 \draw[/drawtriangle/.cd,line style,#1] (#2)--(#3)--(tkzPointResult)--cycle;  
\endgroup
}

%<--------------------------------------------------------------------------–>
%              les triangles sspécifiques
%<--------------------------------------------------------------------------–>

%<--------------------------------------------------------------------------– 
\def\tkz@numtspc{0}
\pgfkeys{/tkzDefSpcTriangle/.cd,
      in/.code                       = \def\tkz@numtspc{0},
      incentral/.code                = \def\tkz@numtspc{0},
      ex/.code                       = \def\tkz@numtspc{1},
      excentral/.code                = \def\tkz@numtspc{1},
      extouch/.code                  = \def\tkz@numtspc{2},
      intouch/.code                  = \def\tkz@numtspc{3},
      contact/.code                  = \def\tkz@numtspc{3},
      centroid/.code                 = \def\tkz@numtspc{4},
      medial/.code                   = \def\tkz@numtspc{4},
      orthic/.code                   = \def\tkz@numtspc{5},
      ortho/.code                    = \def\tkz@numtspc{5},
      feuerbach/.code                = \def\tkz@numtspc{6},
      euler/.code                    = \def\tkz@numtspc{7},
      tangential/.code               = \def\tkz@numtspc{8},
      symmedian/.code                = \def\tkz@numtspc{9},
      name/.store in                 = \tkz@pttr@name,
      name                           =  {},
      centroid,       
      }     
\def\tkzDefSpcTriangle{\pgfutil@ifnextchar[{\tkz@DefSpcTriangle}{%
                                 \tkz@DefSpcTriangle[]}}
\def\tkz@DefSpcTriangle[#1](#2)#3{% 
\begingroup  
\pgfqkeys{/tkzDefSpcTriangle}{#1}  
\ifcase\tkz@numtspc%
  \tkzDefIncentralTriangle(#2){#3}
  \or% 1 
  \tkzDefExcentralTriangle(#2){#3}  
  \or% 2
  \tkzDefExtouchTriangle(#2){#3}  
  \or% 3
  \tkzDefIntouchTriangle(#2){#3}  
  \or% 4
  \tkzDefCentroidTriangle(#2){#3} 
  \or% 5
  \tkzDefOrthicTriangle(#2){#3} 
  \or% 6
  \tkzDefFeuerbachTriangle(#2){#3} 
  \or% 7
  \tkzDefEulerTriangle(#2){#3}  
  \or% 8
  \tkzDefTangentialTriangle(#2){#3}  
  \or% 8
  \tkzDefSymmedianTriangle(#2){#3}  
    \fi    
\endgroup
}

 
\pgfkeys{/setuppttr/.is family}
\def\SetUpPTTR#1{\pgfqkeys{/setuppttr}{#1}}
\pgfkeys{/setuppttr/.cd,
   name/.store in   = \tkz@pttr@name,
   name         = {}
}
\def\tkz@recuplast(#1,#2){\def\tkz@last{#1}}
\def\tkz@stop{\tkz@stop}
%<--------------------------------------------------------------------------– 
%     InCentral
%<--------------------------------------------------------------------------–
%<--------------------------------------------------------------------------–>
\def\@DefIncentralTriangle(#1,#2,#3)(#4,#5){%
   \def\tkz@tmp{#5}%
    \tkz@recuplast(#3)
    \tkzDefBisectorLine(#2,#1,\tkz@last)
     \tkzInterLL(#2,\tkz@last)(#1,tkzPointResult)
     \pgfnodealias{#4}{tkzPointResult}
    \ifx\tkz@tmp\tkz@stop\else\@DefIncentralTriangle(#2,#3)(#5)\fi
   \pgfnodealias{\tkz@pttr@name#4}{#4}
}


\def\tkzDefIncentralTriangle{\pgfutil@ifnextchar[{%
                     \tkz@DefIncentralTriangle}{%
                     \tkz@DefIncentralTriangle[]}}
                     
\def\tkz@DefIncentralTriangle[#1](#2)#3{%
\begingroup
   \SetUpPTTR{#1}
   \pgfinterruptboundingbox 
   \@DefIncentralTriangle(#2,#2)(#3,\tkz@stop)
   \endpgfinterruptboundingbox
\endgroup
}
\let\tkzIncentralTriangle\tkzInExcentralTriangle
%<--------------------------------------------------------------------------– 
%     ExCentral
%<--------------------------------------------------------------------------–

%<--------------------------------------------------------------------------–>
\def\@DefExcentralTriangle(#1,#2,#3)(#4,#5){%
  \def\tkz@tmp{#5}%
  \tkz@recuplast(#3)
  \tkzDefExCircle(#2,#1,\tkz@last)  
  \pgfnodealias{#4}{tkzPointResult}
  \ifx\tkz@tmp\tkz@stop\else\@DefExcentralTriangle(#2,#3)(#5)\fi
  \pgfnodealias{\tkz@pttr@name#4}{#4}
}

\def\tkzDefExcentralTriangle{\pgfutil@ifnextchar[{%
         \tkz@DefExcentralTriangle}{%
         \tkz@DefExcentralTriangle[]}} 

\def\tkz@DefExcentralTriangle[#1](#2)#3{%
\begingroup
   \SetUpPTTR{#1}
   \@DefExcentralTriangle(#2,#2)(#3,\tkz@stop)
\endgroup
}
\let\tkzExcentralTriangle\tkzDefExcentralTriangle
%<--------------------------------------------------------------------------–>
% Intouch Triangle
%<--------------------------------------------------------------------------–>
\def\@DefIntouchTriangle(#1,#2,#3)(#4,#5){%
   \def\tkz@tmp{#5}%
    \tkz@recuplast(#3)
   \tkzUProjection(#2,\tkz@last)(tkz@pt)
   \pgfnodealias{#4}{tkzPointResult}
    \ifx\tkz@tmp\tkz@stop\else\@DefIntouchTriangle(#2,#3)(#5)\fi
   \pgfnodealias{\tkz@pttr@name#4}{#4}
}

\def\tkzDefIntouchTriangle{\pgfutil@ifnextchar[{%
                     \tkz@DefIntouchTriangle}{%
                     \tkz@DefIntouchTriangle[]}}
                      
\def\tkz@DefIntouchTriangle[#1](#2)#3{%
\begingroup
   \SetUpPTTR{#1}
   \tkzInCenter(#2) 
   \pgfnodealias{tkz@pt}{tkzPointResult}
   \@DefIntouchTriangle(#2,#2)(#3,\tkz@stop)
\endgroup
}
\let\tkzDefContactTriangle\tkzDefIntouchTriangle
%<--------------------------------------------------------------------------–>
% Extouch Triangle
%<--------------------------------------------------------------------------–>
\def\tkzDefExtouchTriangle{\pgfutil@ifnextchar[{%
                     \tkz@DefExtouchTriangle}{%
                     \tkz@DefExtouchTriangle[]}}
                      
\def\tkz@DefExtouchTriangle[#1](#2,#3,#4)#5{%
\begingroup
   \SetUpPTTR{#1}
    \foreach \name  [count=\i] in {#5} {%
         \global\expandafter\edef\csname tkz@point\i\endcsname{\name}
   }
   \tkzDefExcentralTriangle(#2,#3,#4){tkz@a,tkz@b,tkz@c}
   \tkzUProjection(#3,#4)(tkz@a)
   \pgfnodealias{\tkz@pttr@name\csname tkz@point1\endcsname}{tkzPointResult}
   \tkzUProjection(#2,#3)(tkz@c)
   \pgfnodealias{\tkz@pttr@name\csname tkz@point3\endcsname}{tkzPointResult}
   \tkzUProjection(#2,#4)(tkz@b)
   \pgfnodealias{\tkz@pttr@name\csname tkz@point2\endcsname}{tkzPointResult}
\endgroup
}
%<--------------------------------------------------------------------------–>
%  Feuerbach triangle 
%<--------------------------------------------------------------------------–>
\def\tkzDefFeuerbachTriangle{\pgfutil@ifnextchar[{%
   \tkz@DefFeuerbachTriangle}{\tkz@DefFeuerbachTriangle[]}}

\def\tkz@DefFeuerbachTriangle[#1](#2,#3,#4)#5{%
\begingroup
   \SetUpPTTR{#1}
   \foreach \name  [count=\i] in {#5} {%
         \global\expandafter\edef\csname tkz@point\i\endcsname{\name}
        }
   \tkzDefExCircle(#2,#3,#4)
   \pgfnodealias{tkz@b}{tkzPointResult} \tkzGetLength{tkz@rb}
   \tkzDefExCircle(#3,#4,#2)
   \pgfnodealias{tkz@c}{tkzPointResult} \tkzGetLength{tkz@rc}
   \tkzDefExCircle(#4,#2,#3)
   \pgfnodealias{tkz@a}{tkzPointResult} \tkzGetLength{tkz@ra}
   \tkzInterLC[R](#3,tkz@b)(tkz@b,\tkz@rb pt)
   \tkzGetFirstPoint{\tkz@pttr@name\csname tkz@point2\endcsname}
   \tkzInterLC[R](#4,tkz@c)(tkz@c,\tkz@rc pt)
   \tkzGetFirstPoint{\tkz@pttr@name\csname tkz@point3\endcsname}
   \tkzInterLC[R](#2,tkz@a)(tkz@a,\tkz@ra pt)
   \tkzGetFirstPoint{\tkz@pttr@name\csname tkz@point1\endcsname}
\endgroup
}
%<--------------------------------------------------------------------------–>
%              Centroid
%<--------------------------------------------------------------------------–> 
% The medial triangle or midpoint triangle of a triangle ABC
\def\@DefCentroidTriangle(#1,#2,#3)(#4,#5){%
  \def\tkz@tmp{#5}%
  \tkz@recuplast(#3)
  \pgfcoordinate{#4}{%
  \pgfpointscale{0.5}{%
   \pgfpointadd{\pgfpointanchor{#2}{center}}%
               {\pgfpointanchor{\tkz@last}{center}}}
            }%
    \ifx\tkz@tmp\tkz@stop\else\@DefCentroidTriangle(#2,#3)(#5)\fi
     \pgfnodealias{\tkz@pttr@name#4}{#4}
     }
\def\tkzDefCentroidTriangle{\pgfutil@ifnextchar[{\tkz@DefCentroidTriangle}
                                    {\tkz@DefCentroidTriangle[]}} 
\def\tkz@DefCentroidTriangle[#1](#2)#3{%
\begingroup
   \SetUpPTTR{#1}
   \@DefCentroidTriangle(#2,#2)(#3,\tkz@stop)
\endgroup
}
\let\tkzDefMedialTriangle\tkzDefCentroidTriangle
\let\tkzDefMidpointTriangle\tkzDefCentroidTriangle
%<--------------------------------------------------------------------------–>
% Orthic Triangle H Ha Hb Hc
%<--------------------------------------------------------------------------–>
\def\@DefOrthicTriangle(#1,#2,#3)(#4,#5){%
    \def\tkz@tmp{#5}%
    \tkz@recuplast(#3)
    \tkzUProjection(#2,\tkz@last)(#1)  
    \pgfnodealias{#4}{tkzPointResult}
    \ifx\tkz@tmp\tkz@stop\else\@DefOrthicTriangle(#2,#3)(#5)\fi
   \pgfnodealias{\tkz@pttr@name#4}{#4}
}

\def\tkzDefOrthicTriangle{\pgfutil@ifnextchar[{\tkz@DefOrthicTriangle}
                                   {\tkz@DefOrthicTriangle[]}} 
\def\tkz@DefOrthicTriangle[#1](#2)#3{%
\begingroup
   \SetUpPTTR{#1}
   \@DefOrthicTriangle(#2,#2)(#3,\tkz@stop)
\endgroup
}
\let\tkzDefAltitudeTriangle\tkzDefOrthicTriangle

%<--------------------------------------------------------------------------–>
% The Euler triangle
%<--------------------------------------------------------------------------–>
\def\tkzDefEulerTriangle{\pgfutil@ifnextchar[{%
   \tkz@DefEulerTriangle}{\tkz@DefEulerTriangle[]}}   
\def\tkz@DefEulerTriangle[#1](#2,#3,#4)#5{%
\begingroup
   \SetUpPTTR{#1}
   \pgfinterruptboundingbox 
   \tkzOrthoCenter(#2,#3,#4) 
   \pgfnodealias{tkz@e}{tkzPointResult}
   \tkzDefMidPoint(#2,tkz@e)
   \pgfnodealias{tkz@m1}{tkzPointResult}
   \tkzDefMidPoint(#3,tkz@e)
   \pgfnodealias{tkz@m2}{tkzPointResult}
   \tkzDefMidPoint(#4,tkz@e)
   \pgfnodealias{tkz@m3}{tkzPointResult}
   \endpgfinterruptboundingbox
   \foreach \name  [count=\i] in {#5} {%
   \coordinate (\tkz@pttr@name\name) at (tkz@m\i);
   }
\endgroup
}
%<--------------------------------------------------------------------------–>
%  TangentialTriangle
%<--------------------------------------------------------------------------–>
\def\tkzDefTangentialTriangle{\pgfutil@ifnextchar[{%
   \tkz@DefTangentialTriangle}{\tkz@DefTangentialTriangle[]}}  
\def\tkz@DefTangentialTriangle[#1](#2,#3,#4)#5{%
\begingroup
   \SetUpPTTR{#1}
   \tkzCircumCenter(#2,#3,#4)       
   \pgfnodealias{tkz@circ}{tkzPointResult}
   \tkzDefLine[orthogonal=through #2](tkz@circ,#2) 
   \pgfnodealias{tkz@pta}{tkzPointResult}  
   \tkzDefLine[orthogonal=through #3](tkz@circ,#3) 
   \pgfnodealias{tkz@ptb}{tkzPointResult}  
   \tkzDefLine[orthogonal=through #4](tkz@circ,#4) 
   \pgfnodealias{tkz@ptc}{tkzPointResult}  
   \tkzInterLL(#2,tkz@pta)(#3,tkz@ptb) 
   \pgfnodealias{tkz@tg3}{tkzPointResult}
   \tkzInterLL(#3,tkz@ptb)(#4,tkz@ptc) 
   \pgfnodealias{tkz@tg1}{tkzPointResult}   
   \tkzInterLL(#4,tkz@ptc)(#2,tkz@pta) 
   \pgfnodealias{tkz@tg2}{tkzPointResult}   
   \foreach \name  [count=\i] in {#5} {%
   \coordinate (\tkz@pttr@name\name) at (tkz@tg\i);
   }
\endgroup
}
%<--------------------------------------------------------------------------– 
%     tkzDefSymmedianLine
%<--------------------------------------------------------------------------–
\def\@DefSymmedianTriangle(#1,#2,#3)(#4,#5){%
   \def\tkz@tmp{#5}%
    \tkz@recuplast(#3)
    \tkzDefSymmedianLine(#2,#1,\tkz@last)
    \tkzInterLL(#2,\tkz@last)(#1,tkzPointResult) 
    \pgfnodealias{#4}{tkzPointResult}
    \ifx\tkz@tmp\tkz@stop\else\@DefSymmedianTriangle(#2,#3)(#5)\fi
   \pgfnodealias{\tkz@pttr@name#4}{#4}
}

\def\tkzDefSymmedianTriangle{\pgfutil@ifnextchar[{%
                     \tkz@DefSymmedianTriangle}{%
                     \tkz@DefSymmedianTriangle[]}}
                     
\def\tkz@DefSymmedianTriangle[#1](#2)#3{%
\begingroup
   \SetUpPTTR{#1}
   \pgfinterruptboundingbox 
   \@DefSymmedianTriangle(#2,#2)(#3,\tkz@stop)
   \endpgfinterruptboundingbox
\endgroup
}

\makeatother
\endinput