
Task

Implement a solution to the Problem of Apollonius   (description on Wikipedia)   which is the problem of finding the circle that is tangent to three specified circles   (colored black in the diagram below to the right).

There is an   algebraic solution   which is pretty straightforward.



The solutions to the example in the code are shown in the diagram   (below and to the right).

The red circle is "internally tangent" to all three black circles,   and the green circle is "externally tangent" to all three black circles.




 
circle1$ = "  0.000,  0.000,  1.000"
circle2$ = "  4.000,  0.000,  1.000"
circle3$ = "  2.000,  4.000,  2.000"
 
subroutine ApolloniusSolver(c1$, c2$, c3$, s1, s2, s3)
	x1 = int(mid(c1$, 3, 1)): y1 = int(mid(c1$, 11, 1)): r1 = int(mid(c1$, 19, 1))
	x2 = int(mid(c2$, 3, 1)): y2 = int(mid(c2$, 11, 1)): r2 = int(mid(c2$, 19, 1))
	x3 = int(mid(c3$, 3, 1)): y3 = int(mid(c3$, 11, 1)): r3 = int(mid(c3$, 19, 1))
 
	v11 = 2 * x2 - 2 * x1
	v12 = 2 * y2 - 2* y1
	v13 = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2 - r1 * r1 + r2 * r2
	v14 = 2 * s2 * r2 - 2 * s1 * r1
 
	v21 = 2 * x3 - 2 * x2
	v22 = 2 * y3 - 2 * y2
	v23 = x2 * x2 - x3 * x3 + y2 * y2 - y3 * y3 - r2 * r2 + r3 * r3
	v24 = 2 * s3 * r3 - 2 * s2 * r2
 
	w12 = v12 / v11
	w13 = v13 / v11
	w14 = v14 / v11
 
	w22 = v22 / v21 - w12
	w23 = v23 / v21 - w13
	w24 = v24 / v21 - w14
 
	P   = 0 - w23 / w22
	Q   =     w24 / w22
	M   = 0 - w12 * P - w13
	N   =     w14 - w12 *  Q
 
	a   = N * N + Q * Q - 1
	b   = 2 * M * N - 2 * N * x1 + 2 * P * Q - 2 * Q * y1 + 2 * s1 * r1
	c   = x1 * x1 + M * M -2 * M * x1 + P * P + y1 * y1 - 2 * P * y1 - r1 * r1
 
	D   = b *  b - 4 * a * c
 
	Radius = (0 - b - sqr(D)) / (2 * a)
	XPos   = M + N * Radius
	YPos   = P + Q * Radius
 
	print " "; XPos; ", " ; YPos; ", " ; Radius
end subroutine
 
print "  x_pos   y_pos   radius"
print circle1$
print circle2$
print circle3$
print
print "R1: " : call ApolloniusSolver(circle1$, circle2$, circle3$,  1,  1,  1)
print "R2: " : call ApolloniusSolver(circle1$, circle2$, circle3$, -1, -1, -1)
end
 