namespace Geometry
{
const double pi = acos(-1);
const double eps = 1e-8;
struct Point
{
double x, y;
Point(double x = 0, double y = 0) : x(x), y(y) {}
bool operator==(const Point a) const
{
return (fabs(x - a.x) <= eps && fabs(y - a.y) <= eps);
}
};
typedef Point Vector;
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, double p)
{
return Vector(A.x * p, A.y * p);
}
Vector operator/(Vector A, double p)
{
return Vector(A.x / p, A.y / p);
}
int sign(double x)
{
if (fabs(x) < eps)
return 0;
if (x < 0)
return -1;
return 1;
}
int cmp(double x, double y)
{
if (fabs(x - y) < eps)
return 0;
if (x < y)
return -1;
return 1;
}
double dot(Point a, Point b)
{
return a.x * b.x + a.y * b.y;
}
double cross(Point a, Point b)
{
return a.x * b.y - b.x * a.y;
}
double get_length(Point a)
{
return sqrt(dot(a, a));
}
double get_angle(Point a, Point b)
{
return acos(dot(a, b) / get_length(a) / get_length(b));
}
double area(Point a, Point b, Point c)
{
return cross(b - a, c - a);
}
Point rotate(Point a, double angle)
{
return Point(a.x * cos(angle) + a.y * sin(angle), -a.x * sin(angle) + a.y * cos(angle));
}
Point get_line_intersection(Point p, Vector v, Point q, Vector w)
{
Vector u = p - q;
double t = cross(w, u) / cross(v, w);
return p + v * t;
}
double distance_to_line(Point p, Point a, Point b)
{
Vector v1 = b - a, v2 = p - a;
return fabs(cross(v1, v2) / get_length(v1));
}
double distance_to_segment(Point p, Point a, Point b)
{
if (a == b)
return get_length(p - a);
Vector v1 = b - a, v2 = p - a, v3 = p - b;
if (sign(dot(v1, v2)) < 0)
return get_length(v2);
if (sign(dot(v1, v3)) > 0)
return get_length(v3);
return distance_to_line(p, a, b);
}
Point get_line_projection(Point p, Point a, Point b)
{
Vector v = b - a;
return a + v * (dot(v, p - a) / dot(v, v));
}
bool on_segment(Point p, Point a, Point b)
{
return sign(cross(p - a, p - b)) == 0 && sign(dot(p - a, p - b)) <= 0;
}
bool segment_intersection(Point a1, Point a2, Point b1, Point b2)
{
double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1);
double c3 = cross(b2 - b1, a2 - b1), c4 = cross(b2 - b1, a1 - b1);
return sign(c1) * sign(c2) <= 0 && sign(c3) * sign(c4) <= 0;
}
double polygon_area(Point p[], int n)
{
double s = 0;
for (int i = 1; i + 1 < n; i++)
s += cross(p[i] - p[0], p[i + 1] - p[i]);
return s / 2;
}
}
using namespace Geometry;
这和我的一模一样