diff options
author | Karl Berry <karl@freefriends.org> | 2011-06-06 17:17:55 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-06-06 17:17:55 +0000 |
commit | 1116c441adede647c4931c6553046c8d9eb53e0c (patch) | |
tree | eecba89f578294208292dcfcc70db6b8fb3432e8 /Master/texmf-dist/tex/latex/tkz-euclide/tkz-tools-intersections.tex | |
parent | 68598d9c664b3d4c11acabdd625b410e3f3d696a (diff) |
new graphics package tkz-euclide (5jun11)
git-svn-id: svn://tug.org/texlive/trunk@22830 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/tkz-euclide/tkz-tools-intersections.tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/tkz-euclide/tkz-tools-intersections.tex | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/tkz-euclide/tkz-tools-intersections.tex b/Master/texmf-dist/tex/latex/tkz-euclide/tkz-tools-intersections.tex new file mode 100644 index 00000000000..94c65930a41 --- /dev/null +++ b/Master/texmf-dist/tex/latex/tkz-euclide/tkz-tools-intersections.tex @@ -0,0 +1,416 @@ +% 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
\ No newline at end of file |