problem_of_apollonius.sf 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/ruby
  2. class Circle(x,y,r) {
  3. method to_s { "Circle(#{x}, #{y}, #{r})" };
  4. }
  5. func solve_apollonius(Array c, Array s) -> Circle {
  6. var ๐‘ฃ11 = (2*c[1].x - 2*c[0].x);
  7. var ๐‘ฃ12 = (2*c[1].y - 2*c[0].y);
  8. 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);
  9. var ๐‘ฃ14 = (2*s[1]*c[1].r - 2*s[0]*c[0].r);
  10. var ๐‘ฃ21 = (2*c[2].x - 2*c[1].x);
  11. var ๐‘ฃ22 = (2*c[2].y - 2*c[1].y);
  12. 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);
  13. var ๐‘ฃ24 = (2*s[2]*c[2].r - 2*s[1]*c[1].r);
  14. var ๐‘ค12 = (๐‘ฃ12 / ๐‘ฃ11);
  15. var ๐‘ค13 = (๐‘ฃ13 / ๐‘ฃ11);
  16. var ๐‘ค14 = (๐‘ฃ14 / ๐‘ฃ11);
  17. var ๐‘ค22 = (๐‘ฃ22/๐‘ฃ21 - ๐‘ค12);
  18. var ๐‘ค23 = (๐‘ฃ23/๐‘ฃ21 - ๐‘ค13);
  19. var ๐‘ค24 = (๐‘ฃ24/๐‘ฃ21 - ๐‘ค14);
  20. var ๐‘ƒ = (-๐‘ค23 / ๐‘ค22);
  21. var ๐‘„ = (๐‘ค24 / ๐‘ค22);
  22. var ๐‘€ = ((-๐‘ค12)*๐‘ƒ - ๐‘ค13);
  23. var ๐‘ = (๐‘ค14 - ๐‘ค12*๐‘„);
  24. var ๐‘Ž = (๐‘**2 + ๐‘„**2 - 1);
  25. var ๐‘ = (2*๐‘€*๐‘ - 2*๐‘*c[0].x + 2*๐‘ƒ*๐‘„ - 2*๐‘„*c[0].y + 2*s[0]*c[0].r);
  26. var ๐‘ = (c[0].x**2 + ๐‘€**2 - 2*๐‘€*c[0].x + ๐‘ƒ**2 + c[0].y**2 - 2*๐‘ƒ*c[0].y - c[0].r**2);
  27. var ๐ท = (๐‘**2 - 4*๐‘Ž*๐‘);
  28. var rs = ((-๐‘ - ๐ท.sqrt.rat_approx) / 2*๐‘Ž);
  29. var xs = (๐‘€ + ๐‘*rs);
  30. var ys = (๐‘ƒ + ๐‘„*rs);
  31. Circle(xs, ys, rs);
  32. }
  33. var c = [Circle(0, 0, 1), Circle(4, 0, 1), Circle(2, 4, 2)];
  34. var a = solve_apollonius(c, %n<1 1 1>);
  35. var b = solve_apollonius(c, %n<-1 -1 -1>);
  36. say a;
  37. say b;
  38. a.x == 2 || die "error";
  39. a.y == 21/10 || die "error";
  40. a.r == 39/10 || die "error";
  41. b.x == 2 || die "error";
  42. b.r == 7/6 || die "error";