计算几何简单模板

来源:互联网 发布:初级php开发工程师 编辑:程序博客网 时间:2024/06/12 16:01

  刘汝佳书上的模板用着还是不错的,先以这个基础模板,以后自己再补充

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;const double eps = 1e-6;struct Point{    double x,y;    Point(double xx=0,double yy=0):x(xx),y(yy){}};typedef Point Vector;//#define Vector PointVector operator - (Point b, Point a){    return Vector(b.x - a.x, b.y - a.y);}Vector operator + (Vector a, Vector p){    return Vector(a.x + p.x, a.y + p.y);}Vector operator * (Vector A,double p){    return Vector(A.x*p,A.y*p);}int dcmp(double x)//三态函数{    if(fabs(x) < eps)        return 0;    else        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;}double Dot(Vector A, Vector B)//点乘{    return A.x*B.x + A.y*B.y;}double Length(Vector A)//模长{    return sqrt(Dot(A,A));}double Angle(Vector A,Vector B)//夹角{    return acos(Dot(A,B)/Length(A)/Length(B));}double Cross(Vector A,Vector B)//叉乘{    return A.x*B.y - A.y*B.x;}double Area2(Point A,Point B,Point C)//计算叉乘,为三角形面积二倍{    return Cross(B-A,C-A);}Vector Rotate(Vector A,double rad)//按照A向量的起点旋转rad弧度{    return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad) + A.y*cos(rad));}Vector Normal(Vector A)//计算向量的单位法线{    double 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;    double t = Cross(w,u) / Cross(v,w);    return P + v*t;}double DistanceToline(Point P,Point A,Point B)//点P到直线AB的距离{    Vector v1 = B - A,v2 = P - A;    return fabs(Cross(v1,v2) / Length(v1));}double DistanceToSegment(Point P,Point A,Point B)//点P到线段AB的距离{    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)//是否规范相交{    double c1 = Cross(a2-a1,b1-a1),c2 = Cross(a2-a1,b2-a1);    double 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;}int main(){}


0 0
原创粉丝点击