37 lines
1.5 KiB
Text
37 lines
1.5 KiB
Text
DIM Circle{x, y, r}
|
|
DIM Circles{(2)} = Circle{}
|
|
Circles{(0)}.x = 0 : Circles{(0)}.y = 0 : Circles{(0)}.r = 1
|
|
Circles{(1)}.x = 4 : Circles{(1)}.y = 0 : Circles{(1)}.r = 1
|
|
Circles{(2)}.x = 2 : Circles{(2)}.y = 4 : Circles{(2)}.r = 2
|
|
|
|
@% = &2030A
|
|
REM Solution for internal circle:
|
|
PROCapollonius(Circle{}, Circles{()}, -1, -1, -1)
|
|
PRINT "Internal: x = ";Circle.x ", y = ";Circle.y ", r = ";Circle.r
|
|
REM Solution for external circle:
|
|
PROCapollonius(Circle{}, Circles{()}, 1, 1, 1)
|
|
PRINT "External: x = ";Circle.x ", y = ";Circle.y ", r = ";Circle.r
|
|
END
|
|
|
|
DEF PROCapollonius(c{}, c{()}, s0, s1, s2)
|
|
LOCAL x0, x1, x2, y0, y1, y2, r0, r1, r2, a, b, c
|
|
LOCAL u(), v(), w() : DIM u(2), v(2), w(2)
|
|
x0 = c{(0)}.x : y0 = c{(0)}.y : r0 = c{(0)}.r
|
|
x1 = c{(1)}.x : y1 = c{(1)}.y : r1 = c{(1)}.r
|
|
x2 = c{(2)}.x : y2 = c{(2)}.y : r2 = c{(2)}.r
|
|
|
|
u() = 2*y1-2*y0, x0*x0-x1*x1+y0*y0-y1*y1-r0*r0+r1*r1, 2*s1*r1-2*s0*r0
|
|
v() = 2*y2-2*y1, x1*x1-x2*x2+y1*y1-y2*y2-r1*r1+r2*r2, 2*s2*r2-2*s1*r1
|
|
w() = u() / (2*x1 - 2*x0)
|
|
u() = v() / (2*x2 - 2*x1) - w()
|
|
u() /= u(0)
|
|
w(1) -= w(0)*u(1)
|
|
w(2) -= w(0)*u(2)
|
|
a = w(2)*w(2) + u(2)*u(2) - 1
|
|
b = -2*w(1)*w(2) - 2*w(2)*x1 - 2*u(1)*u(2) - 2*u(2)*y1 + 2*s1*r1
|
|
c = x1*x1 + w(1)*w(1) + 2*w(1)*x1 + u(1)*u(1) + y1*y1 + 2*u(1)*y1 - r1*r1
|
|
|
|
c.r = (-b - SQR(b^2 - 4*a*c)) / (2*a)
|
|
c.x = c.r * w(2) - w(1)
|
|
c.y = c.r * u(2) - u(1)
|
|
ENDPROC
|