Problem of Apollonius

class Circle(x,y,r) {
    method to_s { "Circle(#{x}, #{y}, #{r})" }
}
Β 
func solve_apollonius(c, s) {
Β 
    var(c1, c2, c3) = c...
    var(s1, s2, s3) = s...
Β 
    var 𝑣11 = (2*c2.x - 2*c1.x)
    var 𝑣12 = (2*c2.y - 2*c1.y)
    var 𝑣13 = (c1.x**2 - c2.x**2 + c1.y**2 - c2.y**2 - c1.r**2 + c2.r**2)
    var 𝑣14 = (2*s2*c2.r - 2*s1*c1.r)
Β 
    var 𝑣21 = (2*c3.x - 2*c2.x)
    var 𝑣22 = (2*c3.y - 2*c2.y)
    var 𝑣23 = (c2.x**2 - c3.x**2 + c2.y**2 - c3.y**2 - c2.r**2 + c3.r**2)
    var 𝑣24 = (2*s3*c3.r - 2*s2*c2.r)
Β 
    var 𝑀12 = (𝑣12 / 𝑣11)
    var 𝑀13 = (𝑣13 / 𝑣11)
    var 𝑀14 = (𝑣14 / 𝑣11)
Β 
    var 𝑀22 = (𝑣22/𝑣21 - 𝑀12)
    var 𝑀23 = (𝑣23/𝑣21 - 𝑀13)
    var 𝑀24 = (𝑣24/𝑣21 - 𝑀14)
Β 
    var 𝑃 = (-𝑀23 / 𝑀22)
    var 𝑄 = (𝑀24 / 𝑀22)
    var 𝑀 = (-𝑀12*𝑃 - 𝑀13)
    var 𝑁 = (𝑀14 - 𝑀12*𝑄)
Β 
    var π‘Ž = (𝑁**2 + 𝑄**2 - 1)
    var 𝑏 = (2*𝑀*𝑁 - 2*𝑁*c1.x + 2*𝑃*𝑄 - 2*𝑄*c1.y + 2*s1*c1.r)
    var 𝑐 = (c1.x**2 + 𝑀**2 - 2*𝑀*c1.x + 𝑃**2 + c1.y**2 - 2*𝑃*c1.y - c1.r**2)
Β 
    var 𝐷 = (𝑏**2 - 4*π‘Ž*𝑐)
    var rs = ((-𝑏 - 𝐷.sqrt) / 2*π‘Ž)
Β 
    var xs = (𝑀 + 𝑁*rs)
    var ys = (𝑃 + 𝑄*rs)
Β 
    Circle(xs, ys, rs)
}
Β 
var c = [Circle(0, 0, 1), Circle(4, 0, 1), Circle(2, 4, 2)]
say solve_apollonius(c, %n<1 1 1>)
say solve_apollonius(c, %n<-1 -1 -1>)

Output:

Circle(2, 2.1, 3.9)
Circle(2, 0.83333333333333333333333333333333333333325, 1.166666666666666666666666666666666666667)

Last updated

Was this helpful?