Advertisement
Guest User

Segment and Line Intersection

a guest
Nov 27th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. Point lineIntersection(Line l1, Line l2) {
  2.     double z = l1.a * l2.b - l2.a * l1.b;
  3.     if (!z) {
  4.         return Point(-INF, -INF);
  5.     }
  6.     Point ans;
  7.     ans.y = (-l1.a * l2.c + l2.a * l1.c) / z;
  8.     ans.x = (l1.b * l2.c - l2.b * l1.c) / z;
  9.     return ans;
  10. }
  11.  
  12. Segment segmentIntersection(Segment s1, Segment s2) {
  13.     Vector v1(s1.a, s1.b), v2(s1.a, s2.a), v3(s1.a, s2.b);
  14.     Vector v4(s2.a, s2.b), v5(s2.a, s1.a), v6(s2.a, s1.b);
  15.     Segment ans;                                                
  16.     if (s1.a == s1.b || s2.a == s2.b) {
  17.         //S1 OR S2 IS A POINT
  18.         if (s1.a == s1.b && s2.a == s2.b) {
  19.             if (s1.a == s2.a)
  20.                 ans.a = ans.b = s1.a;
  21.             else
  22.                 ans.a.x = -INF, ans.a.y = -INF;        
  23.         }                  
  24.         else {
  25.             if (s1.a == s1.b) swap(s1, s2);
  26.             Point p = s2.a;  
  27.             Vector v1(p, s1.a), v2(p, s1.b);
  28.             if (dotProduct(v1, v2) <= 0 && crossProduct(v1, v2) == 0)
  29.                 ans.a = ans.b = p;
  30.             else
  31.                 ans.a.x = -INF, ans.a.y = -INF;    
  32.         }
  33.         return ans;
  34.     }
  35.     if (crossProduct(v1, v2) == 0 && crossProduct(v1, v3) == 0) {
  36.         //S1 AND S2 ARE COLINEAL
  37.         bool flag = 0;                                                    
  38.         if (s1.a.x == s1.b.x && s2.a.x == s2.b.x) {
  39.             swap(s1.a.x, s1.a.y);
  40.             swap(s1.b.x, s1.b.y);
  41.             swap(s2.a.x, s2.a.y);
  42.             swap(s2.b.x, s2.b.y);
  43.             flag = 1;        
  44.         }
  45.         if (s1.a.x > s1.b.x) swap(s1.a, s1.b);
  46.         if (s2.a.x > s2.b.x) swap(s2.a, s2.b);
  47.         if (s1.a.x > s2.a.x) swap(s1, s2);
  48.         if (s1.a.x <= s2.a.x && s2.a.x <= s1.b.x) {
  49.             ans.a = s2.a;
  50.             if (s1.b.x < s2.b.x) ans.b = s1.b;
  51.             else ans.b = s2.b;
  52.             if (flag) {
  53.                 swap(ans.a.x, ans.a.y);
  54.                 swap(ans.b.x, ans.b.y);
  55.             }
  56.             return ans;
  57.         }                                  
  58.     }                                                      
  59.     if ((crossProduct(v1, v2) * crossProduct(v1, v3) > 0) || (crossProduct(v4, v5) * crossProduct(v4, v6) > 0)) {
  60.         //S1 AND S2 DONT INTERSECT`
  61.         ans.a.x = -INF, ans.a.y = -INF;
  62.         return ans;
  63.     }      
  64.     Line l1(s1.a, s1.b), l2(s2.a, s2.b);
  65.     ans.a = ans.b = lineIntersection(l1, l2);
  66.     return ans;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement