niyaznigmatullin

Segments intersection

Feb 2nd, 2014
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.53 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3.  
  4. int vmul(int x0, int y0, int x1, int y1, int x2, int y2) {
  5.   x1 -= x0;
  6.   y1 -= y0;
  7.   x2 -= x0;
  8.   y2 -= y0;
  9.   int c = x1 * y2 - x2 * y1;
  10.   return c < 0 ? -1 : c > 0 ? 1 : 0;
  11. }
  12.  
  13. int main() {
  14.   freopen("segments.in", "r", stdin);
  15.   freopen("segments.out", "w", stdout);
  16.   int x1, y1, x2, y2, x3, y3, x4, y4;
  17.   scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
  18.   scanf("%d%d%d%d", &x3, &y3, &x4, &y4);
  19.   int v1 = vmul(x1, y1, x3, y3, x4, y4);
  20.   int v2 = vmul(x2, y2, x3, y3, x4, y4);
  21.   int u1 = vmul(x3, y3, x1, y1, x2, y2);
  22.   int u2 = vmul(x4, y4, x1, y1, x2, y2);
  23.   if (v1 == 0 && v2 == 0 && u1 == 0 && u2 == 0) {
  24.     int lx = std::max(std::min(x1, x2), std::min(x3, x4));
  25.     int rx = std::min(std::max(x1, x2), std::max(x3, x4));
  26.     int ly = std::max(std::min(y1, y2), std::min(y3, y4));
  27.     int ry = std::min(std::max(y1, y2), std::max(y3, y4));
  28.     if (lx > rx || ly > ry)
  29.       puts("Empty");
  30.     else {
  31.       if (lx < rx || ly < ry) {
  32.         if (vmul(lx, ly, x1, y1, x2, y2) != 0)
  33.           std::swap(ly, ry);
  34.         printf("%d %d\n%d %d\n", lx, ly, rx, ry);
  35.       } else {
  36.         printf("%d %d\n", lx, ly);
  37.       }
  38.     }
  39.   } else if (v1 != v2 && u1 != u2) {
  40.     double a1 = y2 - y1;
  41.     double b1 = x1 - x2;
  42.     double c1 = -x1 * a1 - y1 * b1;
  43.     double a2 = y4 - y3;
  44.     double b2 = x3 - x4;
  45.     double c2 = -x3 * a2 - y3 * b2;
  46.     double z = a1 * b2 - b1 * a2;
  47.     printf("%.17lf %.17lf\n", (b1 * c2 - c1 * b2) / z, (c1 * a2 - a1 * c2) / z);
  48.   } else {
  49.     puts("Empty");
  50.   }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment