12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #!/usr/bin/ruby
- class Circle(x,y,r) {
- method to_s { "Circle(#{x}, #{y}, #{r})" };
- }
- func solve_apollonius(Array c, Array s) -> Circle {
- var ๐ฃ11 = (2*c[1].x - 2*c[0].x);
- var ๐ฃ12 = (2*c[1].y - 2*c[0].y);
- var ๐ฃ13 = (c[0].x**2 - c[1].x**2 + c[0].y**2 - c[1].y**2 - c[0].r**2 + c[1].r**2);
- var ๐ฃ14 = (2*s[1]*c[1].r - 2*s[0]*c[0].r);
- var ๐ฃ21 = (2*c[2].x - 2*c[1].x);
- var ๐ฃ22 = (2*c[2].y - 2*c[1].y);
- var ๐ฃ23 = (c[1].x**2 - c[2].x**2 + c[1].y**2 - c[2].y**2 - c[1].r**2 + c[2].r**2);
- var ๐ฃ24 = (2*s[2]*c[2].r - 2*s[1]*c[1].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*๐*c[0].x + 2*๐*๐ - 2*๐*c[0].y + 2*s[0]*c[0].r);
- var ๐ = (c[0].x**2 + ๐**2 - 2*๐*c[0].x + ๐**2 + c[0].y**2 - 2*๐*c[0].y - c[0].r**2);
- var ๐ท = (๐**2 - 4*๐*๐);
- var rs = ((-๐ - ๐ท.sqrt.rat_approx) / 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)];
- var a = solve_apollonius(c, %n<1 1 1>);
- var b = solve_apollonius(c, %n<-1 -1 -1>);
- say a;
- say b;
- a.x == 2 || die "error";
- a.y == 21/10 || die "error";
- a.r == 39/10 || die "error";
- b.x == 2 || die "error";
- b.r == 7/6 || die "error";
|