From 3457502852732c0ade085f6177f51fcc5fb87e1e Mon Sep 17 00:00:00 2001 From: forgotter Date: Thu, 22 Nov 2018 17:40:12 +0530 Subject: [PATCH 1/2] Added Tangents-to-two-circles --- img/tangents-to-two-circles.png | Bin 0 -> 54793 bytes src/geometry/tangents-to-two-circles.md | 111 ++++++++++++++++++++++++ src/index.md | 1 + 3 files changed, 112 insertions(+) create mode 100644 img/tangents-to-two-circles.png create mode 100644 src/geometry/tangents-to-two-circles.md diff --git a/img/tangents-to-two-circles.png b/img/tangents-to-two-circles.png new file mode 100644 index 0000000000000000000000000000000000000000..11adf941a0d7741b0c9a8b139645dd799c251eba GIT binary patch literal 54793 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 rH%Xx43qaR1Fvu|e?g85J; + +# Finding common tangents to two circles + +Given two circles. It is required to find all their common tangents, i.e. all such lines that touch both circles simultaneously. + +The described algorithm will also work in the case when one (or both) circles degenerate into points. Thus, this algorithm can also be used to find tangents to a circle passing through a given point. + + +## The number of common tangents +The number of common tangents to two circles can be 0,1,2,3,4 and infinite. +Look at the images for different cases. +
!["Different cases of tangents common to two circles"](&imgroot&/tangents-to-two-circles.png)
+ +Here, we won't be considering degenerate cases. i.e when the circles coincide (in this case they have infinitely many common tangents), or one circle lies inside the other (in this case they have no common tangents, or if the circles are tangent, there is one common tangent). + +In most cases, two circles have four common tangents. + +If the circles are tangent , then they will have three common tangents, but this can be understood as a degenerate case: as if the two tangents coincided. + +Moreover, the algorithm described below will work in the case when one or both circles have zero radius: in this case there will be, respectively, two or one common tangent. + +Summing up, we will always look for four tangents for all cases except infinite tangents case (Infinte tangents case needs to be handled seperately and it is not discussed here). In degenerate cases, some of tangents will coincide, but nevertheless, these cases will also fit into the big picture. + + + +## Algorithm +For the sake of simplicity of the algorithm, we will assume, without losing generality, that the center of the first circle has coordinates $(0, 0)$. (If this is not the case, then this can be achieved by simply shifting the whole picture, and after finding a solution, by shifting the obtained straight lines back.) + +Denote $r_1$ and $r_2$ the radii of the first and second circles, and by $(v_x,v_y)$ the coordinates of the center of the second circle and point $v$ different from origin. (Note: we are not considering the case in which both the circles are same). + +To solve the problem, we approach it purely algebraically . We need to find all the lines of the form $ax + by + c = 0$ that lie at a distance $r_1$ from the origin of coordinates, and at a distance $r_2$ from a point $v$. In addition, we impose the condition of normalization of the straight line: the sum of the squares of the coefficients aand bmust be equal to one (this is necessary, otherwise the same straight line will correspond to infinitely many representations of the form $ax + by + c = 0$). Total we get such a system of equations for the desired $a, b, c$: + +$$a^2 + b^2 = 1$$ +$$\mid a \cdot 0 + b \cdot 0 + c \mid = r_1$$ +$$\mid a \cdot v_x + b \cdot v_y + c \mid = r_2$$ + +To get rid of the modulus, note that there are only four ways to open the modulus in this system. All these methods can be considered by the general case, if we understand the opening of the modulus as the fact that the coefficient on the right-hand side may be multiplied by -1. In other words, we turn to this system: + +$$a^2 + b^2 = 1$$ +$$c = \pm r_1$$ +$$a \cdot v_x + b \cdot v_y + c = \pm r_2$$ + +Entering the notation $d_1 = \pm r_1$ and $d_2 = \pm r_2$ , we come to the conclusion that the system must solve four times: + +$$a^2 + b^2 = 1$$ +$$c = d_1$$ +$$a \cdot v_x + b \cdot v_y + c = d_2$$ + +The solution of this system is reduced to solving a quadratic equation. We will omit all the cumbersome calculations, and immediately give a ready answer: + +$$a = {\( d_2 - d_1 \) v_x \pm v_y \sqrt{v_x^2 + v_y^2-(d_2-d_1)^2} \over {v_x^2 + v_y^2} }$$ +$$b = {\( d_2 - d_1 \) v_y \pm v_x \sqrt{v_x^2 + v_y^2-(d_2-d_1)^2} \over {v_x^2 + v_y^2} }$$ +$$c = d_1$$ + +Total we got eight solutions instead four. However, it is easy to understand where superfluous decisions arise: in fact, in the latter system, it is enough to take only one solution (for example, the first). In fact, the geometric meaning of what we take $\pm r_1$ and $\pm r_2$ is clear: we are actually sorting out which side of each circle there is a straight line. Therefore, the two methods that arise when solving the latter system are redundant: it is enough to choose one of the two solutions (only, of course, in all four cases, you must choose the same family of solutions). + +The last thing that we have not yet considered is how to shift the straight lines in the case when the first circle was not originally located at the origin. However, everything is simple here: it follows from the linearity of the equation of a straight line that a $c$ quantity must be subtracted from the coefficient $a \cdot x_0 + b \cdot y_0$ (where $x_0$ and $y_0$ are the coordinates of the original center of the first circle). + + +##Implementation +We first describe all the necessary data structures and other auxiliary definitions: +```point-line-circle-struct + struct pt { + double x, y; + + pt operator- (pt p) { + pt res = { x-p.x, y-p.y }; + return res; + } + }; + + struct circle : pt { + double r; + }; + + struct line { + double a, b, c; + }; + + const double EPS = 1E-9; + + double sqr (double a) { + return a * a; + } +``` +Then the solution itself can be written this way (where the main function for the call is the second; and the first function is an auxiliary): +```find-tangents-to-two-circles + void tangents (pt c, double r1, double r2, vector & ans) { + double r = r2 - r1; + double z = sqr(c.x) + sqr(c.y); + double d = z - sqr(r); + if (d < -EPS) return; + d = sqrt (abs (d)); + line l; + l.a = (c.x * r + c.y * d) / z; + l.b = (c.y * r - c.x * d) / z; + l.c = r1; + ans.push_back (l); + } + + vector tangents (circle a, circle b) { + vector ans; + for (int i=-1; i<=1; i+=2) + for (int j=-1; j<=1; j+=2) + tangents (b-a, a.r*i, b.r*j, ans); + for (size_t i=0; i Date: Fri, 23 Nov 2018 16:53:42 +0100 Subject: [PATCH 2/2] Spelling, fixed shift of lines explanation, and reformated code --- src/geometry/tangents-to-two-circles.md | 105 ++++++++++++------------ 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/src/geometry/tangents-to-two-circles.md b/src/geometry/tangents-to-two-circles.md index 02328862a..328e4074e 100644 --- a/src/geometry/tangents-to-two-circles.md +++ b/src/geometry/tangents-to-two-circles.md @@ -8,19 +8,19 @@ The described algorithm will also work in the case when one (or both) circles de ## The number of common tangents -The number of common tangents to two circles can be 0,1,2,3,4 and infinite. +The number of common tangents to two circles can be **0,1,2,3,4** and **infinite**. Look at the images for different cases.
!["Different cases of tangents common to two circles"](&imgroot&/tangents-to-two-circles.png)
-Here, we won't be considering degenerate cases. i.e when the circles coincide (in this case they have infinitely many common tangents), or one circle lies inside the other (in this case they have no common tangents, or if the circles are tangent, there is one common tangent). +Here, we won't be considering **degenerate** cases, i.e *when the circles coincide (in this case they have infinitely many common tangents), or one circle lies inside the other (in this case they have no common tangents, or if the circles are tangent, there is one common tangent).* -In most cases, two circles have four common tangents. +In most cases, two circles have **four** common tangents. -If the circles are tangent , then they will have three common tangents, but this can be understood as a degenerate case: as if the two tangents coincided. +If the circles **are tangent** , then they will have three common tangents, but this can be understood as a degenerate case: as if the two tangents coincided. Moreover, the algorithm described below will work in the case when one or both circles have zero radius: in this case there will be, respectively, two or one common tangent. -Summing up, we will always look for four tangents for all cases except infinite tangents case (Infinte tangents case needs to be handled seperately and it is not discussed here). In degenerate cases, some of tangents will coincide, but nevertheless, these cases will also fit into the big picture. +Summing up, we will always look for **four tangents** for all cases except infinite tangents case (The infinite tangents case needs to be handled separately and it is not discussed here). In degenerate cases, some of tangents will coincide, but nevertheless, these cases will also fit into the big picture. @@ -29,7 +29,7 @@ For the sake of simplicity of the algorithm, we will assume, without losing gene Denote $r_1$ and $r_2$ the radii of the first and second circles, and by $(v_x,v_y)$ the coordinates of the center of the second circle and point $v$ different from origin. (Note: we are not considering the case in which both the circles are same). -To solve the problem, we approach it purely algebraically . We need to find all the lines of the form $ax + by + c = 0$ that lie at a distance $r_1$ from the origin of coordinates, and at a distance $r_2$ from a point $v$. In addition, we impose the condition of normalization of the straight line: the sum of the squares of the coefficients aand bmust be equal to one (this is necessary, otherwise the same straight line will correspond to infinitely many representations of the form $ax + by + c = 0$). Total we get such a system of equations for the desired $a, b, c$: +To solve the problem, we approach it purely **algebraically** . We need to find all the lines of the form $ax + by + c = 0$ that lie at a distance $r_1$ from the origin of coordinates, and at a distance $r_2$ from a point $v$. In addition, we impose the condition of normalization of the straight line: the sum of the squares of the coefficients and must be equal to one (this is necessary, otherwise the same straight line will correspond to infinitely many representations of the form $ax + by + c = 0$). Total we get such a system of equations for the desired $a, b, c$: $$a^2 + b^2 = 1$$ $$\mid a \cdot 0 + b \cdot 0 + c \mid = r_1$$ @@ -41,7 +41,7 @@ $$a^2 + b^2 = 1$$ $$c = \pm r_1$$ $$a \cdot v_x + b \cdot v_y + c = \pm r_2$$ -Entering the notation $d_1 = \pm r_1$ and $d_2 = \pm r_2$ , we come to the conclusion that the system must solve four times: +Entering the notation $d_1 = \pm r_1$ and $d_2 = \pm r_2$ , we come to the conclusion that the system must have four solutions: $$a^2 + b^2 = 1$$ $$c = d_1$$ @@ -55,57 +55,58 @@ $$c = d_1$$ Total we got eight solutions instead four. However, it is easy to understand where superfluous decisions arise: in fact, in the latter system, it is enough to take only one solution (for example, the first). In fact, the geometric meaning of what we take $\pm r_1$ and $\pm r_2$ is clear: we are actually sorting out which side of each circle there is a straight line. Therefore, the two methods that arise when solving the latter system are redundant: it is enough to choose one of the two solutions (only, of course, in all four cases, you must choose the same family of solutions). -The last thing that we have not yet considered is how to shift the straight lines in the case when the first circle was not originally located at the origin. However, everything is simple here: it follows from the linearity of the equation of a straight line that a $c$ quantity must be subtracted from the coefficient $a \cdot x_0 + b \cdot y_0$ (where $x_0$ and $y_0$ are the coordinates of the original center of the first circle). - +The last thing that we have not yet considered is **how to shift the straight lines** in the case when the first circle was not originally located at the origin. However, everything is simple here: it follows from the linearity of the equation of a straight line that the value $a \cdot x_0 + b \cdot y_0$ (where $x_0$ and $y_0$ are the coordinates of the original center of the first circle) must be subtracted from the coefficient $c$. ##Implementation We first describe all the necessary data structures and other auxiliary definitions: + ```point-line-circle-struct - struct pt { - double x, y; - - pt operator- (pt p) { - pt res = { x-p.x, y-p.y }; - return res; - } - }; - - struct circle : pt { - double r; - }; - - struct line { - double a, b, c; - }; - - const double EPS = 1E-9; - - double sqr (double a) { - return a * a; +struct pt { + double x, y; + + pt operator- (pt p) { + pt res = { x-p.x, y-p.y }; + return res; } +}; + +struct circle : pt { + double r; +}; + +struct line { + double a, b, c; +}; + +const double EPS = 1E-9; + +double sqr (double a) { + return a * a; +} ``` Then the solution itself can be written this way (where the main function for the call is the second; and the first function is an auxiliary): + ```find-tangents-to-two-circles - void tangents (pt c, double r1, double r2, vector & ans) { - double r = r2 - r1; - double z = sqr(c.x) + sqr(c.y); - double d = z - sqr(r); - if (d < -EPS) return; - d = sqrt (abs (d)); - line l; - l.a = (c.x * r + c.y * d) / z; - l.b = (c.y * r - c.x * d) / z; - l.c = r1; - ans.push_back (l); - } - - vector tangents (circle a, circle b) { - vector ans; - for (int i=-1; i<=1; i+=2) - for (int j=-1; j<=1; j+=2) - tangents (b-a, a.r*i, b.r*j, ans); - for (size_t i=0; i & ans) { + double r = r2 - r1; + double z = sqr(c.x) + sqr(c.y); + double d = z - sqr(r); + if (d < -EPS) return; + d = sqrt (abs (d)); + line l; + l.a = (c.x * r + c.y * d) / z; + l.b = (c.y * r - c.x * d) / z; + l.c = r1; + ans.push_back (l); +} + +vector tangents (circle a, circle b) { + vector ans; + for (int i=-1; i<=1; i+=2) + for (int j=-1; j<=1; j+=2) + tangents (b-a, a.r*i, b.r*j, ans); + for (size_t i=0; i