计算几何模板-未完待更

版权声明:博主的博客不值钱随便转载但要注明出处 https://blog.csdn.net/easylovecsdn/article/details/86602265
#include <bits/stdc++.h>
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
using namespace std;

class Point {
public:
	double x, y;
	Point(double x = 0, double y = 0) : x(x), y(y) {}

	Point operator + (Point p) { return Point(x + p.x, y + p.y); }
	Point operator - (Point p) { return Point(x - p.x, y - p.y); }
	Point operator * (double a) { return Point(a * x, a * y); } //数乘
	Point operator / (double a) { return Point(x / a, y / a); }

	double abs() { return sqrt(norm()); }
	double norm() { return x * x + y * y; }

	bool operator < (const Point &p) const {
		return x != p.x ? x < p.x : y < p.y;
	}

	bool operator == (const Point &p) const {
		return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
	}
};

typedef Point Vector;

double dot(Vector a, Vector b) { //内积(向量点乘)
	return a.x * b.x + a.y * b.y;
}

double cross(Vector a, Vector b) { //外积(向量叉乘)
	return a.x * b.y - a.y * b.x;
}

bool isorl(Vector a, Vector b) { //正交
	return equals(dot(a, b), 0.0);
}

bool ispal(Vector a, Vector b) { //平行
	return equals(cross(a, b), 0.0);
}

Point project(Point a, Point b, Point c) //投影点
{
	Vector h = b - a;
	Vector bas = c - a;
	double r = dot(bas, h) / h.norm();
	return a + h * r;
}

Point reflect(Point a, Point b, Point c) { //映像点
	return c + (project(a, b, c) - c) * 2;
}

double getDistanceLP(Point a, Point b, Point p) { //点线距(直线)
	return cross(b - a, p - a) / (b - a).abs();
}

double getDistanceSP(Point a, Point b, Point p) //点线距(线段)
{
	if (dot(b - a, p - a) < 0.0) return (p - a).abs();
	if (dot(a - b, p - b) < 0.0) return (p - b).abs();
	return getDistanceLP(a, b, p);
}

bool intersect(Point a, Point b, Point c, Point d) //判断是否相交
{
	return false;
}

double getDistance(Point a, Point b, Point c, Point d) //线线距
{
	if (intersect(a, b, c, d)) return 0.0;
	return min(getDistanceSP(a, b, c), min(getDistanceSP(a, b, d), min(getDistanceSP(c, d, a), getDistanceSP(c, d, b))));
}

int ccw(Point a, Point b, Point p) //逆时针方向
{
	Vector v1 = b - a;
	Vector v2 = p - a;
	if (cross(v1, v2) > EPS) return 1;
	if (cross(v1, v2) < -EPS) return -1;
	if (dot(v1, v2) < -EPS) return 2;
	if (v1.norm() < v2.norm()) return -2;
	return 0;
}

int main()
{
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/easylovecsdn/article/details/86602265