Find circles that are tangent to three given circles (Apollonius’ Problem) in C#

[Apollonius' Problem]

Given three objects that can be a point, line, or circle, you can try to draw circles that are tangent to each. The case using three circles is called Apollonius’ Problem. Originally these problems were studied by Euclid (ca. 300 BC) and Apollonius of Perga (ca. 262 BC – ca. 190 BC) and they were solved geometrically with straight edge and compass.

This example solves Apollonius’ Problem by finding solutions to the three following equations algebraically.

    (X - X1)2 + (Y - Y1)2 = (R ± R1)2
    (X - X2)2 + (Y - Y2)2 = (R ± R2)2
    (X - X3)2 + (Y - Y3)2 = (R ± R3)2

Unfortunately solving the equations requires dividing by some terms that may be zero and in those cases the solution doesn’t work. In some cases that’s because some solutions are degenerate. For example, suppose the three circles have the same radii and are all tangent to the X axis. Then two of the tangent “circles” are actually lines, one along the X axis and one parallel to the X axis on the other side of the circles.

In other cases the division by zero seems to be caused by the method for solving the equations and real solutions do exist. This is a tricky problem and I haven’t yet found a solution. If you figure out how to solve these equations without these problems, please let me know.

For more discussion of the problem and how to solve the equations, see:

See the code for additional details about how this program works.

Download Example   Follow me on Twitter   RSS feed   Donate

This entry was posted in algorithms, drawing, graphics, mathematics and tagged , , , , , , , , , , , , , . Bookmark the permalink.