判断点P是否在多边形里面

来源:互联网 发布:金方圆数控冲床编程 编辑:程序博客网 时间:2024/05/21 11:27
//a[N]存放的多边行的点,insidepolygon(Int p)点在多边形内;
//边上的点也算在多边形里面
//边的存放可以逆时针或者顺时针

时间复杂度O(n)


//a[N]存放的多边行的点,insidepolygon(Int p)点在多边形内;//边上的点也算在多边形里面#define N 1000#define eps 1e-5inline double max(double a,double b) {    return a>b?a:b;}inline double min(double a,double b) {    return a>b?b:a;}struct point {    double x,y;};point a[N];int n,m;bool online(const point &p1,const point &p2,const point &p3) {    if(p2.x>=min(p1.x,p3.x)&&p2.x<=max(p1.x,p3.x)            &&p2.y>=min(p1.y,p3.y)&&p2.y<=max(p1.y,p3.y)) {        if(fabs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))<eps)            return true;    }    return false;} bool insidepolygon(point p) {    int counter=0;    double xinters;    point p1,p2;    p1=a[0];    for(int i=1; i<=n; i++) {        p2=a[i%n];        if(online(p1,p,p2)) return true;        if(p.y>min(p1.y,p2.y)) {            if(p.y<=max(p1.y,p2.y)) {                if(p.x<=max(p1.x,p2.x)) {                    if(p1.y!=p2.y) {                        xinters=(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;                        if(p1.x==p2.x||p.x<=xinters) counter++;                    }                }            }        }        p1=p2;    }    if(counter%2==0)        return false;    return true;}


0 0
原创粉丝点击