zoukankan      html  css  js  c++  java
  • [ACM] hdu Cupid's Arrow (判断点是否在多边形内)

    Cupid's Arrow

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 3   Accepted Submission(s) : 2

    Font: Times New Roman | Verdana | Georgia

    Font Size:

    Problem Description

    传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。
    世上无数人都曾经梦想得到这支箭。Lele当然也不例外。不过他想,在得到这支箭前,他总得先学会射箭。
    日子一天天地过,Lele的箭术也越来越强,渐渐得,他不再满足于去射那圆形的靶子,他开始设计各种各样多边形的靶子。
    不过,这样又出现了新的问题,由于长时间地练习射箭,Lele的视力已经高度近视,他现在甚至无法判断他的箭射到了靶子没有。所以他现在只能求助于聪明的Acmers,你能帮帮他嘛?

    Input

    本题目包含多组测试,请处理到文件结束。
    在每组测试的第一行,包含一个正整数N(2<N<100),表示靶子的顶点数。
    接着N行按顺时针方向给出这N个顶点的x和y坐标(0<x,y<1000)。
    然后有一个正整数M,表示Lele射的箭的数目。
    接下来M行分别给出Lele射的这些箭的X,Y坐标(0<X,Y<1000)。

    Output

    对于每枝箭,如果Lele射中了靶子,就在一行里面输出"Yes",否则输出"No"。

    Sample Input

    4
    10 10
    20 10
    20 5
    10 5
    2
    15 8
    25 8
    

    Sample Output

    Yes
    No
    

    Author

    linle

    Source

    2007省赛集训队练习赛(6)_linle专场

    解题思路:

    用的模板,判断点是否在多变形内(任意多边形)。

    模板:

    const double eps=1e-8;
    struct CPoint
    {
        double x,y;
    }point[103];
    int dcmp(double x)
    {
        if(x<-eps) return -1;
        else   return (x>eps);
    }
    double cross(CPoint p0,CPoint p1,CPoint p2)
    {
        return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
    double dot(CPoint p0,CPoint p1,CPoint p2)
    {
        return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
    }
    int PointOnSegment(CPoint p0,CPoint p1,CPoint p2)
    {
        return dcmp(cross(p0,p1,p2))==0&&dcmp(dot(p0,p1,p2))<=0;
    }
    int PointInPolygon(CPoint cp,CPoint p[],int n)
    {
        int i,k,d1,d2,wn=0;
      //  double sum=0;
        p[n]=p[0];
        for( i=0;i<n;i++)
        {
            if(PointOnSegment(cp,p[i],p[i+1])) return 2;
            k=dcmp(cross(p[i],p[i+1],cp));
            d1=dcmp(p[i+0].y-cp.y);
            d2=dcmp(p[i+1].y-cp.y);
            if(k>0&&d1<=0&&d2>0)wn++;
            if(k<0&&d2<=0&&d1>0)wn--;
        }
        return wn!=0;
    }


    代码:

    #include <iostream>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    const double eps=1e-8;
    struct CPoint
    {
        double x,y;
    }point[103];
    int dcmp(double x)
    {
        if(x<-eps) return -1;
        else   return (x>eps);
    }
    double cross(CPoint p0,CPoint p1,CPoint p2)
    {
        return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
    double dot(CPoint p0,CPoint p1,CPoint p2)
    {
        return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
    }
    int PointOnSegment(CPoint p0,CPoint p1,CPoint p2)
    {
        return dcmp(cross(p0,p1,p2))==0&&dcmp(dot(p0,p1,p2))<=0;
    }
    int PointInPolygon(CPoint cp,CPoint p[],int n)
    {
        int i,k,d1,d2,wn=0;
      //  double sum=0;
        p[n]=p[0];
        for( i=0;i<n;i++)
        {
            if(PointOnSegment(cp,p[i],p[i+1])) return 2;
            k=dcmp(cross(p[i],p[i+1],cp));
            d1=dcmp(p[i+0].y-cp.y);
            d2=dcmp(p[i+1].y-cp.y);
            if(k>0&&d1<=0&&d2>0)wn++;
            if(k<0&&d2<=0&&d1>0)wn--;
        }
        return wn!=0;
    }
    int main()
    {
        int n,m;
        while(cin>>n)
        {
            for(int i=0;i<n;i++)
                cin>>point[i].x>>point[i].y;
            cin>>m;
            CPoint temp;
            for(int j=1;j<=m;j++)
            {
                cin>>temp.x>>temp.y;
                if(PointInPolygon(temp,point,n)==1)
                    cout<<"Yes"<<endl;
                else
                    cout<<"No"<<endl;
            }
        }
        return 0;
    }
    


     

  • 相关阅读:
    东方国信 - 软件开发人员面试问卷(ver1.001.002)
    Traceback (most recent call last): File "setup.py", line 22, in <module> execfile(join(CURDIR, 'src', 'SSHLibrary', 'version.py')) NameError: name 'execfile' is not defined
    python学习笔记一
    A strange lift
    A strange lift
    Tempter of the Bone
    Tempter of the Bone
    Rescue
    Rescue
    Red and Black
  • 原文地址:https://www.cnblogs.com/sr1993/p/3697790.html
Copyright © 2011-2022 走看看