传送门

题解:

  射线法判定点是否在多边形内部;

AC代码:

  

 #include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double esp=1e-;
const int maxn=+; int n,m;
struct Point
{
double x,y;
}p[maxn]; double K(Point p1,Point p2)
{
return (p2.y-p1.y)/(p2.x-p1.x);
}
bool onEdge(Point q,Point p1,Point p2)
{
if(p1.x == p2.x)//斜率不存在的情况,HDU的数据里没有卡这种情况
return q.y >= min(p1.y,p2.y) && q.y <= max(p1.y,p2.y) && q.x == p1.x ? true:false; if(q.x >= min(p1.x,p2.x) && q.x <= max(p1.x,p2.x) && q.y >= min(p1.y,p2.y) && q.y <= max(p1.y,p2.y))
return fabs(K(p1,q)-K(p1,p2)) < esp ? true:false;
return false;
}
bool inPolygon(Point q)
{
int ans=;
Point p1,p2;
p1=p[];
for(int i=;i <= n;++i)
{
p2=p[i%n];
if(onEdge(q,p1,p2))
return true;
if(p1.y == p2.y)//判断p1p2是否为水平边,水平边不作考虑
{
p1=p2;//起初,这儿我并没有加这句话,改了好半天才看到
continue;
}
/**
注意:此处q.y是严格>min();
此处是用来处理射线与顶点相交的情况的
当相交的顶点为凸顶点时,两条边都加上;
当相交的顶点是凹顶点时,只加右边那条边;
*/
if(q.y > min(p1.y,p2.y) && q.y <= max(p1.y,p2.y) && q.x <= max(p1.x,p2.x))
{
//当p1p2为竖线时,由条件q.x <= max(p1.x,p2.x)可得由p向右发出的射线与p1p2有交点
if(p1.x == p2.x)
ans++;
else
{
//x : 经过q点且平行于x轴的直线与p1p2交点的横坐标
double x=p1.x+(q.y-p1.y)/K(p1,p2);
if(q.x <= x)//如果q.x <= x,说明q向右发出的射线与p1p2有交点
ans++;
}
}
p1=p2;
}
return ans&;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\HDU\\1756.in","r",stdin);
while(~scanf("%d",&n))
{
for(int i=;i < n;++i)
scanf("%lf%lf",&p[i].x,&p[i].y); scanf("%d",&m);
for(int i=;i <= m;++i)
{
Point q;
scanf("%lf%lf",&q.x,&q.y);
if(inPolygon(q))
printf("Yes\n");
else
printf("No\n");
}
}
return ;
}

hdu 1756(判断点是否在多边形中)的更多相关文章

  1. hdu 1756 判断点在多边形内 *

    模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...

  2. hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. PHP 判断点是否在多边形内

    如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...

  4. java/c# 判断点是否在多边形区域内

    java/c# 判断点是否在多边形区域内 年06月29日 ⁄ 综合 ⁄ 共 1547字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近帮别人解决了一个问题,如何判断一个坐标点,是否在多边形区域内(二维). ...

  5. hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)

    再遇攻击 Time Limit: 1000 MS    Memory Limit: 65536 K Total Submit: 253(37 users)   Total Accepted: 56(2 ...

  6. JS判断网页是否在微信中打开/

    JS判断网页是否在微信中打开,代码如下: <script type="text/javascript"> function is_weixn(){ var ua = n ...

  7. 百度地图 判断marker是否在多边形内

    昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js      <script type="text/javascript&quo ...

  8. hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)

    凸多边形 Time Limit: 2000 MS    Memory Limit: 65536 K Total Submit: 130(24 users)   Total Accepted: 40(1 ...

  9. C# 判断点是否在多边形内

    /// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</par ...

随机推荐

  1. python实现线性规划

    python工具包scipy linprog 函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bo ...

  2. c#词频统计命令行程序

    这里将用c#写一个关于词频统计的命令行程序. 预计时间分配:输入处理3h.词条排序打印2h.测试3h. 实际时间分配:输入处理1h.词条排序打印2h.测试3h.程序改进优化6h. 下面将讲解程序的完成 ...

  3. Oracle系列(一): Oracle数据恢复

     Oracle数据恢复 在使用Oracle的时候,突然一部小心update或者delete全部数据后怎么办? select * from table as of timestamp to_timest ...

  4. 作业二 —— 分布式版本控制系统Git的安装与使用

    作业要求源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 1.安装Git,配置用户名与邮箱. 安装Windows版的Git ...

  5. Magazine Ad CodeForces - 803D (二分+贪心)

    The main city magazine offers its readers an opportunity to publish their ads. The format of the ad ...

  6. JS 柯里化 (curry)

    用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...

  7. 一种快速统计SQL Server每个表行数的方法

    转载自:http://www.cnblogs.com/kenyang/archive/2013/04/09/3011447.html 我们都知道用聚合函数count()可以统计表的行数.如果需要统计数 ...

  8. Delphi的idhttp报IOHandler value is not valid错误的原因[转]

    出现这种问题的原因是由于访问的 URL地址为https或存在其跳转地址为https. 首先单纯使用idhttp是只能访问http,而https则需要搭配IdSSLIOHandlerSocketOpen ...

  9. 无需破解:Windows Server 2008 R2 至少免费使用 900天

    无需破解:Windows Server 2008 R2 至少免费使用 900天 2009年10月30日 星期五 02:10 1.首先安装后,有一个180天的试用期. 2.在180天试用期即将结束时,使 ...

  10. LoadRunner12 Java Vuser API语法举例

    // 检查点 web.reg_find("Text=\"retCode\":\"0000\"",new String[]{"FAI ...