Advertisement
pechkin350

bool SegmentsCross()

Apr 1st, 2015
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.83 KB | None | 0 0
  1. struct pt{double x, y; pt(){} pt(double a, double b){x = a; y = b;}};
  2. bool SegmentsCross(pt a1, pt a2, pt b1, pt b2)
  3. {
  4.     double Aa = a1.y - a2.y, Ba = a2.x - a1.x;
  5.     double Ca = - (Aa * a1.x + Ba * a1.y);
  6.     double Ab = b1.y - b2.y, Bb = b2.x - b1.x;
  7.     double Cb = - (Ab * b1.x + Bb * b1.y);
  8.     double
  9.         b1InA = Aa*b1.x + Ba*b1.y + Ca,
  10.         b2InA = Aa*b2.x + Ba*b2.y + Ca,
  11.         a1InB = Ab*a1.x + Bb*a1.y + Cb,
  12.         a2InB = Ab*a2.x + Bb*a2.y + Cb;
  13.     if (b1InA == 0 && b2InA == 0) // one line
  14.     {
  15.         if (a1.x > a2.x)
  16.             swap(a1.x, a2.x);
  17.         if (a1.y > a2.y)
  18.             swap(a1.y, a2.y);
  19.         return
  20.             a1.x <= b1.x && b1.x <= a2.x && a1.y <= b1.y && b1.y <= a2.y ||
  21.             a1.x <= b2.x && b2.x <= a2.x && a1.y <= b2.y && b2.y <= a2.y;
  22.     }
  23.     else
  24.         return !(b1InA < 0 && b2InA < 0 || a1InB < 0 && a2InB < 0 || b1InA > 0 && b2InA > 0 || a1InB > 0 && a2InB > 0);
  25. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement