hdu 1756(判断点是否在多边形中)
题解:
射线法判定点是否在多边形内部;
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(判断点是否在多边形中)的更多相关文章
- hdu 1756 判断点在多边形内 *
模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- java/c# 判断点是否在多边形区域内
java/c# 判断点是否在多边形区域内 年06月29日 ⁄ 综合 ⁄ 共 1547字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近帮别人解决了一个问题,如何判断一个坐标点,是否在多边形区域内(二维). ...
- hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)
再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 253(37 users) Total Accepted: 56(2 ...
- JS判断网页是否在微信中打开/
JS判断网页是否在微信中打开,代码如下: <script type="text/javascript"> function is_weixn(){ var ua = n ...
- 百度地图 判断marker是否在多边形内
昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js <script type="text/javascript&quo ...
- hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)
凸多边形 Time Limit: 2000 MS Memory Limit: 65536 K Total Submit: 130(24 users) Total Accepted: 40(1 ...
- C# 判断点是否在多边形内
/// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</par ...
随机推荐
- Individual P1: Summary
经过5个小时成功把simple mode写差不多了..orz 也是蛮拼的. 开始毫无头绪,本能地开始从度娘搜索‘c# 单词统计’= =看了两段代码也算是见过c#的人了.差不多花了我1小时的时间. 然后 ...
- 北航MOOC客户端
我们的团队作业终于完成了,欢迎下载使用我们的北航MOOC手机客户端软件(Android端)——北航学堂,学习北航的公开课程. 安装包下载地址: http://pan.baidu.com/s/1jGvH ...
- 转发:C#操作SQL Server数据库
转发自:http://www.cnblogs.com/rainman/archive/2012/03/13/2393975.html 1.概述 2.连接字符串的写法 3.SqlConnection对象 ...
- PAT 1004 成绩排名
https://pintia.cn/problem-sets/994805260223102976/problems/994805321640296448 读入n名学生的姓名.学号.成绩,分别输出成绩 ...
- Linux curl 一例
root@PC-RENGUOQIANG:~# curl http://kermit:kermit@192.168.66.182:8080/activiti-rest/service/repositor ...
- mybatis集成redis
系统原生集成的Ehcache, 但是监控需要(version 2.7),Ehcache Monitor http://www.ehcache.org/documentation/2.7/operati ...
- Jmeter While Controller 使用${__jexl2(,)}
1. String [] str ={"1","2","3"}; vars.putObject("strArray",s ...
- 虚拟机使用不同CPU配置时内存性能的差异
第一款机器的配置: CPU(s): 8On-line CPU(s) list: 0-7Thread(s) per core: 1Core(s) per socket: 4座: 2NUMA 节点: 1 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 4. 函数
什么样的程序员才是优秀的程序员?咪博士认为“慵懒”的程序员才是真正优秀的程序员.听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务.函数便是程序员高效工作的利器之一 ...
- delphi 通过事务插入数据
orsn1.StartTransaction; try qry1.Sql.Clear; qry1.Sql.Text:=' select * from log '; qry1.Open; qry1.In ...