On this page
article
Angle Range Intersection
Sobre
Computa intersecao de angulos
Os angulos (arcos) precisam ter comprimeiro < pi
(caso contrario a intersecao eh estranha)
Tudo O(1)
Link original: angleRange.cpp
Código
struct angle_range {
static constexpr ld ALL = 1e9, NIL = -1e9;
ld l, r;
angle_range() : l(ALL), r(ALL) {}
angle_range(ld l_, ld r_) : l(l_), r(r_) { fix(l), fix(r); }
void fix(ld& theta) {
if (theta == ALL or theta == NIL) return;
if (theta > 2*pi) theta -= 2*pi;
if (theta < 0) theta += 2*pi;
}
bool empty() { return l == NIL; }
bool contains(ld q) {
fix(q);
if (l == ALL) return true;
if (l == NIL) return false;
if (l < r) return l < q and q < r;
return q > l or q < r;
}
friend angle_range operator &(angle_range p, angle_range q) {
if (p.l == ALL or q.l == NIL) return q;
if (q.l == ALL or p.l == NIL) return p;
if (p.l > p.r and q.l > q.r) return {max(p.l, q.l) , min(p.r, q.r)};
if (q.l > q.r) swap(p.l, q.l), swap(p.r, q.r);
if (p.l > p.r) {
if (q.r > p.l) return {max(q.l, p.l) , q.r};
else if (q.l < p.r) return {q.l, min(q.r, p.r)};
return {NIL, NIL};
}
if (max(p.l, q.l) > min(p.r, q.r)) return {NIL, NIL};
return {max(p.l, q.l), min(p.r, q.r)};
}
};