热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ACM计算几何之Cupid'sArrow——hdu1756

ACM计算几何Cupid'sArrowhdu1756点在多边形内射

Cupid‘s Arrow

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

Problem Description

传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。
世上无数人都曾经梦想得到这支箭。Lele当然也不例外。不过他想,在得到这支箭前,他总得先学会射箭。
日子一天天地过,Lele的箭术也越来越强,渐渐得,他不再满足于去射那圆形的靶子,他开始设计各种各样多边形的靶子。
不过,这样又出现了新的问题,由于长时间地练习射箭,Lele的视力已经高度近视,他现在甚至无法判断他的箭射到了靶子没有。所以他现在只能求助于聪明的Acmers,你能帮帮他嘛?
Input
本题目包含多组测试,请处理到文件结束。
在每组测试的第一行,包含一个正整数N(2接着N行按顺时针方向给出这N个顶点的x和y坐标(0然后有一个正整数M,表示Lele射的箭的数目。
接下来M行分别给出Lele射的这些箭的X,Y坐标(0Output
对于每枝箭,如果Lele射中了靶子,就在一行里面输出"Yes",否则输出"No"。
Sample Input
4
10 10
20 10
20 5
10 5
2
15 8
25 8
Sample Output
Yes

No


这道题也是判断点是否在多边形内,这次来说一下射线法。。

之前说了一个O(logn)的二分法,详情可戳:http://blog.csdn.net/lttree/article/details/24291719

射线法:

bubuko.com,布布扣

这张图片比较全啊。

我们以所求点为原点向任意方向做一条射线,如果点在多边形内,做的射线肯定会与多边形的某条边相交。(如a所示),因为多边形可能为凹多边形,所以如果交点有一个则为点在多边形内,若有2个交点则点在多边形外。

以此类推,奇数个点代表点在多边形内,偶数个点代表点在多边形外。

但是还是有几个特殊情况要处理一下:

①射线经过的是多边形端点,如图b

②射线经过多边形某条边,如图c

③射线经过多边形端点和边,如图d

④射线经过端点且边,如图e

我们的解决方法:(序号顺序并非解决相应问题方法)

①对于多边形平行边,不考虑它。

②对于多边形的顶点和射线相交的情况,如果该顶点是其所属边上纵坐标较大的顶点,则计数,否则,忽略该点。

③对于所求的点在多边形边上的情况,直接判断点属于多边形。

And now 让我们一起AC~

PS:不要忘了精度问题哈~


#include
#define MAX 100001
// 需要精度判断
#define EPS 1e-8
struct point
{
double x,y;
}p[MAX];
// 比较大小函数
double Max(double a,double b) { return a>b?a:b; }
double Min(double a,double b) { return a>b?b:a; }
double abs(double a) { return a<0?-a:a; }
// 两个向量的叉积
double cross(double x,double y,double xx,double yy)
{
return x*yy-y*xx;
}
// 判断点是否在直线上,叉积为0,且满足坐标相对位置条件
bool online(point a,point b,point c)
{
if( abs( cross(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y) ) a.x>=Min(b.x,c.x) && a.x<=Max(b.x,c.x) &&
a.y>=Min(b.y,c.y) && a.y<=Max(b.y,c.y) )
return 1;
return 0;
}
int main()
{
int i,n,m,js,flag;
point a,b,c,d;
while( scanf("%d",&n)!=EOF )
{
// 先输入多边形各个点(此题按顺时针输入
for(i=0;i scanf("%lf%lf",&p[i].x,&p[i].y);
scanf("%d",&m);
while(m--)
{
flag=js=0;
// 输入所求点坐标
scanf("%lf%lf",&a.x,&a.y);
b.x=-100,b.y=a.y;
for(i=0; i {
c.x=p[i].x;
c.y=p[i].y;
d.x=p[ (i+1)%n ].x;
d.y=p[ (i+1)%n ].y;
// 判断点是否在线上
if(online(a,c,d))
{
flag=1;
break;
}
// 第一个判断:是否平行边,后面两个a点纵坐标在两端点之间,而且<=最大的端点(因为解决方法中②)
// 第二个判断为判断线段相交,注意精度判定
if( c.y!=d.y && a.y>Min(c.y,d.y) && a.y<=Max(c.y,d.y) )
if( cross(a.x-d.x,a.y-d.y,c.x-d.x,c.y-d.y)*cross(b.x-d.x,b.y-d.y,c.x-d.x,c.y-d.y) ++js;
}
// 判断交点奇偶
if(js&1) flag=1;
if(flag) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}

ACM-计算几何之Cupid&#39;s Arrow——hdu1756,布布扣,bubuko.com


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
author-avatar
Hcl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有