#include <bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;++i)
#define _rep(i,a,b) for(int i=a;i<=b;++i)
#define FREE freopen("in.txt","r",stdin)
#define FREO freopen("out.txt","w",stdout)
#define ls l, m, rt << 1
#define rs m + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef long double LD;
struct Point {
LD x, y;
Point(LD x = 0, LD y = 0) :x(x), y(y) {}
void input() { cin >> x >> y; }
void output() { cout << x << " " << y << endl; }
};
typedef Point Vector;
typedef vector<Point> Polygon;
Vector operator+ (Vector A, Vector B) { return Vector(A.x + B.x, A.y - B.y); }
Vector operator- (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
Vector operator* (Vector A, LD p) { return Vector(A.x * p, A.y * p); }
Vector operator/ (Vector A, LD p) { return Vector(A.x / p, A.y / p); }
bool operator< (const Point& a, const Point& b) {
return a.x < b.x || a.x == b.x&&a.y < b.y;
}
const LD eps = 1e-10;
int dcmp(LD x) { if (fabs(x) < eps) return 0; return x < 0 ? -1 : 1; }
bool operator== (const Point& a, const Point& b) {
return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}
LD Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
LD Length(Vector A) { return sqrt(Dot(A, A)); }
LD Angle(Vector A, Vector B) { return acos(Dot(A, B) / Length(A) / Length(B)); }
LD Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }
LD Area2(Point A, Point B, Point C) { return Cross(B - A, C - A); }
Vector Rotate(Vector A, LD rad) {
return Vector(A.x*cos(rad) - A.y*sin(rad), A.x*sin(rad) + A.y*cos(rad));
}
Vector Normal(Vector A) {
LD L = Length(A);
return Vector(-A.y / L, A.x / L);
}
Point GetLineIntersection(Point P, Vector v, Point Q, Vector w) {
Vector u = P - Q;
LD t = Cross(w, u) / Cross(v, w);
return P + v*t;
}
LD DistanceToLine(Point P, Point A, Point B) {
Vector v1 = B - A, v2 = P - A;
return fabs(Cross(v1, v2)) / Length(v1);
}
LD DistanceToSegment(Point P, Point A, Point B) {
if (A == B) return Length(P - A);
Vector v1 = B - A, v2 = P - A, v3 = P - B;
if (dcmp(Dot(v1, v2)) < 0) return Length(v2);
else if (dcmp(Dot(v1, v3)) > 0) return Length(v3);
else return fabs(Cross(v1, v2)) / Length(v1);
}
Point GetLineProjection(Point P, Point A, Point B) {
Vector v = B - A;
return A + v*(Dot(v, P - A) / Dot(v, v));
}
bool SegmentProperIntersection(Point a1, Point a2, Point b1, Point b2) {
LD c1 = Cross(a2 - a1, b1 - a1), c2 = Cross(a2 - a1, b2 - a1);
LD c3 = Cross(b2 - b1, a1 - b1), c4 = Cross(b2 - b1, a2 - b1);
return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0;
}
bool OnSegment(Point p, Point a1, Point a2) {
return dcmp(Cross(a1 - p, a2 - p)) == 0 && dcmp(Dot(a1 - p, a2 - p)) < 0;
}
LD PolygonArea(Point* p, int n) {
LD area = 0;
for (int i = 1; i < n - 1; ++i)
area += Cross(p[i] - p[0], p[i + 1] - p[0]);
return area / 2;
}
//点在多边形内部
int isPointInPolygon(Point p, Polygon poly) {
int wn = 0;
int n = poly.size();
for (int i = 0; i < n; ++i) {
if (OnSegment(p, poly[i], poly[(i + 1) % n])) return -1;
int k = dcmp(Cross(poly[(i + 1) % n] - poly[i], p - poly[i]));
int d1 = dcmp(poly[i].y - p.y);
int d2 = dcmp(poly[(i + 1) % n].y - p.y);
if (k > 0 && d1 <= 0 && d2 > 0) ++wn;
if (k < 0 && d2 <= 0 && d1 > 0) --wn;
}
if (wn != 0) return 1;
return 0;
}
//凸包
int ConvexHull(Point* p, int n, Point* ch) {
sort(p, p + n);
n = unique(p, p + n) - p;
int m = 0;
for (int i = 0; i < n; ++i) {
while (m > 1 && dcmp(Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0) --m;
ch[m++] = p[i];
}
int k = m;
for (int i = n - 2; i >= 0; --i) {
while (m > k && dcmp(Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0) --m;
ch[m++] = p[i];
}
if (n > 1) --m;
return m;
}
计算几何模板
最新推荐文章于 2020-04-11 21:13:40 发布