计算几何的基本代码模板

来源:互联网 发布:js radio 多选 编辑:程序博客网 时间:2024/05/19 02:44

代码来自刘汝佳的训练指南

计算π值

const double PI=acos(-1);

角度化弧度

double torad(double deg){    return deg/180*PI;}

坐标点和运算

struct Point{    double x,y;    Point(double x=0,double y=0):x(x),y(y){}};bool operator < (const Point &a,const Point &b)//排序用,按照x的坐标从小到大,如果x相同,那么按照y从小到大{    return a.x<b.x||(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,Vector B){return Vector(A.x-B.x,A.y-B.y);}//相减

三态函数,用来减少精度问题

int dcmp(double x){    if(fabs(x)<eps) return 0;    else        return x<0?-1:1;}

点积

double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}

叉积

#define Vector Pointdouble Cross(Vector A,Vector B){    return A.x*B.y-A.y*B.x;}

andrew算法 求凸包

int ConvexHull(Point *p,int n,Point *ch)//p是所有点,n所有点的个数,ch里面记录形成凸包的点,返回凸包点的个数{    sort(p,p+n);    int m=0;    for(int i=0;i<n;i++)    {        while(m>1&&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&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)            m--;        ch[m++]=p[i];    }    if(n>1)        m--;    return m;}

某点绕着原点逆时针旋转

#define Vector PointVector Rotate(Vector A,double rad)//旋转{    return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));}

计算多边形有向面积

double PolyonArea(Point* p,int n)//多边形面积{    double area=0;    for(int i=1;i<n-1;i++)        area+=Cross(p[i]-p[0],p[i+1]-p[0]);    return area/2;}

判断点是否在直线上面

bool OnSegment(Point p,Point a1,Point a2){    return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;}

判断点是否在多边形内部

int isPointInPolygon(Point p,Point *ch,int n){    int wn=0;    for(int i=0;i<n;i++)    {        if(OnSegment(p,ch[i],ch[(i+1)%n]))return -1;        int k=dcmp(Cross(ch[(i+1)%n]-ch[i],p-ch[i]));        int d1=dcmp(ch[i].y-p.y);        int d2=dcmp(ch[(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;}

线段是否相交(不考虑端点的情况)

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;}

to be continue~

0 0
原创粉丝点击