diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex')
-rw-r--r-- | Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex | 680 |
1 files changed, 680 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex new file mode 100644 index 00000000000..08f4ce97686 --- /dev/null +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex @@ -0,0 +1,680 @@ +% Copyright 2006 by Till Tantau +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + + +\section{Tutorial: Euclid's Amber Version of the \emph{Elements}} + +In this third tutorial we have a look at how \tikzname\ can be used to +draw geometric constructions. + +Euclid is currently quite busy writing his new book series, whose +working title is ``Elements'' (Euclid is not quite sure whether this +title will convey the message of the series to future generations +correctly, but he intends to change the title before it goes to the +publisher). Up to know, he wrote down his text and graphics on +papyrus, but his publisher suddenly insists that he must submit in +electronic form. Euclid tries to argue with the publisher that +electronics will only be discovered thousands of years later, but the +publisher informs him that the use of amber is no longer cutting edge +technology and Euclid will just have to keep up with modern tools. + +Slightly disgruntled, Euclid starts converting his papyrus +entitled ``Book I, Proposition I'' to an amber version. + +\subsection{Book I, Proposition I} + +The drawing on his papyrus looks like this:\footnote{The text is taken +from the wonderful interactive version of Euclid's Elements by David +E. Joyce, to be found on his website at Clark University.} + +\bigskip +\noindent +\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}] + \def\A{\textcolor{input}{$A$}} + \def\B{\textcolor{input}{$B$}} + \def\C{\textcolor{output}{$C$}} + \def\D{$D$} + \def\E{$E$} + + \colorlet{input}{blue!80!black} + \colorlet{output}{red!70!black} + \colorlet{triangle}{orange} + + \coordinate [label=left:\A] + (A) at ($ (0,0) + .1*(rand,rand) $); + \coordinate [label=right:\B] + (B) at ($ (1.25,0.25) + .1*(rand,rand) $); + + \draw [input] (A) -- (B); + + \node [help lines,draw,label=left:\D] (D) at (A) [circle through=(B)] {}; + \node [help lines,draw,label=right:\E] (E) at (B) [circle through=(A)] {}; + + \coordinate [label=above:\C] + (C) at (intersection 2 of D and E); + + \draw [output] (A) -- (C); + \draw [output] (B) -- (C); + + \foreach \point in {A,B,C} + \fill [black,opacity=.5] (\point) circle (2pt); + + \begin{pgfonlayer}{background} + \fill[triangle!80] (A) -- (C) -- (B) -- cycle; + \end{pgfonlayer} + + \node [below right,text width=10cm,text justified] at (4,3) + { + \small + \textbf{Proposition I}\par + \emph{To construct an \textcolor{triangle}{equilateral triangle} + on a given \textcolor{input}{finite straight line}.} + \par + \vskip1em + Let \A\B\ be the given \textcolor{input}{finite straight line}. It + is required to construct an \textcolor{triangle}{equilateral + triangle} on the \textcolor{input}{straight line}~\A\B. + + Describe the circle \B\C\D\ with center~\A\ and radius \A\B. Again + describe the circle \A\C\E\ with center~\B\ and radius \B\A. Join the + \textcolor{output}{straight lines} \C\A\ and \C\B\ from the + point~\C\ at which the circles cut one another to the points~\A\ and~\B. + + Now, since the point~\A\ is the center of the circle \C\D\B, + therefore \A\C\ equals \A\B. Again, since the point \B\ is the + center of the circle \C\A\E, therefore \B\C\ equals \B\A. But + \A\C\ was proved equal to \A\B, therefore each of the straight + lines \A\C\ and \B\C\ equals \A\B. And + things which equal the same thing also equal one another, + therefore \A\C\ also equals \B\C. Therefore the three straight + lines \A\C, \A\B, and \B\C\ equal one another. + Therefore the \textcolor{triangle}{triangle} \A\B\C\ is + equilateral, and it has been constructed on the given finite + \textcolor{input}{straight line}~\A\B. + }; +\end{tikzpicture} +\bigskip + +Let us have a look at how Euclid can turn this into \tikzname\ code. + +\subsubsection{Setting up the Environment} + +As in the previous tutorials, Euclid needs to load \tikzname, together +with some libraries. These libraries are |calc|, |through|, and +|backgrounds|. Depending on which format he uses, Euclid would use one +of the following in the preamble: + +\begin{codeexample}[code only] +% For LaTeX: +\usepackage{tikz} +\usetikzlibrary{calc,through,backgrounds} +\end{codeexample} + +\begin{codeexample}[code only] +% For plain TeX: +\input tikz.tex +\usetikzlibrary{calc,through,backgrounds} +\end{codeexample} + +\begin{codeexample}[code only] +% For ConTeXt: +\usemodule[tikz] +\usetikzlibrary[calc,through,backgrounds] +\end{codeexample} + + +\subsubsection{The Line \emph{AB}} + +The first part of the picture that Euclid wishes to draw is the line +$AB$. That is easy enough, something like |\draw (0,0) -- (2,1);| +might do. However, Euclid does not wish to reference the two points +$A$ and $B$ as $(0,0)$ and $(2,1)$ subsequently. Rather, he wishes to +just write |A| and |B|. Indeed, the whole point of his book is that +the points $A$ and $B$ can be arbitrary and all other points (like +$C$) are constructed in terms of their positions. It would not do +if Euclid were to write down the coordinates of $C$ explicitly. + +So, Euclid starts with defining two coordinates using the +|\coordinate| command: +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate (A) at (0,0); + \coordinate (B) at (1.25,0.25); + + \draw[blue] (A) -- (B); +\end{tikzpicture} +\end{codeexample} + +That was easy enough. What is missing at this point are the labels for +the coordinates. Euclid does not want them \emph{on} the points, but +next to them. He decides to use the |label| option: +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:\textcolor{blue}{$A$}] (A) at (0,0); + \coordinate [label=right:\textcolor{blue}{$B$}] (B) at (1.25,0.25); + + \draw[blue] (A) -- (B); +\end{tikzpicture} +\end{codeexample} + +At this point, Euclid decides that it would be even nicer if the +points $A$ and $B$ were in some sense ``random.'' Then, neither Euclid +nor the reader can make the mistake of taking ``anything for granted'' +concerning these position of these points. Euclid is pleased to learn +that there is a |rand| function in \tikzname\ that does exactly what +he needs: It produces a number between $-1$ and $1$. Since \tikzname\ +can do a bit of math, Euclid can change the coordinates of the points +as follows: +\begin{codeexample}[code only] +\coordinate [...] (A) at (0+0.1*rand,0+0.1*rand); +\coordinate [...] (B) at (1.25+0.1*rand,0.25+0.1*rand); +\end{codeexample} + +This works fine. However, Euclid is not quite satisfied since he would +prefer that the ``main coordinates'' $(0,0)$ and $(1.25,0.25)$ are +``kept separate'' from the perturbation +$0.1(\mathit{rand},\mathit{rand})$. This means, he would like to +specify that coordinate $A$ as ``The point that is at $(0,0)$ plus one +tenth of the vector $(\mathit{rand},\mathit{rand})$.'' + +It turns out that the |calc| library allows him to do exactly this +kind of computation. When this library is loaded, you can use special +coordinates that start with |($| and end with |$)| rather than just +|(| and~|)|. Inside these special coordinates you can give a linear +combination of coordinates. (Note that the dollar signs are only +intended to signal that a ``computation'' is going on; no mathematical +typesetting is done.) + +The new code for the coordinates is the following: + +\begin{codeexample}[code only] +\coordinate [...] (A) at ($ (0,0) + .1*(rand,rand) $); +\coordinate [...] (B) at ($ (1.25,0.25) + .1*(rand,rand) $); +\end{codeexample} + +Note that if a coordinate in such a computation has a factor (like +|.1|) you must place a |*| directly before the opening parenthesis of +the coordinate. You can nest such computations. + + + +\subsubsection{The Circle Around \emph{A}} + +The first tricky construction is the circle around~$A$. We will see +later how to do this in a very simple manner, but first let us do it +the ``hard'' way. + +The idea is the following: We draw a circle around the point $A$ whose +radius is given by the length of the line $AB$. The difficulty lies in +computing the length of this line. + +Two ideas ``nearly'' solve this problem: First, we can write +|($ (A) - (B) $)| for the vector that is the difference between $A$ +and~$B$. All we need is the length of this vector. Second, given two +numbers $x$ and $y$, one can write |veclen(|$x$|,|$y$|)| inside a +mathematical expression. This gives the value $\sqrt{x^2+y^2}$, which +is exactly the desired length. + +The only remaining problem is to access the $x$- and $y$-coordinate of +the vector~$AB$. For this, we need a new concept: the \emph{let + operation}. A let operation can be given anywhere on a path where a +normal path operation like a line-to or a move-to is expected. The +effect of a let operation is to evaluate some coordinates and to +assign the results to special macros. These macros make it easy to +access the $x$- and $y$-coordinates of the coordinates. + +Euclid would write the following: +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + + \draw (A) let + \p1 = ($ (B) - (A) $) + in + circle ({veclen(\x1,\y1)}); +\end{tikzpicture} +\end{codeexample} + +Each assignment in a let operation starts with |\p|, usually followed +by a \meta{digit}. Then comes an equal sign and a coordinate. The +coordinate is evaluated and the result is stored internally. From +then on you can use the following expressions: +\begin{enumerate} +\item |\x|\meta{digit} yields the $x$-coordinate of the resulting point. +\item |\y|\meta{digit} yields the $y$-coordinate of the resulting + point. +\item |\p|\meta{digit} yields the same as |\x|\meta{digit}|,\y|\meta{digit}. +\end{enumerate} +You can have multiple assignments in a let operation, just separate +them with commas. In later assignments you can already use the results +of earlier assignments. + +Note that |\p1| is not a coordinate in the usual sense. Rather, it +just expands to a string like |10pt,20pt|. So, you cannot write, for +instance, |(\p1.center)| since this would just expand to +|(10pt,20pt.center)|, which makes no sense. + +Next, we want to draw both circles at the same time. Each time the +radius is |veclen(\x1,\y1)|. It seems natural to compute this radius +only once. For this, we can also use a let operation: Instead of +writing |\p1 = ...|, we write |\n2 = ...|. Here, ``n'' stands for +``number'' (while ``p'' stands for ``point''). The assignment of a +number should be followed by a number in curly braces. +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + + \draw let \p1 = ($ (B) - (A) $), + \n2 = {veclen(\x1,\y1)} + in + (A) circle (\n2) + (B) circle (\n2); +\end{tikzpicture} +\end{codeexample} +In the above example, you may wonder, what |\n1| would yield? The +answer is that it would be undefined -- the |\p|, |\x|, and |\y| +macros refer to the same logical point, while the |\n| macro has ``its +own namespace.'' We could even have replaced |\n2| in the example by +|\n1| and it would still work. Indeed, the digits following these +macros are just normal \TeX\ parameters. We could also use a longer +name, but then we have to use curly braces: +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + + \draw let \p1 = ($ (B) - (A) $), + \n{radius} = {veclen(\x1,\y1)} + in + (A) circle (\n{radius}) + (B) circle (\n{radius}); +\end{tikzpicture} +\end{codeexample} + +At the beginning of this section it was promised that there is an +easier way to create the desired circle. The trick is to use the +|through| library. As the name suggests, it contains code for creating +shapes that go through a given point. + +The option that we are looking for is |circle through|. This option is +given to a \emph{node} and has the following effects: First, it causes +the node's inner and outer separations to be set to zero. Then it sets +the shape of the node to |circle|. Finally, it sets the radius of the +node such that it goes through the parameter given to +|circle through|. This radius is computed in essentially the same way +as above. + +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + + \node [draw,circle through=(B),label=left:$D$] at (A) {}; +\end{tikzpicture} +\end{codeexample} + + +\subsubsection{The Intersection of the Circles} + +Euclid can now draw the line and the circles. The final problem is to +compute the intersection of the two circles. This computation is a bit +involved if you want to do it ``by hand.'' Fortunately, the so-called +intersection coordinate system allows us to specify points as the +intersection of two objects (in order for the following code to work, +the |calc| library must be loaded; it defines the necessary code for +computing the intersection of circles): +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + + \node (D) [draw,circle through=(B),label=left:$D$] at (A) {}; + \node (E) [draw,circle through=(A),label=right:$E$] at (B) {}; + + \coordinate [label=above:$C$] (C) at (intersection 2 of D and E); + + \draw [red] (A) -- (C); + \draw [red] (B) -- (C); +\end{tikzpicture} +\end{codeexample} + +We could also have written |intersection 1 of| or just +|intersection of| to get access to the other intersection of the +circles. + +Although Euclid does not need it for the current picture, it is just a +small step to computing the bisection of the line $AB$: + +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + + \node (D) [draw,circle through=(B),label=left:$D$] at (A) {}; + \node (E) [draw,circle through=(A),label=right:$E$] at (B) {}; + + \coordinate [label=above:$C$] (C) at (intersection 2 of D and E); + \coordinate [label=below:$C'$] (C') at (intersection 1 of D and E); + + \draw [red] (C) -- (C'); + \node [fill=red,inner sep=1pt,label=-45:$F$] (F) at (intersection of C--C' and A--B) {}; +\end{tikzpicture} +\end{codeexample} + + + +\subsubsection{The Complete Code} + +Back to Euclid's code. He introduces a few macros to make life +simpler, like a |\A| macro for typesetting a blue $A$. He also uses the +|background| layer for drawing the triangle behind everything at the +end. + +\begin{codeexample}[] +\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}] + \def\A{\textcolor{input}{$A$}} \def\B{\textcolor{input}{$B$}} + \def\C{\textcolor{output}{$C$}} \def\D{$D$} + \def\E{$E$} + + \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black} + \colorlet{triangle}{orange} + + \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $); + \coordinate [label=right:\B] (B) at ($ (1.25,0.25) + .1*(rand,rand) $); + + \draw [input] (A) -- (B); + + \node [help lines,draw,label=left:\D] (D) at (A) [circle through=(B)] {}; + \node [help lines,draw,label=right:\E] (E) at (B) [circle through=(A)] {}; + + \coordinate [label=above:\C] (C) at (intersection 2 of D and E); + + \draw [output] (A) -- (C) -- (B); + + \foreach \point in {A,B,C} + \fill [black,opacity=.5] (\point) circle (2pt); + + \begin{pgfonlayer}{background} + \fill[triangle!80] (A) -- (C) -- (B) -- cycle; + \end{pgfonlayer} + + \node [below right, text width=10cm,text justified] at (4,3) { + \small\textbf{Proposition I}\par + \emph{To construct an \textcolor{triangle}{equilateral triangle} + on a given \textcolor{input}{finite straight line}.} + \par\vskip1em + Let \A\B\ be the given \textcolor{input}{finite straight line}. \dots + }; +\end{tikzpicture} +\end{codeexample} + + +\subsection{Book I, Proposition II} + +The second proposition in the Elements is the following: + +\bigskip\noindent +\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}] + \def\A{\textcolor{orange}{$A$}} \def\B{\textcolor{input}{$B$}} + \def\C{\textcolor{input}{$C$}} \def\D{$D$} + \def\E{$E$} \def\F{$F$} + \def\G{$G$} \def\H{$H$} + \def\K{$K$} \def\L{\textcolor{output}{$L$}} + + \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black} + + \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $); + \coordinate [label=right:\B] (B) at ($ (1,0.2) + .1*(rand,rand) $); + \coordinate [label=above:\C] (C) at ($ (1,2) + .1*(rand,rand) $); + + \draw [input] (B) -- (C); + \draw [help lines] (A) -- (B); + + \coordinate [label=above:\D] (D) at ($ (A)!.5!(B) ! {sin(60)*2} ! 90:(B) $); + + \draw [help lines] (D) -- ($ (D)!3.75!(A) $) coordinate [label=-135:\E] (E); + \draw [help lines] (D) -- ($ (D)!3.75!(B) $) coordinate [label=-45:\F] (F); + + \node (H) at (B) [help lines,circle through=(C),draw,label=135:\H] {}; + + \coordinate [label=right:\G] (G) at (intersection of B--F and H); + + \node (K) at (D) [help lines,circle through=(G),draw,label=135:\K] {}; + + \coordinate [label=below:\L] (L) at (intersection of A--E and K); + + \draw [output] (A) -- (L); + + \foreach \point in {A,B,C,D,G,L} + \fill [black,opacity=.5] (\point) circle (2pt); + + \node [below right, text width=9cm,text justified] at (4,4) { + \small\textbf{Proposition II}\par + \emph{To place a \textcolor{output}{straight line} equal to a + given \textcolor{input}{straight line} with + one end at a \textcolor{orange}{given point}.} + \par\vskip1em + Let \A\ be the given point, and \B\C\ the given + \textcolor{input}{straight line}. + It is required to place a \textcolor{output}{straight line} equal + to the given \textcolor{input}{straight line} \B\C\ with one end + at the point~\A. + + Join the straight line \A\B\ from the point \A\ to the point \B, and + construct the equilateral triangle \D\A\B\ on it. + + Produce the straight lines \A\E\ and \B\F\ in a straight line with + \D\A\ and \D\B. Describe the circle \C\G\H\ with center \B\ and + radius \B\C, and again, describe the circle \G\K\L\ with center + \D\ and radius \D\G. + + Since the point \B\ is the center of the circle \C\G\H, therefore + \B\C\ equals \B\G. Again, since the point \D\ is the center of the + circle \G\K\L, therefore \D\L\ equals \D\G. And in these \D\A\ + equals \D\B, therefore the remainder \A\L\ equals the remainder + \B\G. But \B\C\ was also proved equal to \B\G, therefore each of + the straight lines \A\L\ and \B\C\ equals \B\G. And things which + equal the same thing also equal one another, therefore \A\L\ also + equals \B\C. + + Therefore the \textcolor{output}{straight line} \A\L\ equal to the + given \textcolor{input}{straight line} \B\C\ has been placed with + one end at the \textcolor{orange}{given point}~\A. + }; +\end{tikzpicture} + + + + +\subsubsection{Using Partway Calculations for the Construction of \emph{D}} + +Euclid's construction starts with ``referencing'' Proposition~I for +the construction of the point~$D$. Now, while we could simply repeat the +construction, it seems a bit bothersome that one has to draw all these +circles and do all these complicated constructions. + +For this reason, \tikzname\ supports some simplifications. First, +there is a simple syntax for computing a point that is ``partway'' on +a line from $p$ to~$q$: You place these two points in a coordinate +calculation -- remember, they start with |($| and end with |$)| -- and +then combine them using |!|\meta{part}|!|. A \meta{part} of |0| refers +to the \emph{first} coordinate, a \meta{part} of |1| refers to the +second coordinate, and a value in between refers to a point on the +line from $p$ to~$q$. Thus, the syntax is similar to the |xcolor| +syntax for mixing colors. + +Here is the computation of the point in the middle of the line $AB$: +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {}; +\end{tikzpicture} +\end{codeexample} + +The computation of the point $D$ in Euclid's second proposition is a +bit more complicated. It can be expressed as follows: Consider the +line from $X$ to $B$. Suppose we +rotate this line around $X$ for 90$^\circ$ and then stretch it by a +factor of $\sin(60^\circ)/2$. This yields the desired point~$D$. We +can do the stretching using the partway modifier above, for the +rotation we need a new modifier: the rotation modifier. The idea is +that the second coordinate in a partway computation can be prefixed by +an angle. Then the partway point is computed normally (as if no angle +were given), but the resulting point is rotated by this angle around +the first point. + +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {}; + \node [fill=red,inner sep=1pt,label=above:$D$] (D) at + ($ (X) ! {sin(60)*2} ! 90:(B) $) {}; + \draw (A) -- (D) -- (B); +\end{tikzpicture} +\end{codeexample} + +Finally, it is not necessary to explicitly name the point $X$. Rather, +again like in the |xcolor| package, it is possible to chain partway +modifiers: + +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (1.25,0.25); + \draw (A) -- (B); + \node [fill=red,inner sep=1pt,label=above:$D$] (D) at + ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {}; + \draw (A) -- (D) -- (B); +\end{tikzpicture} +\end{codeexample} + + +\subsubsection{Intersecting a Line and a Circle} + +The next step in the construction is to draw a circle around $B$ +through $C$, which is easy enough to do using the |circle through| +option. Extending the lines $DA$ and $DB$ can be done using partway +calculations, but this time with a part value outside the range +$[0,1]$: + +\begin{codeexample}[] +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (0.75,0.25); + \coordinate [label=above:$C$] (C) at (1,1.5); + \draw (A) -- (B) -- (C); + \coordinate [label=above:$D$] (D) at + ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {}; + \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {}; + \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F); + \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E); +\end{tikzpicture} +\end{codeexample} + +We now face the problem of finding the point $G$, which is the +intersection of the line $BF$ and the circle $H$. One way is to use +yet another variant of the partway computation: Normally, a partway +computation has the form \meta{p}|!|\meta{factor}|!|\meta{q}, +resulting in the point $(1-\meta{factor})\meta{p} + +\meta{factor}\meta{q}$. Alternatively, instead of \meta{factor} you +can also use a \meta{dimension} between the points. In this case, you +get the point that is \meta{dimension} removed from \meta{p} on the +straight line to \meta{q}. + +We know that the point $G$ is on the way from $B$ to $F$. The distance +is given by the radius of the circle~$H$. Here is the code form +computing $H$: +\begin{codeexample}[pre={ +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (0.75,0.25); + \coordinate [label=above:$C$] (C) at (1,1.5); + \draw (A) -- (B) -- (C); + \coordinate [label=above:$D$] (D) at + ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {}; + \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {}; + \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F); + \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E); +},post={\end{tikzpicture}}] + \path let \p1 = ($ (B) - (C) $) in + coordinate [label=left:$G$] (G) at ($ (B) ! veclen(\x1,\y1) ! (F) $); + \fill[red,opacity=.5] (G) circle (2pt); +\end{codeexample} + +However, there is a simpler way: As for circles, we can also intersect +a line and a circle using the |intersection| coordinate system: + +\begin{codeexample}[pre={ +\begin{tikzpicture} + \coordinate [label=left:$A$] (A) at (0,0); + \coordinate [label=right:$B$] (B) at (0.75,0.25); + \coordinate [label=above:$C$] (C) at (1,1.5); + \draw (A) -- (B) -- (C); + \coordinate [label=above:$D$] (D) at + ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {}; + \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {}; + \draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F); + \draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E); +},post={\end{tikzpicture}}] + \coordinate [label=left:$G$] (G) at (intersection of B--F and H); + \fill[red,opacity=.5] (G) circle (2pt); +\end{codeexample} + +\subsubsection{The Complete Code} + +\begin{codeexample}[] +\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}] + \def\A{\textcolor{orange}{$A$}} \def\B{\textcolor{input}{$B$}} + \def\C{\textcolor{input}{$C$}} \def\D{$D$} + \def\E{$E$} \def\F{$F$} + \def\G{$G$} \def\H{$H$} + \def\K{$K$} \def\L{\textcolor{output}{$L$}} + + \colorlet{input}{blue!80!black} \colorlet{output}{red!70!black} + + \coordinate [label=left:\A] (A) at ($ (0,0) + .1*(rand,rand) $); + \coordinate [label=right:\B] (B) at ($ (1,0.2) + .1*(rand,rand) $); + \coordinate [label=above:\C] (C) at ($ (1,2) + .1*(rand,rand) $); + + \draw [input] (B) -- (C); + \draw [help lines] (A) -- (B); + + \coordinate [label=above:\D] (D) at ($ (A)!.5!(B) ! {sin(60)*2} ! 90:(B) $); + + \draw [help lines] (D) -- ($ (D)!3.75!(A) $) coordinate [label=-135:\E] (E); + \draw [help lines] (D) -- ($ (D)!3.75!(B) $) coordinate [label=-45:\F] (F); + + \node (H) at (B) [help lines,circle through=(C),draw,label=135:\H] {}; + + \coordinate [label=right:\G] (G) at (intersection of B--F and H); + + \node (K) at (D) [help lines,circle through=(G),draw,label=135:\K] {}; + + \coordinate [label=below:\L] (L) at (intersection of A--E and K); + + \draw [output] (A) -- (L); + + \foreach \point in {A,B,C,D,G,L} + \fill [black,opacity=.5] (\point) circle (2pt); + + % \node ... +\end{tikzpicture} +\end{codeexample}
\ No newline at end of file |