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?