Tangent line segments to circles

Introduction

The aim of this post is to calculate the coordinates of touching points of a line tangent on two circles. As illustrated on the figure bellow, four configurations may exist in the general case.

• $$R_A$$ and $$P_A$$ are respectively the radius and center of the first circle.
• $$R_B$$ and $$P_B$$ are respectively the radius and center of the second circle.
• $$P_1$$ is the touching point of the tangent and the first circle.
• $$P_2$$ is the touching point of the tangent and the second circle.

General equations

We first consider the fact that each point lies on a circle: $$\left \{ \begin{array}{r c l} (x_1 - x_A)^2 + (y_1 - y_A)^2 = {R_A}^2 \\ (x_2 - x_B)^2 + (y_2 - y_B)^2 = {R_B}^2 \end{array} \right .$$

We now consider the fact that each Tangent is perpendicular to the radius: $$\left \{ \begin{array}{r c l} (x_1 - x_2)^2 + (y_1 - y_2)^2 + {R_A}^2 = (x_2 - x_A)^2 + (y_2 - y_A)^2 \\ (x_1 - x_2)^2 + (y_1 - y_2)^2 + {R_B}^2 = (x_1 - x_B)^2 + (y_1 - y_B)^2 \end{array} \right .$$

It become possible to solve this four equations and thus to find the four unknow. Unfortunatly, it is not linear and solving such system is complex.

Thales configuration

Fortunatly, Thales configurations make it simpler and alows us to easily calculate $$\left | P_1 P_2 \right |$$.

First configuration

In this configuration, the point $$U$$ is added on the radius of $$C_B$$ in such a way that $$\left | UP_B \right | = R_B - R_A$$.

The triangle $$\widehat {P_A U P_B}$$ is rectangle and $$\left | P_AU \right |^2 + \left | P_BU \right |^2 = \left | P_AP_B \right |^2$$. Based on this triangle, we can deduce that:

$$\left | P_1P_2 \right | = \sqrt { \left | P_AP_B \right |^2 - (R_A - R_B)^2 }$$

From the previous equation, we can deduce that the first configuration tangent may exist only if $$\left | P_AP_B \right |^2 \ge (R_A - R_B)^2$$ ie. none of the circle is fully included in the other.

Second configuration

In this new configuration, points $$A'$$ and $$P_1'$$ are added in such a way that $$\left | P_AP_B \right | = \left | MA' \right |$$ and $$\left | P_1P_2 \right | = \left | MP_1' \right |$$. Note that according to Thales $$\left | P_1'A' \right | = R_A + R_B$$.

As previously, the triangle $$\widehat {M P_1' A'}$$ is rectangle. $$\left | MP_1' \right |^2 + \left | P_1'A' \right |^2 = \left | MA' \right |^2$$ $$\left | P_1P_2 \right |^2 + (R_A + R_B)^2 = \left | P_AP_B \right |^2$$

It becomes thus easy to deduce that: $$\left | P_1P_2 \right | = \sqrt { \left | P_AP_B \right |^2 - (R_A + R_B)^2 }$$ From the previous equation, we can deduce that the second configuration tangent may exist only if $$\left | P_AP_B \right |^2 \ge (R_A + R_B)^2$$ ie. none of the circle is fully included in the other.

Simplifying the equations

Once $$\left | P_1P_2 \right |$$ is known, equations can be reformulated. Let $$L$$ be equal to $$\left | P_1P_2 \right |$$, equations can be rewriten:

$$\left \{ \begin{array}{ll} (x_1 - x_A)^2 + (y_1 - y_A)^2 = {R_A}^2 \\ L^2 + {R_B}^2 = (x_1 - x_B)^2 + (y_1 - y_B)^2 \end{array} \right .$$

$$\left \{ \begin{array}{ll} (x_2 - x_B)^2 + (y_2 - y_B)^2 = {R_B}^2 \\ L^2 + {R_A}^2 = (x_2 - x_A)^2 + (y_2 - y_A)^2 \end{array} \right .$$

We now have two independant non-linear systems to solve. Futhermore, due to the symetry, solving one will solve the whole problem.

Solving the equations

As the systems are equivalent, we will focus on solving the first one: $$\left \{ \begin{array}{ll} (x_1 - x_A)^2 + (y_1 - y_A)^2 = {R_A}^2 \\ (x_1 - x_B)^2 + (y_1 - y_B)^2 = L^2 + {R_B}^2 \end{array} \right .$$

It is clear that the geometrical solution is the intersection of two circles of centers $$P_A$$ and $$P_B$$ with respective radius of $$R_A$$ and $$\sqrt{L^2+{R_B}^2}$$.

The coordinates of $$P_1$$ are given by:

$$\left \{ \begin{array}{ll} x_1= \frac{x_A+x_B}{2} + \frac{(x_B-x_A)({R_A}^2-{R_1}^2)}{2D^2} \pm 2\frac{y_A-y_B}{D^2}\sigma_1 \\ y_1= \frac{y_A+y_B}{2} + \frac{(y_B-y_A)({R_A}^2-{R_1}^2)}{2D^2} \pm 2\frac{x_A-x_B}{D^2}\sigma_1 \end{array} \right .$$

with

$$\begin{array}{ll} D = \sqrt{ (x_B-x_A)^2 + (y_B-y_A)^2 } \\ L = \sqrt { D^2 - (R_A \pm R_B)^2 } \\ R_1= \sqrt{L^2+{R_B}^2} \\ \sigma_1=\frac{1}{4}\sqrt{ (D+R_A+R_1)(D+R_A-R_1)(D-R_A+R_1)(-D+R_A+R_1) } \end{array} .$$

In the same way, it is possible to deduce the coordinates of $$P_2$$:

$$\left \{ \begin{array}{ll} x_2= \frac{x_B+x_A}{2} + \frac{(x_A-x_B)({R_B}^2-{R_2}^2)}{2D^2} \pm 2\frac{y_B-y_A}{D^2}\sigma_2 \\ y_2= \frac{y_B+y_A}{2} + \frac{(y_A-y_B)({R_B}^2-{R_2}^2)}{2D^2} \pm 2\frac{x_B-x_A}{D^2}\sigma_2 \end{array} \right .$$

with

$$\begin{array}{ll} D = \sqrt{ (x_B-x_A)^2 + (y_B-y_A)^2 } \\ L = \sqrt { D^2 - (R_B \pm R_A)^2 } \\ R_2= \sqrt{L^2+{R_A}^2} \\ \sigma_2=\frac{1}{4}\sqrt{ (D+R_B+R_2)(D+R_B-R_2)(D-R_B+R_2)(-D+R_B+R_2) } \end{array} .$$

A quick Matlab test: