Guest User

100168 J

a guest
Jan 28th, 2021
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4.  
  5. #define FILE_NAME "distance5"
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11. #ifdef ONLINE_JUDGE
  12.     freopen(FILE_NAME".in", "r", stdin);
  13.     freopen(FILE_NAME".out", "w", stdout);
  14. #endif
  15.  
  16.     double x1, y1, x2, y2, x3, y3, x4, y4;
  17.     scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
  18.  
  19.     auto dist = [](double x1, double y1, double x2, double y2) {
  20.         return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  21.     };
  22.     double d = min({dist(x1, y1, x3, y3), dist(x1, y1, x4, y4), dist(x2, y2, x3, y3), dist(x2, y2, x4, y4)});
  23.     double a1 = y1 - y2, b1 = x2 - x1, c1 = x1 * y2 - y1 * x2;
  24.     double a2 = y3 - y4, b2 = x4 - x3, c2 = x3 * y4 - y3 * x4;
  25.     double yp = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
  26.     double xp = a1 != 0.0 ? (-b1 * yp - c1) / a1 : (-b2 * yp - c2) / a2;
  27.     double k1 = x2 != x1 ? (xp - x1) / (x2 - x1) : (yp - y1) / (y2 - y1);
  28.     double k2 = x4 != x3 ? (xp - x3) / (x4 - x3) : (yp - y3) / (y4 - y3);
  29.     if (k1 >= 0.0 && k1 <= 1.0 && k2 >= 0.0 && k2 <= 1.0)
  30.         d = 0.0;
  31.     else
  32.     {
  33.         auto perp = [&d, &dist](double x, double y, double x1, double y1, double x2, double y2) {
  34.             double a = y1 - y2, b = x2 - x1, c = x1 * y2 - y1 * x2;
  35.             double k = (-a * x - b * y - c) / (a * a + b * b);
  36.             double xp = x + a * k, yp = y + b * k;
  37.             double kp = x2 != x1 ? (xp - x1) / (x2 - x1) : (yp - y1) / (y2 - y1);
  38.             if (kp >= 0.0 && kp <= 1.0)
  39.                 d = min(d, dist(x, y, xp, yp));
  40.         };
  41.         perp(x1, y1, x3, y3, x4, y4);
  42.         perp(x2, y2, x3, y3, x4, y4);
  43.         perp(x3, y3, x1, y1, x2, y2);
  44.         perp(x4, y4, x1, y1, x2, y2);
  45.     }
  46.  
  47.     printf("%.12lf\n", d);
  48.  
  49.     return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment