`
scott________
  • 浏览: 20765 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
社区版块
存档分类
最新评论

zoj 1081 Points Within 点与多边形关系

阅读更多

题目描述: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81

题目大意: n 边形的 n 个顶点按顺序给出, 接下来是m 个测试点, 对于每个测试点判断该点是否在多边形内(包括边界).
直接copy 浙大模板 O(∩_∩)O哈哈~
附上代码

#include <cstdio>
#include <cmath>
#include <cstdlib>

#define offset 10000
#define eps 1e-8
#define zero(x) ( ((x > 0) ? (x) : (-x)) < eps )

struct point {
    double x,y;
};
struct line {
    point a,b;
};

double xmult(point p1,point p2,point p0) {
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}


//判点在任意多边形内,顶点按顺时针或逆时针给出
//on_edge表示点在多边形边上时的返回值,offset为多边形坐标上限
int inside_polygon(point q,int n,point* p,int on_edge=1) {
    point q2;
    int i=0,count;
    while (i<n)
        for (count=i=0,q2.x=rand()+offset,q2.y=rand()+offset; i<n; i++)
            if (zero(xmult(q,p[i],p[(i+1)%n]))&&(p[i].x-q.x)*(p[(i+1)%n].x-q.x)<eps&&(p[i].y-q.y)*(p[(i+1)%n].y-q.y)<eps)
                return on_edge;
            else if (zero(xmult(q,q2,p[i])))
                break;
            else if (xmult(q,p[i],q2)*xmult(q,p[(i+1)%n],q2)<-eps&&xmult(p[i],q,p[(i+1)%n])*xmult(p[i],q2,p[(i+1)%n])<-eps)
                count++;
    return count&1;
}

int main() {
    point p[101];
    point q;
    int n, m;		//多边形n 条边, m 个测试点
    int k = 1;		//第 k 个测试块儿,Problem k
    while(scanf("%d", &n) && n) {
        scanf("%d", &m);

        for(int i = 0; i < n; i++)
            scanf("%lf %lf", &p[i].x, &p[i].y);
		
        if(k != 1)
            printf("\n");
        printf("Problem %d:\n", k++);
        while(m--) {
			scanf("%lf %lf", &q.x, &q.y);
            int ans = inside_polygon(q, n, p, 2);   //最后一个参数不小于1 即可
            if(ans > 0)
                printf("Within\n");
            else
                printf("Outside\n");
        }
    }
    return 0;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics