Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Point lineIntersection(Line l1, Line l2) {
- double z = l1.a * l2.b - l2.a * l1.b;
- if (!z) {
- return Point(-INF, -INF);
- }
- Point ans;
- ans.y = (-l1.a * l2.c + l2.a * l1.c) / z;
- ans.x = (l1.b * l2.c - l2.b * l1.c) / z;
- return ans;
- }
- Segment segmentIntersection(Segment s1, Segment s2) {
- Vector v1(s1.a, s1.b), v2(s1.a, s2.a), v3(s1.a, s2.b);
- Vector v4(s2.a, s2.b), v5(s2.a, s1.a), v6(s2.a, s1.b);
- Segment ans;
- if (s1.a == s1.b || s2.a == s2.b) {
- //S1 OR S2 IS A POINT
- if (s1.a == s1.b && s2.a == s2.b) {
- if (s1.a == s2.a)
- ans.a = ans.b = s1.a;
- else
- ans.a.x = -INF, ans.a.y = -INF;
- }
- else {
- if (s1.a == s1.b) swap(s1, s2);
- Point p = s2.a;
- Vector v1(p, s1.a), v2(p, s1.b);
- if (dotProduct(v1, v2) <= 0 && crossProduct(v1, v2) == 0)
- ans.a = ans.b = p;
- else
- ans.a.x = -INF, ans.a.y = -INF;
- }
- return ans;
- }
- if (crossProduct(v1, v2) == 0 && crossProduct(v1, v3) == 0) {
- //S1 AND S2 ARE COLINEAL
- bool flag = 0;
- if (s1.a.x == s1.b.x && s2.a.x == s2.b.x) {
- swap(s1.a.x, s1.a.y);
- swap(s1.b.x, s1.b.y);
- swap(s2.a.x, s2.a.y);
- swap(s2.b.x, s2.b.y);
- flag = 1;
- }
- if (s1.a.x > s1.b.x) swap(s1.a, s1.b);
- if (s2.a.x > s2.b.x) swap(s2.a, s2.b);
- if (s1.a.x > s2.a.x) swap(s1, s2);
- if (s1.a.x <= s2.a.x && s2.a.x <= s1.b.x) {
- ans.a = s2.a;
- if (s1.b.x < s2.b.x) ans.b = s1.b;
- else ans.b = s2.b;
- if (flag) {
- swap(ans.a.x, ans.a.y);
- swap(ans.b.x, ans.b.y);
- }
- return ans;
- }
- }
- if ((crossProduct(v1, v2) * crossProduct(v1, v3) > 0) || (crossProduct(v4, v5) * crossProduct(v4, v6) > 0)) {
- //S1 AND S2 DONT INTERSECT`
- ans.a.x = -INF, ans.a.y = -INF;
- return ans;
- }
- Line l1(s1.a, s1.b), l2(s2.a, s2.b);
- ans.a = ans.b = lineIntersection(l1, l2);
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement