zoj 1081 Points Within

来源:互联网 发布:november rain 知乎 编辑:程序博客网 时间:2024/06/02 03:05

改进弧长算法
要求多边形是有向多边形

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;struct node{    double x, y;} p[105], pp[105];int inpolygon(node t, int n){    int i,t1, t2, sum, f;    for( i = 0; i <= n; i++)    {        p[i].x = pp[i].x - t.x;        p[i].y = pp[i].y - t.y;    }    //判断当前点在第几象限    t1 = p[0].x >= 0 ?(p[0].y >=0?0:3) : (p[0].y >=0?1:2);    for(sum = 0, i = 1; i <= n; i ++)    {        if(!p[i].x && !p[i].y) break;        f = p[i].y*p[i-1].x - p[i].x*p[i-1].y;        //处理当多边形的某条边在坐标轴上而且两个顶点分别在原点        //的两侧会出错,所以每次算P[i]和p[i+1]时,就计算        //叉积点积判断该点是否在边上,是则判断结束        if(!f && p[i-1].x*p[i].x <= 0 && p[i-1].y*p[i].y <= 0) break;        t2 = p[i].x >=0?(p[i].y >= 0 ? 0:3) :(p[i].y >= 0 ? 1 : 2);        //判断相对象限        if(t2 == (t1+1)%4) sum += 1;        else if(t2 == (t1 + 3)%4) sum -= 1;        else if(t2 == (t1 + 2)%4)        {            if(f > 0) sum += 2;            else sum -= 2;        }        t1 = t2;    }    if(i <= n || sum) return 1;    return 0;}int main(){    int n, i;    node t;    int ca = 1;    while(scanf("%d",&n) != EOF && n)    {        int m;        scanf("%d",&m);        if(n == 0) break;        for(int i = 0; i < n; i++)            scanf("%lf%lf",&pp[i].x, &pp[i].y);        pp[n] = pp[0];        if(ca > 1) puts("");        printf("Problem %d:\n",ca++);        for( int i = 0; i < m; i++)        {            scanf("%lf%lf",&t.x, &t.y);            if(inpolygon(t, n)) puts("Within");            else puts("Outside");        }    }    return 0;}
0 0
原创粉丝点击