diff --git a/fontes/geometry.h b/fontes/geometry.h deleted file mode 100644 index 5205be47cab64d9b6e3d100b1b7acdda518d7375..0000000000000000000000000000000000000000 --- a/fontes/geometry.h +++ /dev/null @@ -1,81 +0,0 @@ -#define aa first -#define bb second -#define px real() -#define py imag() - -typedef complex<double> pt; -typedef pair<pt, pt> seg; - -double dot(pt a, pt b) { return (conj(a) * b).px; } -double cross(pt a, pt b) { return (conj(a) * b).py; } -pt vec(pt a, pt b) { return b - a; } -pt vec(seg s) { return s.bb - s.aa; } - -bool on_segment(seg s, pt p) { - return cross(s.aa - p, s.bb - p) == 0 && dot(s.aa - p, s.bb - p) <= 0; -} - -int sgn(double v) { return (v > EPS) - (v < EPS); } - -int ord_ornt (seg s, pt c) { - return sgn(cross(vec(s), vec(s.bb, c))); -} - -bool intersect_seg(seg s, seg t) { - int o1 = ord_ornt(s, t.aa), o2 = ord_ornt(s, t.bb); - int o3 = ord_ornt(t, s.aa), o4 = ord_ornt(t, s.bb); - - return ( - (o1 != o2 && o3 != o4) || - (o1 == 0 && on_segment(s, t.aa)) || - (o2 == 0 && on_segment(s, t.bb)) || - (o3 == 0 && on_segment(t, s.aa)) || - (o4 == 0 && on_segment(t, s.bb))); -} - -// precondition is that they aren't collinear -pt point_in_line_line(seg a, seg b) { - return a.aa + vec(a) * (cross(vec(a.aa, b.aa), vec(b)) / cross(vec(a), vec(b))); -} - -pt point_in_seg(pt p, seg s) { - if (s.aa == s.bb) { return s.aa; } - double l = dot(vec(s.aa, p), vec(s)) / norm(vec(s)); - if (l < 0.0) { return s.aa; } - if (l > 1.0) { return s.bb; } - return s.aa + l*vec(s); -} - -double distance_seg_point(pt p, seg s) { - return abs(p - point_in_seg(p, s)); -} - -double distance_seg_seg(seg s, seg t) { - if (intersect_seg(s, t)) { return 0; } - double v1 = distance_seg_point(s.aa, t); - double v2 = distance_seg_point(s.bb, t); - double v3 = distance_seg_point(t.aa, s); - double v4 = distance_seg_point(t.bb, s); - return min({ v1, v2, v3, v4 }); -} - -bool is_inside_poly(vector<pt>& ps, pt p, bool strict) { - int n = ps.size(); - if (n < 3) { return false; } - int count = 0; - for (int i = 0; i < n; i++) { - int j = (i+1)%n; - if (on_segment(seg(ps[i], ps[j]), p)) { return strict; } - count ^= ((p.py < ps[i].py) - (p.py < ps[j].py)) - * ord_ornt(seg(ps[i], ps[j]), p) > 0; - } - return count; -} - -double polygon_area(vector<pt>& ps) { - double area = cross(ps[ps.size()-1], ps[0]); - for (int i = 1; i < ps.size(); i++) { - area += cross(ps[i-1], ps[i]); - } - return area / 2.0; -}