On this page
article
Half-plane intersection
Sobre
Cada half-plane eh identificado por uma reta e a regiao ccw a ela
O(n log n)
Link original: halfPlaneIntersection.cpp
Código
vector<pt> hp_intersection(vector<line> &v) {
deque<pt> dq = {{INF, INF}, {-INF, INF}, {-INF, -INF}, {INF, -INF}};
#warning considerar trocar por compare_angle
sort(v.begin(), v.end(), [&](line r, line s) { return angle(r.q-r.p) < angle(s.q-s.p); });
for(int i = 0; i < v.size() and dq.size() > 1; i++) {
pt p1 = dq.front(), p2 = dq.back();
while (dq.size() and !ccw(v[i].p, v[i].q, dq.back()))
p1 = dq.back(), dq.pop_back();
while (dq.size() and !ccw(v[i].p, v[i].q, dq.front()))
p2 = dq.front(), dq.pop_front();
if (!dq.size()) break;
if (p1 == dq.front() and p2 == dq.back()) continue;
dq.push_back(inter(v[i], line(dq.back(), p1)));
dq.push_front(inter(v[i], line(dq.front(), p2)));
if (dq.size() > 1 and dq.back() == dq.front()) dq.pop_back();
}
return vector<pt>(dq.begin(), dq.end());
}