zoukankan      html  css  js  c++  java
  • HDU 1756 Cupid's Arrow(判断点是否在多边形内模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1756

    方法:求解以某点为起点的射线与多边形边的交点个数,奇数时则点在内,偶数在外

    需要特别注意交点在顶峰和谷底以及射线与边平行的情况

    #include<stdio.h>
    #include<math.h>
    typedef struct node
    {
        double x,y;
    }point;
    point p,a[110],b;
    int n;
    double min(double a,double b)
    {
        return a>b?b:a;
    }
    double max(double a,double b)
    {
        return a>b?a:b;
    }
    int point_in_polygon(point p)
    {
        int count=0,i;
        point p1,p2;
        double x;
        for(i=0;i<n;i++)
        {
            p1=a[i];
            p2=a[(i+1)%n];
            if(p1.y==p2.y)//p1p1与y=p.y平行,交点可由前一次,或后一次代为计算,否则可能会重复计算
                continue;
            if(p.y<min(p1.y,p2.y)||p.y>=max(p1.y,p2.y))//这里的这两种情况,都是关于交点在延长线上的,而前一个之所以没加入端点,因为前一次可能是平行,跳过了,所以要进行计算
                continue;
            x=-((p2.x*p1.y-p1.x*p2.y)+p.y*(p1.x-p2.x))/(p2.y-p1.y);//根据两点和交点y计算交点x
            count+=(x>p.x);//如果在点的右侧,则说明有交点
        }
        return count&1;
    }
    int main()
    {
        int i,m;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
                scanf("%lf%lf",&a[i].x,&a[i].y);
            scanf("%d",&m);
            for(i=0;i<m;i++)
            {
                scanf("%lf%lf",&b.x,&b.y);
                printf("%s
    ",point_in_polygon(b)?"Yes":"No");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    std::auto_ptr
    make_pair
    _stdcall与_cdecl(了解)
    函数名与函数指针(了解)
    空指针与野指针
    std::bind(二)
    C++ map 映照容器
    sql find duplicate
    数量
    sort sign numeric
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3279499.html
Copyright © 2011-2022 走看看