diff options
author | Karl Berry <karl@freefriends.org> | 2011-06-06 17:16:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-06-06 17:16:13 +0000 |
commit | f49b6e59b0d0a356926fdca182d060edd700cf68 (patch) | |
tree | 948f1eccc2d83b7da63c878b928cb86a5f2e7445 /Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex | |
parent | e4eb16f2cc33863ebe1e13711aac7eae5f61e5de (diff) |
tkz-base (5jun11)
git-svn-id: svn://tug.org/texlive/trunk@22827 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex | 688 |
1 files changed, 688 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex b/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex new file mode 100644 index 00000000000..fecd512c0bb --- /dev/null +++ b/Master/texmf-dist/tex/latex/tkz-base/tkz-tools-math.tex @@ -0,0 +1,688 @@ +% 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} + + + +% Objet : outils mathématiques pour la géométrie euclideienne avec pgf/tikz +% utilisable de préférence avec un repère orthonormé et le cm comme unité +% utile pour la compatibilité avec pgf 2 +%<--------------------------------------------------------------------------–> +%<--------------------------------------------------------------------------–> +% Duplicate Length à revoir pas de pt pas de global +% ||v(CN)||= ||v(AB)|| et v(CN) colineaire à v(CD) +% A-->#1 B-->#2 C-->#3 D-->#4 N-->#5 ????? +%<--------------------------------------------------------------------------–> +\def\tkzDuplicateLen(#1,#2)(#3,#4){% +\begingroup + \tkzCalcLength(#1,#2)\tkzGetLength{tkz@firstlen}% + \tkzCalcLength(#3,#4)\tkzGetLength{tkz@secondlen}% + \FPdiv\tkz@ratio{\tkz@firstlen}{\tkz@secondlen}% + \tkz@VecKCoLinear[\tkz@ratio](#3,#4,#3){tkzPointResult}% +\endgroup +} +\let\tkzDuplicateSegment\tkzDuplicateLen %<--------------------------------------------------------------------------–> +% Coordonnées d'un vecteur (couple de points) +% Deux points A et B donc un vecteur on récupère les coordonnées de v(AB) +% en cm +% tkzGetVecCoord en cm ou en pt ??? +%<--------------------------------------------------------------------------–> +%result in #3x et #3y #1 et #2 sont les points +% passage en cm avec fp ? +\def\tkzGetVectxy(#1,#2)#3{% +\begingroup +\pgfpointdiff{\pgfpointanchor{#1}{center}}% + {\pgfpointanchor{#2}{center}}% +\pgfmathparse{\pgf@sys@tonumber{\pgf@x}/28.45274}% +\global\let\tkzresultx\pgfmathresult +\pgfmathparse{\pgf@sys@tonumber{\pgf@y}/28.45274}% +\global\let\tkzresulty\pgfmathresult +\global\expandafter\edef\csname #3x\endcsname{\tkzresultx}% +\global\expandafter\edef\csname #3y\endcsname{\tkzresulty}% +\endgroup +} +\let\tkzGetVecCoord\tkzGetVectxy +%<--------------------------------------------------------------------------–> +%<--------------------------------------------------------------------------–> +\def\tkz@numv{0} +\pgfkeys{/tkzdefv/.cd, +K/.code = {\pgfmathparse{#1}\global\def\tkz@ratio{\pgfmathresult}}, +colinear/.code args = {at #1}{\global\def\tkz@numv{0}% + \global\def\tkz@frompoint{#1}}, +orthogonal/.code = {\global\def\tkz@numv{1}}, +linear/.code = {\global\def\tkz@numv{2}}\pgfmathparse{#1}, +normed orthogonal/.code = {\global\def\tkz@numv{3}}, +normed linear/.code = {\global\def\tkz@numv{4}}, +} +\def\tkzDefVector[#1](#2,#3)#4{% +\begingroup +\pgfkeys{/tkzdefv/.cd,K=1} +\pgfqkeys{/tkzdefv}{#1} +\ifcase\tkz@numv% + % first case 0 + \tkzDefVectorfrom[\tkz@ratio](#2,#3){#4} + \or% 1 + \tkz@VecKOrth[\tkz@ratio](#2,#3){#4} + \or% 2 + \tkz@VecK[\tkz@ratio](#2,#3){#4} + \or% 3 + \tkz@VecKOrthNorm[\tkz@ratio](#2,#3){#4} + \or% 4 + \tkz@VecKCoLinear[#1](#2,#3)#4 + \fi +\endgroup +} + +\def\tkzDefVectorfrom[#1](#2,#3)#4{% +\begingroup + \pgfpointdiff{\pgfpointanchor{#2}{center}}% + {\pgfpointanchor{#3}{center}}% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \path[coordinate](\tkz@frompoint)--+(\tkz@ratio\pgf@xa,% + \tkz@ratio\pgf@ya) coordinate (#4); +\endgroup +} +%<--------------------------------------------------------------------------–> +% VecKCoLinear CN = K x AB #1 pt #2 pt #3 pt #4 nb #5 pt result +% il faut modifier cette macro : on supprime #3 pour la colinéarité +% Il suffit d'utiliser Replicate ou Duplicate coeff dans #1 +% v(CD)=#1 x v(AB) #1 le coeff; #2-->A #3-->B #4-->C #5-->N +%<--------------------------------------------------------------------------–> +\def\tkzVecKCoLinear{\pgfutil@ifnextchar[{\tkz@VecKCoLinear}{\tkz@VecKCoLinear[1]}} +\def\tkz@VecKCoLinear[#1](#2,#3,#4)#5{% +\begingroup + \pgfpointdiff{\pgfpointanchor{#2}{center}}% + {\pgfpointanchor{#3}{center}}% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult} + \path[coordinate](#4)--+(\tkz@coeff\pgf@xa,\tkz@coeff\pgf@ya)% + coordinate (#5);% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% v(AN)=#1 x v(AB) +% #1 le coeff; #2--> A #3--> B #4-->N tq #4-#2 = #1*(#3-#2) +%<--------------------------------------------------------------------------–> +\pgfkeys{ + /tkzscalev/.cd, + ratio/.code = {\pgfmathparse{#1}\global\edef\tkz@ratio{\pgfmathresult}} + } +\def\tkzScaleVector{\pgfutil@ifnextchar[{\tkz@ScaleVector}{% + \tkz@ScaleVector[]}} +\def\tkz@ScaleVector[#1](#2,#3)#4{% +\begingroup +\pgfkeys{/tkzscalev/.cd,ratio=-1} +\pgfqkeys{/tkzscalev}{#1} + \pgfpointdiff{\pgfpointanchor{#2}{center}}% + {\pgfpointanchor{#3}{center}}% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \path[coordinate](#2)--++(\pgf@xa *\tkz@ratio,\pgf@ya *\tkz@ratio)% + coordinate (#4);% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% Outils pour les vecteurs +%<--------------------------------------------------------------------------–> +% ce sont des outils élémentaires qui à partir de deux points en définissent +% un troisième +% #1 si c'est une option alors c'est un nombre réel +% #2 et #3 sont deux points +% #4 est le nom du point qui résulte de la transformation +% exemple : \tkzVecKNorm (A,B){C} définit un point C tel que AC = 1 et C est % % un point de la droite (AC). #1 peut être négatif + +%<--------------------------------------------------------------------------–> +% VectorNormalised ou K*VectorNormalised +% A-->#2 B-->#3 N-->#4 v(AB) devient v(AN) tq ||v(AN)||=1 si #1=1 +% sinon ||v(AN)||=#1 +%<--------------------------------------------------------------------------–> +\def\tkzVecKNorm{\pgfutil@ifnextchar[{\tkz@VecKNorm}{\tkz@VecKNorm[1]}} +\def\tkz@VecKNorm[#1](#2,#3)#4{% +\begingroup + \tkzpointnormalised{% + \pgfpointdiff{\pgfpointanchor{#2}{center}} + {\pgfpointanchor{#3}{center}}} + \pgf@xa=\pgf@x\relax% + \pgf@ya=\pgf@y\relax% + \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult} + \FPmul\tkz@coeff{28.45274}{\tkz@coeff} + \FPmul\tkz@x{\tkz@coeff}{\pgf@sys@tonumber{\pgf@xa}} + \FPmul\tkz@y{\tkz@coeff}{\pgf@sys@tonumber{\pgf@ya}} + \path[coordinate](#2)--++(\tkz@x pt,\tkz@y pt)% + coordinate (#4);% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% v(AN)=#1 x v(AB) +% #1 le coeff; #2--> A #3--> B #4-->N tq #4-#2 = #1*(#3-#2) +%<--------------------------------------------------------------------------–> +\def\tkzVecK{\pgfutil@ifnextchar[{\tkz@VecK}{\tkz@VecK[1]}} +\def\tkz@VecK[#1](#2,#3)#4{% +\begingroup + \pgfpointdiff{\pgfpointanchor{#2}{center}}% + {\pgfpointanchor{#3}{center}}% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult} + \path[coordinate](#2)--++(\pgf@xa *\tkz@coeff,% + \pgf@ya *\tkz@coeff)% + coordinate (#4);% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% tkzVector K Orth coeff dans #1 +% v(AN) perp v(AB) v(AB) v(AN) sens direct cercle trigo +% ||v(AN)||=||v(AB)|| +%<--------------------------------------------------------------------------–> +\def\tkzVecKOrth{\pgfutil@ifnextchar[{\tkz@VecKOrth}{\tkz@VecKOrth[1]}} +\def\tkz@VecKOrth[#1](#2,#3)#4{% +\begingroup + \pgfpointdiff{\pgfpointanchor{#2}{center}}% + {\pgfpointanchor{#3}{center}}% + \pgf@xa=-\pgf@y% + \pgf@ya=\pgf@x% + \pgfmathparse{#1}\edef\tkz@coeff{\pgfmathresult} + \path[coordinate](#2)--++(\tkz@coeff\pgf@xa,\tkz@coeff\pgf@ya)% + coordinate (#4);% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% tkzVecKOrthNorm coeff dans #1 +% v(AN) perp v(AB) v(AB) v(AN) sens direct cercle trigo +% ||v(AN||=1 si #1 est vide ou =1 sinon ||v(AN||=K +%<--------------------------------------------------------------------------–> +\def\tkzVecKOrthNorm{\pgfutil@ifnextchar[{\tkz@VecKOrthNorm}% + {\tkz@VecKOrthNorm[1]}} +\def\tkz@VecKOrthNorm[#1](#2,#3)#4{% +\begingroup + \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#2}{center}}% + {\pgfpointanchor{#3}{center}}} + \pgf@xa=-\pgf@y% + \pgf@ya=\pgf@x% + \FPmul\tkz@coeff{28.45274}{#1} + \FPmul\tkz@x{\tkz@coeff}{\pgf@sys@tonumber{\pgf@xa}} + \FPmul\tkz@y{\tkz@coeff}{\pgf@sys@tonumber{\pgf@ya}} + \path[coordinate](#2)--++(\tkz@x pt,\tkz@y pt)% + coordinate (#4);% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% \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}% +\FPmul{\tkz@sx}{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@x}} +\FPmul{\tkz@sy}{\pgf@sys@tonumber{\pgf@y}}{\pgf@sys@tonumber{\pgf@y}} +\FPadd{\tkz@sxy}{\tkz@sx}{\tkz@sy} +\FProot{\tkz@den}{\tkz@sxy}{2} +\FPdiv{\tkz@coordx}{\pgf@sys@tonumber{\pgf@x}}{\tkz@den} +\FPround{\tkz@coordx}{\tkz@coordx}{5} +\FPdiv{\tkz@coordy}{\pgf@sys@tonumber{\pgf@y}}{\tkz@den} +\FPround{\tkz@coordy}{\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 FP +% \veclen mais avec fp +% option cm le résultat est en cm sinon en pt +%<--------------------------------------------------------------------------–> + +\newif\iftkzLengthIncm +\pgfkeys{ +DefVecLen/.cd, + cm/.is if = tkzLengthIncm, + cm/.default = true} + +\def\tkzCalcLength{\pgfutil@ifnextchar[{\tkz@CalcLength}{\tkz@CalcLength[]}} +\def\tkz@CalcLength[#1](#2,#3){% +\pgfkeys{DefVecLen/.cd, cm = false} +\pgfqkeys{/DefVecLen}{#1}% +\begingroup +\tkz@@CalcLength(#2,#3){tkzLengthResult} +\iftkzLengthIncm + \FPdiv\tkzFPMathLen{\tkzFPMathLen}{28.45274} + \FPround\tkzFPMathLen\tkzFPMathLen5\relax% + \global\let\tkzLengthResult\tkzFPMathLen +\fi +\endgroup +}% +\def\tkz@@CalcLength(#1,#2)#3{% +\pgfpointdiff{\pgfpointanchor{#1}{center}}% + {\pgfpointanchor{#2}{center}}% +\pgf@xa=\pgf@x% +\pgf@ya=\pgf@y% +\FPeval\tkz@temp@a{\pgfmath@tonumber{\pgf@xa}}% +\FPeval\tkz@temp@b{\pgfmath@tonumber{\pgf@ya}}% +\FPeval\tkz@temp@sum{(\tkz@temp@a*\tkz@temp@a+\tkz@temp@b*\tkz@temp@b)}% +\FProot{\tkzFPMathLen}{\tkz@temp@sum}{2}% +\FPround\tkzFPMathLen\tkzFPMathLen5\relax +\global\expandafter\edef\csname #3\endcsname{\tkzFPMathLen} +} +%<--------------------------------------------------------------------------–> +\def\tkzGetLength#1{% +\global\expandafter\edef\csname #1\endcsname{\tkzLengthResult}} +%<--------------------------------------------------------------------------–> +% \tkzpttocm passage de pt à cm div par 28.45274 +%<--------------------------------------------------------------------------–> +\def\tkzpttocm(#1)#2{% +\begingroup + \FPdiv\tkz@mathresult{#1}{28.45274} + \FPround\tkz@mathresult\tkz@mathresult5\relax% + \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 + \FPmul\tkz@mathresult{#1}{28.45274} + \FPround\tkz@mathresult\tkz@mathresult5\relax% + \global\let\tkz@mathresult\tkz@mathresult +\global\expandafter\edef\csname #2\endcsname{\tkz@mathresult}% +\endgroup +}% +%<--------------------------------------------------------------------------–> +% Slope +%<--------------------------------------------------------------------------–> +\def\tkzFindSlope{\tkz@FindSlope} +\def\tkz@FindSlope(#1,#2)#3{% + \begingroup + \tkzpointnormalised{\pgfpointdiff{\pgfpointanchor{#1}{center}}% + {\pgfpointanchor{#2}{center}}} + \tkz@ax=\pgf@x\relax% + \tkz@ay=\pgf@y\relax% + \FPdiv{\tkz@Slope}{\pgfmath@tonumber{\tkz@ay}}{\pgfmath@tonumber{\tkz@ax}} + \FPround{\tkz@Slope}{\tkz@Slope}{5} + \global\expandafter\edef\csname #3\endcsname{\tkz@Slope}% +\endgroup +} +%<--------------------------------------------------------------------------–> +%<----------------– for compatibility --------------------------------------–> +%<--------------------------------------------------------------------------–> +\def\tkzmathanglebetweenpoints#1#2{% +\begingroup + \pgf@process{\pgfpointdiff{#1}{#2}}% + % + % First approximate the angle of the external point... + % + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \pgf@xb\pgf@x% + \pgf@yb\pgf@y% + \ifdim\pgf@xa<0pt\relax% + \pgf@xa-\pgf@xa% + \fi + \ifdim\pgf@ya<0pt\relax% + \pgf@ya-\pgf@ya% + \fi + \ifdim\pgf@ya>\pgf@xa% + \pgf@x\pgf@xa% + \pgf@y\pgf@ya% + \else + \pgf@x\pgf@ya% + \pgf@y\pgf@xa% + \fi + \ifdim\pgf@y=0pt\relax% + \pgf@x0pt% + \else + \FPdiv\pgfmathresult{1}{\pgfmath@tonumber{\pgf@y}} + \FPround\pgfmathresult\pgfmathresult5\relax% + \pgf@x\pgfmathresult\pgf@x% + \fi + \multiply\pgf@x1000\relax% + \afterassignment\pgfmath@gobbletilpgfmath@% + \expandafter\c@pgf@counta\the\pgf@x\relax\pgfmath@% +\expandafter\pgf@x\csname pgfmath@atan@\the\c@pgf@counta\endcsname pt\relax% + \ifdim\pgfmath@ya>\pgfmath@xa\relax% + \pgf@x-\pgf@x% + \advance\pgf@x90pt% + \fi + \ifdim\pgf@xb<0pt% + \ifdim\pgf@yb>0pt% + \pgf@x-\pgf@x% + \fi + \advance\pgf@x180pt\relax% + \else + \ifdim\pgf@yb<0pt% + \pgf@x-\pgf@x% + \advance\pgf@x360pt\relax% + \fi + \fi + \ifdim\pgf@x>180pt% + \advance\pgf@x-360pt\relax% + \fi + \pgfmath@returnone\pgf@x% + \endgroup +} + +% \tkzmathrotatepointaround +% +% Rotate point #1 about point #2 by #3 degrees. +% +\def\tkzmathrotatepointaround#1#2#3{% + \pgf@process{% + \pgf@process{#1}% + \pgf@xc=\pgf@x% + \pgf@yc=\pgf@y% + \pgf@process{#2}% + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \pgf@xb\pgf@x% + \pgf@yb\pgf@y% + \pgf@x=\pgf@xc% + \pgf@y=\pgf@yc% + \advance\pgf@x-\pgf@xa% + \advance\pgf@y-\pgf@ya% + \pgfmathsetmacro\tkz@angle{#3}% + \pgfmathsin@{\tkz@angle}% + \let\sineangle\pgfmathresult% + \pgfmathcos@{\tkz@angle}% + \let\cosineangle\pgfmathresult% + \pgf@xa\cosineangle\pgf@x% + \advance\pgf@xa-\sineangle\pgf@y% + \pgf@ya\sineangle\pgf@x% + \advance\pgf@ya\cosineangle\pgf@y% + \pgf@x\pgf@xb% + \pgf@y\pgf@yb% + \advance\pgf@x\pgf@xa% + \advance\pgf@y\pgf@ya% + }% +} + + +% \tkzmathanglebetweenlines +% +% Calculate the clockwise angle between a line from point #1 +% to point #2 and a line from #3 to point #4. +% +\def\tkzmathanglebetweenlines#1#2#3#4{% + \begingroup + \tkzmathanglebetweenpoints{#1}{#2}% + \let\firstangle\pgfmathresult% + \tkzmathanglebetweenpoints{#3}{#4}% + \let\secondangle\pgfmathresult% + \ifdim\firstangle pt>\secondangle pt\relax% + \pgfmathadd@{\secondangle}{360}% + \let\secondangle\pgfmathresult% + \fi + \pgfmathsubtract@{\secondangle}{\firstangle}% + \pgfmath@smuggleone\pgfmathresult% + \endgroup +} +% \pgfmathpointreflectalongaxis +% +% Reflects point #2 around an axis centered on #2 at an angle #3. +% +\def\tkzmathreflectpointalongaxis#1#2#3{% + \pgf@process{% + \pgfmathanglebetweenpoints{#2}{#1}% + \pgfmath@tempdima\pgfmathresult pt\relax% + \pgfmathparse{#3}% + \advance\pgfmath@tempdima-\pgfmathresult pt\relax% + \pgfmath@tempdima-2.0\pgfmath@tempdima% + \pgfmathrotatepointaround{#1}{#2}{\pgfmath@tonumber{\pgfmath@tempdima}}% + }% +} + + +% \pgfmathpointintersectionoflineandarc +% +% A bit experimental at the moment: +% +% Locates the point where a line crosses an eliptical arc. If the line +% does not cross the arc, a meaningless point will result. +% +% #1 the point of the line on the "convex" side of the arc. +% #2 the point of the line on the "concave" side of the arc. +% #3 the center of the eliptical arc. +% #4 start angle of the arc. +% #5 end angle of the arc. +% #6 radii of the arc. +% +\def\tkzmathpointintersectionoflineandarc#1#2#3#4#5#6{% + \pgf@process{% + % + % Get the required angle. + % + \pgfmathanglebetweenpoints{#2}{#1}% + \let\x\pgfmathresult% + % + % Get the radii of the arc. + % + \pgfmath@in@{and }{#6}% + \ifpgfmath@in@% + \pgf@polar@#6\@@% + \else + \pgf@polar@#6 and #6\@@% + \fi + \edef\xarcradius{\the\pgf@x}% + \edef\yarcradius{\the\pgf@y}% + % + % Get the start and end angles of the arc... + % + \pgfmathsetmacro\s{#4}% + \pgfmathsetmacro\e{#5}% + % + % ...and also with rounding. + % + \pgfmathmod@{\s}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi + \let\ss\pgfmathresult% + \pgfmathmod@{\e}{360}% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathadd@{\pgfmathresult}{360}% + \fi + \let\ee\pgfmathresult% + % + % Hackery for when arc straddles zero. + % + \ifdim\ee pt<\ss pt\relax% + \pgfmathadd@{\x}{180}% + \pgfmathmod@{\pgfmathresult}{360}% + \let\x\pgfmathresult% + \fi + \def\m{360}% Measure of nearness. + \pgfmathadd@{\s}{\e}% + \pgfmathdivide@{\pgfmathresult}{2}% + \let\n\pgfmathresult% The best estimate (default to middle of arc). + \pgfmathloop% + \pgfmathadd@{\s}{\e}% + \pgfmathdivide@{\pgfmathresult}{2}% + \let\p\pgfmathresult% + \ifdim\p pt=\s pt\relax% + \else + \tkzmathanglebetweenpoints{#2}{% + \pgfpointadd{#3}{% + \pgf@x\xarcradius\relax% + \pgfmathcos@{\p}% + \pgf@x\pgfmathresult\pgf@x% + \pgf@y\yarcradius\relax% + \pgfmathsin@{\p}% + \pgf@y\pgfmathresult\pgf@y% + }% + }% + % + % Hackery for when arc straddles zero. + % + \ifdim\ee pt<\ss pt\relax% + \pgfmathadd@{\pgfmathresult}{180}% + \pgfmathmod@{\pgfmathresult}{360}% + \fi + \let\q\pgfmathresult% + % + % More hackery... + % + \ifdim\x pt>335pt\relax% + \ifdim\q pt<45pt\relax% + \pgfmathadd@{\q}{360}% + \let\q\pgfmathresult% + \fi + \fi + \ifdim\x pt=\q pt% Found it! + \pgfmathbreakloop% Breaks after current iteration is complete. + \else + \ifdim\x pt<\q pt\relax% + \let\e\p% + \else + \let\s\p% + \fi + \fi + \pgfmathsubtract@{\x}{\q}% + \pgfmathabs@{\pgfmathresult}% + % + % Save the estimate if it is better than any previous estimate. + % + \ifdim\pgfmathresult pt<\m pt\relax% + \let\m\pgfmathresult% + \let\n\p% + \fi + \repeatpgfmathloop% + \pgfpointadd{#3}{\pgfpointpolar{\n}{\xarcradius and \yarcradius}}% + }% +} + +% \tkzmathangleonellipse +% +% Find the angle corresponding to a point on the border of an ellispe. +% +% #1 - the point on the border. +% #2 - the radii of the ellipse. +% +\def\tkzmathangleonellipse#1#2{% + \begingroup + \pgfmath@in@{and }{#2}% + \ifpgfmath@in@% + \pgf@polar@#2\@@% + \else + \pgf@polar@#2 and #2\@@% + \fi + \pgf@xa\pgf@x% + \pgf@ya\pgf@y% + \pgf@process{#1}% + \ifdim\pgf@x=0pt\relax% + \pgfutil@tempdima1pt\relax% + \else + \pgfutil@tempdima\pgf@x% +%\pgfmathdivide@{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgfutil@tempdima}}% +\FPdiv\pgfmathresult{\pgfmath@tonumber{\pgf@xa}}{\pgfmath@tonumber{\pgfutil@tempdima}} +\FPround\pgfmathresult\pgfmathresult5\relax% + \pgfutil@tempdima\pgfmathresult pt\relax% + \fi + \ifdim\pgf@y=0pt\relax% + \pgfutil@tempdima1pt\relax% + \else + % \pgfmathdivide@{\pgfmath@tonumber{\pgf@y}}{\pgfmath@tonumber{\pgf@ya}}% + \FPdiv\pgfmathresult{\pgfmath@tonumber{\pgf@y}}{% + \pgfmath@tonumber{\pgf@ya}}% + \FPround\pgfmathresult\pgfmathresult5\relax% + \pgfutil@tempdima\pgfmathresult\pgfutil@tempdima% + \pgfmathatan@{\pgfmath@tonumber{\pgfutil@tempdima}}% + \fi + % + \pgfutil@tempdima\pgfmathresult pt\relax% + \ifdim\pgfutil@tempdima<0pt\relax% + \advance\pgfutil@tempdima360pt\relax% + \fi + \ifdim\pgf@x<0pt\relax% + \ifdim\pgf@y=0pt\relax% + \pgfutil@tempdima180pt\relax% + \else + \ifdim\pgf@y<0pt\relax% + \advance\pgfutil@tempdima180pt\relax% + \else + \advance\pgfutil@tempdima-180pt\relax% + \fi + \fi + \else + \ifdim\pgf@x=0pt\relax% + \ifdim\pgf@y<0pt\relax% + \pgfutil@tempdima270pt\relax% + \else + \pgfutil@tempdima90pt\relax% + \fi + \else + \ifdim\pgf@y=0pt\relax% + \pgfutil@tempdima0pt\relax% + \fi + \fi + \fi + \pgfmath@returnone\pgfutil@tempdima% + \endgroup +} + +\def\tkzpointborderellipse#1#2{% + \pgf@process{#2}% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \ifdim\pgf@xa=\pgf@ya% circle. that's easy! + \pgf@process{\pgfpointnormalised{#1}}% + \pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x% + \pgf@y=\pgf@sys@tonumber{\pgf@xa}\pgf@y% + \else + \ifdim\pgf@xa<\pgf@ya% + % Ok, first, let's compute x/y: + \c@pgf@countb=\pgf@ya% + \divide\c@pgf@countb by65536\relax% + \divide\pgf@x by\c@pgf@countb% + \divide\pgf@y by\c@pgf@countb% + \pgf@xc=\pgf@x% + \pgf@yc=8192pt% + \pgf@y=.125\pgf@y% + \c@pgf@countb=\pgf@y% + \divide\pgf@yc by\c@pgf@countb% + \pgf@process{#1}% + \pgf@y=\pgf@sys@tonumber{\pgf@yc}\pgf@y% + \pgf@y=\pgf@sys@tonumber{\pgf@xc}\pgf@y% + \pgf@process{\pgfpointnormalised{}}% + \pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x% + \pgf@y=\pgf@sys@tonumber{\pgf@ya}\pgf@y% + \else + % Ok, now let's compute y/x: + \c@pgf@countb=\pgf@xa% + \divide\c@pgf@countb by65536\relax% + \divide\pgf@x by\c@pgf@countb% + \divide\pgf@y by\c@pgf@countb% + \pgf@yc=\pgf@y% + \pgf@xc=8192pt% + \pgf@x=.125\pgf@x% + \c@pgf@countb=\pgf@x% + \divide\pgf@xc by\c@pgf@countb% + \pgf@process{#1}% + \pgf@x=\pgf@sys@tonumber{\pgf@yc}\pgf@x% + \pgf@x=\pgf@sys@tonumber{\pgf@xc}\pgf@x% + \pgf@process{\pgfpointnormalised{}}% + \pgf@x=\pgf@sys@tonumber{\pgf@xa}\pgf@x% + \pgf@y=\pgf@sys@tonumber{\pgf@ya}\pgf@y% + \fi + \fi +} +\endinput
\ No newline at end of file |