热门标签 | 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


推荐阅读
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 使用jQuery与百度地图API实现地址转经纬度功能
    本文详细介绍了如何利用jQuery和百度地图API将地址转换为经纬度,包括申请API密钥、页面构建及核心代码实现。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • This article explores the process of integrating Promises into Ext Ajax calls for a more functional programming approach, along with detailed steps on testing these asynchronous operations. ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
  • 1,滤波流程2,图像的金字塔分解(拉普拉斯金字塔)3,金字塔傅里叶频率组合滤波(本文完ÿ ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
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社区 版权所有