计算几何基本模板

来源:互联网 发布:重庆市网络办事大厅 编辑:程序博客网 时间:2024/05/06 06:55

上传一下计算几何的基本模板,自己也可以看

#include <cstdio>#include <cmath>#include <algorithm>using namespace std;struct Point{    double x, y;    Point(double x = 0, double y = 0);};typedef Point Vector;Point::Point(double x, double y){    this->x = x;    this->y = y;}//向量与向量的+ - 点积 叉积 Vector operator +(const Vector &A, const Vector &B){//向量的加    return Vector(A.x + B.x, A.y + B.y);}Vector operator -(const Vector &A, const Vector &B){//向量的减    return Vector(A.x - B.x, A.y - B.y);}double dot(const Vector &A, const Vector &B){//向量点积    return (A.x * B.x + A.y * B.y); }double cross(const Vector &A, const Vector &B){//向量叉乘    return (A.x * B.y - B.x * A.y);}//向量关系运算符bool operator <(const Vector &A, const Vector &B){    return (A.x < B.x || (A.x == B.x && A.y < B.y));}int dcmp(double x){//处理double数据i,减少精度问题    if(fabs(x) < 1e-7)  return 0;    if(x < 0)   return 0;    else   return 1;}bool operator == (const Vector &A,const Vector &B){return (dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0) ;}//向量与数字的乘除 Vector operator *(const Vector &A,double p){return Vector(A.x * p, A.y * p);}Vector operator /(const Vector &A,double p){if(fabs(p-0) < 1e-7) return A;return Vector(A.x / p, A.y / p);}//向量的模 double length(const Vector &A){return sqrt(dot(A,A));}double angle (const Vector &A,const Vector &B){//两向量夹角,弧度表示 return acos(dot(A,B) / length(A) / length(B));}Point GetLineIntrersection(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 DistanceToLine(Point P, Point A, Point B){//点到直线距离,这里是P到AB的距离,等于向量AB X 向量AP 再除以 |向量AB| Vector v1 = B - A, v2 = P - A;return fabs(Cross(v1, v2) / length(v1));}double 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);}double DistanceMaxToSegment(Point P, Point A, Point B){//点到线段最远距离 Vector v2 = P - A,v3 = P - B;return max(length(v2), length(v3));}//线段是否“正规相交”,即交点不在四个端点上 bool SegmentProperIntersection(Point a1, Point a2, Point b1, Point b2){double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1),       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) ;}


0 0
原创粉丝点击