Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #define FILE_NAME "distance5"
- using namespace std;
- int main()
- {
- #ifdef ONLINE_JUDGE
- freopen(FILE_NAME".in", "r", stdin);
- freopen(FILE_NAME".out", "w", stdout);
- #endif
- double x1, y1, x2, y2, x3, y3, x4, y4;
- scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
- auto dist = [](double x1, double y1, double x2, double y2) {
- return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
- };
- double d = min({dist(x1, y1, x3, y3), dist(x1, y1, x4, y4), dist(x2, y2, x3, y3), dist(x2, y2, x4, y4)});
- double a1 = y1 - y2, b1 = x2 - x1, c1 = x1 * y2 - y1 * x2;
- double a2 = y3 - y4, b2 = x4 - x3, c2 = x3 * y4 - y3 * x4;
- double yp = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
- double xp = a1 != 0.0 ? (-b1 * yp - c1) / a1 : (-b2 * yp - c2) / a2;
- double k1 = x2 != x1 ? (xp - x1) / (x2 - x1) : (yp - y1) / (y2 - y1);
- double k2 = x4 != x3 ? (xp - x3) / (x4 - x3) : (yp - y3) / (y4 - y3);
- if (k1 >= 0.0 && k1 <= 1.0 && k2 >= 0.0 && k2 <= 1.0)
- d = 0.0;
- else
- {
- auto perp = [&d, &dist](double x, double y, double x1, double y1, double x2, double y2) {
- double a = y1 - y2, b = x2 - x1, c = x1 * y2 - y1 * x2;
- double k = (-a * x - b * y - c) / (a * a + b * b);
- double xp = x + a * k, yp = y + b * k;
- double kp = x2 != x1 ? (xp - x1) / (x2 - x1) : (yp - y1) / (y2 - y1);
- if (kp >= 0.0 && kp <= 1.0)
- d = min(d, dist(x, y, xp, yp));
- };
- perp(x1, y1, x3, y3, x4, y4);
- perp(x2, y2, x3, y3, x4, y4);
- perp(x3, y3, x1, y1, x2, y2);
- perp(x4, y4, x1, y1, x2, y2);
- }
- printf("%.12lf\n", d);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment