Advertisement
leokostarev

Untitled

Apr 5th, 2024
897
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. double eps = 1e-5;
  6.  
  7. // полный пиздец, больше никогда в жизни не пишу геому
  8. // снизу жизни нет, там только смерть, ужас и страдания
  9. // небольшой стишок
  10. /*
  11.  * Ах, геому я вертел,
  12.  * Кайфануть он захотел...
  13.  * Но задача номер D
  14.  * Отебашила МЕНЯ К ХУЯМ СОБАЧИМ О КАКОЙ ПОЭЗИИ МОЖЕТ ИДТИ РЕЧЬ, КОГДА Я ПИЩУ НА ЯЗЫКЕ КОТОРОМУ ЛЕТ 70
  15.  */
  16. /*
  17. ████████████████████████████████████████
  18. ████████████▓▒▒▒░░░░░░░░▒▒▒▓████████████
  19. ███████░────────────────────────▒███████
  20. ████▒──────────────────────────────▒████
  21. ███▒─────────────────────────────────███
  22. ███──────────────────────────────────▓██
  23. ██░───────────────────────────────────██
  24. ██───░███████▒────────────▒███████░───██
  25. ██──▓█▓░████████░──────░████████░▓█▓──██
  26. █▓─░░─────░▓█████▒────▓█████▓░─────░──▓█
  27. █▒───────────▓██▓─────░▒██▓───────────▓█
  28. █░─────────────██──────██─────────────▒█
  29. █░───▒███████▒──██────░▓──▒███████▒───░█
  30. █░─▒███████████─██──────░███████████▒░░█
  31. █░─████▓▓▓▓▓▓▒░─██░──────▒▒░░░░░▒░░░░─▒█
  32. █░──────────────██░───────────────────░█
  33. ██─────────────░██░───────────────────░█
  34. ███────────────▓██────────────────────██
  35. ██▓█──────────▒███─────░▒───────────░███
  36. ██─████▒▒▓▒░░█████─────▒██──▒▓▒░░▒▒█▒███
  37. ███─█▓██────▒█▒─██───────▓░─░▒░▒████─███
  38. ███▒─█▒██───────█▓─────────────██─█─▒███
  39. ████░─█▓███▓░───██▒▒▒▓█░────░███─█▒─████
  40. █████──█▓▒█████████▓███████████░█▓─█████
  41. ██████──██──▒█████░──███████▒──█▓─██████
  42. ███████──██▓──────░░░░░░──────█▒─███████
  43. ████████──██▓░▒▒░░───────────█▒─████████
  44. █████████──█▒──░░▒████▒────░█░─█████████
  45. ██████████─░█─────███▒─────▒░─██████████
  46. ███████████░─────▒████───────███████████
  47. █████████████────█████─────░████████████
  48. ██████████████───▓████────▓█████████████
  49. ███████████████───███░──░███████████████
  50. █████████████████▒███▒▒█████████████████
  51. ████████████████████████████████████████
  52. ████████████████████████████████████████
  53. ██████──█──██────██─██─██───██────██████
  54. ███████───███─██─██─█─███─████─██─██████
  55. ████████─████────██──████───██────██████
  56. ███████───███─██─██─█─███─████─█████████
  57. ██████──█──██─██─██─██─██───██─█████████
  58. ████████████████████████████████████████
  59. */
  60.  
  61. struct Point {
  62.     double x, y;
  63.  
  64.     Point() : x(0), y(0) {}
  65.  
  66.     Point(double x, double y) : x(x), y(y) {}
  67. };
  68.  
  69. Point operator+(Point a, Point b) {
  70.     return {a.x + b.x, a.y + b.y};
  71. }
  72.  
  73. Point operator-(Point a, Point b) {
  74.     return {a.x - b.x, a.y - b.y};
  75. }
  76.  
  77. Point operator*(double a, Point b) {
  78.     return {a * b.x, a * b.y};
  79. }
  80.  
  81. double operator*(Point a, Point b) {
  82.     return a.x * b.x + a.y * b.y;
  83. }
  84.  
  85.  
  86. double operator^(Point a, Point b) {
  87.     return a.x * b.y - a.y * b.x;
  88. }
  89.  
  90. istream& operator>>(istream& in, Point& p) {
  91.     in >> p.x >> p.y;
  92.     return in;
  93. }
  94.  
  95. struct Line {
  96.     double a, b, c;
  97.     Point some;
  98.  
  99.     Line(Point p1, Point p2) {
  100.         a = p2.y - p1.y;
  101.         b = p1.x - p2.x;
  102.         c = -a * p1.x - b * p1.y;
  103.         some = p1;
  104.     }
  105. };
  106.  
  107. struct Ray {
  108.     Point p;
  109.     Point dir;
  110.     Line l;
  111.  
  112.     Ray(Point p1, Point p2) : p(p1), dir(p2 - p1), l(Line(p1, p2)) {}
  113. };
  114.  
  115. struct Segment {
  116.     Point a, b;
  117.     Line l;
  118.  
  119.     Segment(Point a, Point b) : a(a), b(b), l(Line(a, b)) {}
  120. };
  121.  
  122.  
  123. double dist(Point a, Point b) {
  124.     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
  125. }
  126.  
  127. double dist(Point p, Line l) {
  128.     return abs(l.a * p.x + l.b * p.y + l.c) / sqrt(l.a * l.a + l.b * l.b);
  129. }
  130.  
  131. double dist(Point p, Ray r) {
  132.     double angle = r.dir * (p - r.p);
  133.  
  134.     if (angle < 0) {
  135.         return dist(r.p, p);
  136.     }
  137.  
  138.     return dist(p, r.l);
  139. }
  140.  
  141. double dist(Point p, Segment s) {
  142.     double angleA = (s.b - s.a) * (p - s.a);
  143.  
  144.     if (angleA <= 0) {
  145.         return dist(s.a, p);
  146.     }
  147.  
  148.     double angleB = (s.b - s.a) * (p - s.b);
  149.  
  150.     if (angleB >= 0) {
  151.         return dist(s.b, p);
  152.     }
  153.  
  154.     return dist(p, s.l);
  155. }
  156.  
  157. // point / infinite/no intersections
  158. variant<Point, bool> intersect(Line l1, Line l2) {
  159.     Point A(l1.a, l1.b), B(l2.a, l2.b);
  160.  
  161.     if (abs(A ^ B) < eps) {
  162.         return abs(l1.some.x * l2.a + l1.some.y * l2.b + l2.c) < eps;
  163.     }
  164.  
  165.  
  166.     double y = (l1.a * l2.c - l2.a * l1.c) / (l1.b * l2.a - l1.a * l2.b);
  167.     double x;
  168.     if (abs(l1.a) > eps) {
  169.         x = (-l1.c - l1.b * y) / l1.a;
  170.     } else {
  171.         x = (-l2.c - l2.b * y) / l2.a;
  172.     }
  173.     return Point(x, y);
  174. }
  175.  
  176. double dist(Segment s1, Segment s2) {
  177.     double pts = min({dist(s1.a, s2),
  178.                       dist(s1.b, s2),
  179.                       dist(s2.a, s1),
  180.                       dist(s2.b, s1)});
  181.  
  182.     auto i = intersect(s1.l, s2.l);
  183.  
  184.     if (holds_alternative<Point>(i)) {
  185.         Point p = get<Point>(i);
  186.  
  187.         if (dist(p, s1) < eps && dist(p, s2) < eps)
  188.             pts = 0;
  189.     }
  190.  
  191.     return pts;
  192. }
  193.  
  194.  
  195. double dist(Ray r, Segment s) {
  196.     double pts = min({dist(r.p, s),
  197.                       dist(s.a, r),
  198.                       dist(s.b, r)});
  199.  
  200.     auto i = intersect(r.l, s.l);
  201.     if (holds_alternative<Point>(i)) {
  202.         Point p = get<Point>(i);
  203.  
  204.         if (dist(p, s) < eps && dist(p, r) < eps)
  205.             pts = 0;
  206.     }
  207.  
  208.     return pts;
  209. }
  210.  
  211. double dist(Line l, Segment s) {
  212.     double pts = min(dist(s.a, l),
  213.                      dist(s.b, l));
  214.  
  215.     auto i = intersect(l, s.l);
  216.  
  217.     if (holds_alternative<Point>(i)) {
  218.         Point p = get<Point>(i);
  219.  
  220.         if (dist(p, s) < eps && dist(p, l) < eps)
  221.             pts = 0;
  222.     }
  223.  
  224.     return pts;
  225. }
  226.  
  227. double dist(Ray r1, Ray r2) {
  228.     double pts = min(dist(r1.p, r2),
  229.                      dist(r2.p, r1));
  230.  
  231.     auto i = intersect(r1.l, r2.l);
  232.  
  233.     if (holds_alternative<Point>(i)) {
  234.         Point p = get<Point>(i);
  235.  
  236.         if (dist(p, r1) < eps && dist(p, r2) < eps)
  237.             pts = 0;
  238.     }
  239.  
  240.     return pts;
  241. }
  242.  
  243. double dist(Line l, Ray r) {
  244.     double pts = dist(r.p, l);
  245.  
  246.     auto i = intersect(l, r.l);
  247.  
  248.     if (holds_alternative<Point>(i)) {
  249.         Point p = get<Point>(i);
  250.  
  251.         if (dist(p, l) < eps && dist(p, r) < eps)
  252.             pts = 0;
  253.     }
  254.  
  255.     return pts;
  256. }
  257.  
  258. double dist(Line l1, Line l2) {
  259.     auto i = intersect(l1, l2);
  260.  
  261.     if (holds_alternative<Point>(i)) {
  262.         return 0;
  263.     } else {
  264.         if (get<bool>(i))
  265.             return 0;
  266.  
  267.         return dist(l1.some, l2);
  268.     }
  269. }
  270.  
  271. int main() {
  272.     Point a, b, c, d;
  273.     cin >> a >> b >> c >> d;
  274.  
  275.     cout << fixed << setprecision(10);
  276.  
  277.     cout << dist(a, c) << '\n';
  278.     cout << dist(a, Segment(c, d)) << '\n';
  279.     cout << dist(a, Ray(c, d)) << '\n';
  280.     cout << dist(a, Line(c, d)) << '\n';
  281.  
  282.     cout << dist(c, Segment(a, b)) << '\n';
  283.     cout << dist(Segment(a, b), Segment(c, d)) << '\n';
  284.     cout << dist(Ray(c, d), Segment(a, b)) << '\n';
  285.     cout << dist(Line(c, d), Segment(a, b)) << '\n';
  286.  
  287.     cout << dist(c, Ray(a, b)) << '\n';
  288.     cout << dist(Ray(a, b), Segment(c, d)) << '\n';
  289.     cout << dist(Ray(a, b), Ray(c, d)) << '\n';
  290.     cout << dist(Line(c, d), Ray(a, b)) << '\n';
  291.  
  292.     cout << dist(c, Line(a, b)) << '\n';
  293.     cout << dist(Line(a, b), Segment(c, d)) << '\n';
  294.     cout << dist(Line(a, b), Ray(c, d)) << '\n';
  295.     cout << dist(Line(a, b), Line(c, d)) << '\n';
  296. }
  297.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement