Advertisement
Arrias

Untitled

Jul 21st, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define double long double
  4. #pragma comment(linker, "/STACK:10000000000")
  5. #include <cassert>
  6. #define eps 1e-9
  7.  
  8. using namespace std;
  9.  
  10. struct point {
  11. double x, y;
  12. };
  13.  
  14. struct line {
  15. double a, b, c;
  16. };
  17.  
  18. int sq(const vector<point> & fig) {
  19. double res = 0;
  20. for (unsigned i = 0; i < fig.size(); i++) {
  21. point
  22. p1 = i ? fig[i - 1] : fig.back(),
  23. p2 = fig[i];
  24. res += (p1.x - p2.x) * (p1.y + p2.y);
  25. }
  26. return fabs(res);
  27. }
  28.  
  29. point a[8];
  30.  
  31. int get_sqrt_triangle(point a, point b, point c) {
  32. point FIR = {a.x - b.x, a.y - b.y};
  33. point SEC = {a.x - c.x, a.y - c.y};
  34. return abs(FIR.x * SEC.y - SEC.x *FIR.y);
  35. }
  36.  
  37. double dist(point a, point b) {
  38. return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
  39. }
  40.  
  41. void in(point &a) {
  42. cin >> a.x >> a.y;
  43. }
  44.  
  45. bool point_in_box(point t, point p1, point p2) {
  46. return (abs(t.x - min(p1.x, p2.x)) <= eps || min(p1.x, p2.x) <= t.x) &&
  47. (abs(max(p1.x, p2.x) - t.x) <= eps || max(p1.x, p2.x) >= t.x) &&
  48. (abs(t.y - min(p1.y, p2.y)) <= eps || min(p1.y, p2.y) <= t.y) &&
  49. (abs(max(p1.y, p2.y) - t.y) <= eps || max(p1.y, p2.y) >= t.y);
  50. }
  51.  
  52. point closest_point(line l, point p) {
  53. double k = (l.a * p.x + l.b * p.y + l.c) / (l.a * l.a + l.b * l.b);
  54. return point{p.x - l.a * k, p.y - l.b * k};
  55. }
  56.  
  57. line toline(point p1, point p2) {
  58. double a = p2.y - p1.y;
  59. double b = p1.x - p2.x;
  60.  
  61. return line{a, b, -a * p1.x - b * p1.y};
  62. }
  63.  
  64.  
  65. double dist_point_to_segment(point p, point p1, point p2) {
  66. point t = closest_point(toline(p1, p2), p);
  67.  
  68. if (point_in_box(t, p1, p2))
  69. return dist(p, t);
  70. else
  71. return min(dist(p, p1), dist(p, p2));
  72. }
  73.  
  74. signed main(void) {
  75. point a, b, c;
  76. cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
  77. cout << fixed << setprecision(10) << dist_point_to_segment(a, b, c) << '\n';
  78.  
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement