This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub AlexanderNekrasov/Youthful-Passion-Fruit-teambook
/** * Author: Igor Markelov * Date: 2022-11-18 * Description: Is in polygon functions */ bool isOnSegment(point &a, point &b, point &x) { if (sign(len2(a - b)) == 0) { return sign(len(a - x)) == 0; } return sign((b - a) % (x - a)) == 0 && sign((b - x) * (a - x)) <= 0; // optional (slower, but works better if there are some precision // problems) return sign((b - a).len() - (x - a).len() - (x - b).len()) // == 0; } int isIn(vector<point> &p, point &a) { int n = p.size(); // depends on limitations(2*MAXC + 228) point b = a + point{2e9 + 228, 1}; int cnt = 0; for (int i = 0; i < n; ++i) { point x = p[i]; point y = p[i + 1 < n ? i + 1 : 0]; if (isOnSegment(x, y, a)) { // depends on the problem statement return 1; } cnt += intersects(x, y, a, b); } return 2 * (cnt % 2 == 1); /*optional (atan2 is VERY SLOW)! ld ans = 0; int n = p.size(); for (int i = 0; i < n; ++i) { Point x = p[i]; Point y = p[i + 1 < n ? i + 1 : 0]; if (isOnSegment(x, y, a)) { // depends on the problem statement return true; } x = x - a; y = y - a; ans += atan2(x ^ y, x * y); } return abs(ans) > 1;*/ } bool isInTriangle(point &a, point &b, point &c, point &x) { return sign((b - a) % (x - a)) >= 0 && sign((c - b) % (x - b)) >= 0 && sign((a - c) % (x - c)) >= 0; } // points should be in the counterclockwise order bool isInConvex(vector<point> &p, point &a) { int n = p.size(); assert(n >= 3); // assert(isConvex(p)); // assert(isCounterclockwise(p)); if (sign((p[1] - p[0]) % (a - p[0])) < 0) return 0; if (sign((p[n - 1] - p[0]) % (a - p[0])) > 0) return 0; int pos = lower_bound(p.begin() + 2, p.end(), a, [&](point a, point b) -> bool { return sign((a - p[0]) % (b - p[0])) > 0; }) - p.begin(); assert(pos > 1 && pos < n); return isInTriangle(p[0], p[pos - 1], p[pos], a); }
#line 1 "geometry/IsInPolygon.cpp" /** * Author: Igor Markelov * Date: 2022-11-18 * Description: Is in polygon functions */ bool isOnSegment(point &a, point &b, point &x) { if (sign(len2(a - b)) == 0) { return sign(len(a - x)) == 0; } return sign((b - a) % (x - a)) == 0 && sign((b - x) * (a - x)) <= 0; // optional (slower, but works better if there are some precision // problems) return sign((b - a).len() - (x - a).len() - (x - b).len()) // == 0; } int isIn(vector<point> &p, point &a) { int n = p.size(); // depends on limitations(2*MAXC + 228) point b = a + point{2e9 + 228, 1}; int cnt = 0; for (int i = 0; i < n; ++i) { point x = p[i]; point y = p[i + 1 < n ? i + 1 : 0]; if (isOnSegment(x, y, a)) { // depends on the problem statement return 1; } cnt += intersects(x, y, a, b); } return 2 * (cnt % 2 == 1); /*optional (atan2 is VERY SLOW)! ld ans = 0; int n = p.size(); for (int i = 0; i < n; ++i) { Point x = p[i]; Point y = p[i + 1 < n ? i + 1 : 0]; if (isOnSegment(x, y, a)) { // depends on the problem statement return true; } x = x - a; y = y - a; ans += atan2(x ^ y, x * y); } return abs(ans) > 1;*/ } bool isInTriangle(point &a, point &b, point &c, point &x) { return sign((b - a) % (x - a)) >= 0 && sign((c - b) % (x - b)) >= 0 && sign((a - c) % (x - c)) >= 0; } // points should be in the counterclockwise order bool isInConvex(vector<point> &p, point &a) { int n = p.size(); assert(n >= 3); // assert(isConvex(p)); // assert(isCounterclockwise(p)); if (sign((p[1] - p[0]) % (a - p[0])) < 0) return 0; if (sign((p[n - 1] - p[0]) % (a - p[0])) > 0) return 0; int pos = lower_bound(p.begin() + 2, p.end(), a, [&](point a, point b) -> bool { return sign((a - p[0]) % (b - p[0])) > 0; }) - p.begin(); assert(pos > 1 && pos < n); return isInTriangle(p[0], p[pos - 1], p[pos], a); }