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.

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

  1. Pingback: Draw an Apollonian gasket in C# - C# HelperC# Helper

  2. Pingback: ゼロ除算(division by zero)1/0=0/0=z/0= tan (pi/2)=0 | rkernel

  3. Pingback: 令和(れいわ) | rkernel

  4. Pingback: 世界を一変させた発見や科学技術の初版本およそ130冊!「世界を変えた書物」展 | rkernel


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.