Skip to content
Snippets Groups Projects
Commit f66bb900 authored by Fernando K's avatar Fernando K
Browse files

Remove arquivo geometry coberto por outros

parent dac6b0ab
No related branches found
No related tags found
No related merge requests found
#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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment