ACM-凸多边形的计算几何——hrbust1429
称号:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1429
Description
已知一个凸多边形A(包括n个点,点依照顺时针给出)。和一个点集B(包括m个点),请推断这m个点是否都严格在凸多边形A内部。
Input
输入包括多组測试数据。
对于每组測试数据:
第1行。包括一个整数n (3 ≤ n ≤ 105)代表着凸多边形A的点的数量。
接下来n行每行包括一个坐标(x, y) (-109 ≤ x, y ≤ 109) 表示这个凸多边形,点依照顺时针给出。
第n + 2行。包括一个整数m (3 ≤ m ≤ 105)代表着点集B的点的数量。
接下来m行每行包括一个坐标(x, y) (-109 ≤ x, y ≤ 109) 表示这个点集B。
处理到文件结束
Output
对于每组測试数据:
第1行,假设点集B都严格在凸多边形A内,输出YES,否则输出NO。
Sample Input
4
-10 -10
-10 10
10 10
10 -10
3
0 0
1 1
2 2
4
-10 -10
-10 10
10 10
10 -10
3
100 100
1 1
2 2
Sample Output
YES
NO
计算几何之推断点是否在多边形内,
推断点是否在多边形内有多种方法:射线法,角度和推断法,改进弧长法还有这次用到的二分法。
前三者的时间复杂度均为O(n),此方法复杂度仅为O(logn)。
并且对于推断非常多点是否在多边形内,就能够用这样的方法了,耗时少。
原理:
将一个多边形,以当中一个点为原点,開始与其它各点相连并延长做射线。则会形成很多个三角形区域。(如左图)
这样我们能够先推断点在哪两条向量之间。用二分查找,能够非常快搜索到。
当然,首先要推断点是否在最左边向量左側或者最右边向量右側,如是。则点不在多边形内。
以右图为例,我们找到紫色点在左数第一个三角形区域内,绿色点在左数第二个三角形区域内。
然后,再推断下图所看到的线段与 所推断点的位置关系。
绿色的线段能够推断绿色的点。左边紫色的点也由对应的线段来推断位置关系。
这样能够推断点是否在多边形内啦。
总结一下:
①建立一个个三角形区域。用当中两条边推断点所在大体区域。
②用第三条边来推断点是否在多边形内。
二分查找就是用在了第一条的地方,用来查找大体区域位置。
明确了这个,就能够做对应的题目来练习一下了!
就是这道题~。~
#include <stdio.h>
struct point
{
double x,y;
}a[100005],b[100005];
double cross(point p0,point p1,point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} int main()
{
int n,m,i,low,high,mid,flag;
while( scanf("%d",&n)!=EOF )
{
for( i=0 ; i<n ; ++i )
scanf("%lf%lf",&a[i].x,&a[i].y);
scanf("%d",&m);
for( i=0 ; i<m ; ++i )
scanf("%lf%lf",&b[i].x,&b[i].y);
flag=0;
for( i=0 ; i<m ; ++i )
{
// ① 推断初始时,点是否在凸多边形两最外側边外面
if( cross(a[0],a[1],b[i])>=0 || cross(a[0],a[n-1],b[i])<=0 )
{
flag=1;
break;
} // ② 推断凸多边形在哪个三角形里头
low=2;high=n-1;
while( low<high )
{
mid=(low+high)>>1; // 就是除以2。比除以2快(位运算比乘除快非常多)
if( cross(a[0],a[mid],b[i])>0 )
high=mid;
else
low=mid+1;
}
// 查看b是否在凸多边形上面那些边的外面
if( cross(a[low],a[low-1],b[i])<=0 )
{
flag=1;
break;
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
ACM-凸多边形的计算几何——hrbust1429的更多相关文章
- hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)
凸多边形 Time Limit: 2000 MS Memory Limit: 65536 K Total Submit: 130(24 users) Total Accepted: 40(1 ...
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
- BZOJ2618 [Cqoi2006]凸多边形 凸包 计算几何
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2618 题意概括 给出多个凸包,求面积交. 题解 首先我们考虑两个凸包相交的情况. 例题:HDU16 ...
- hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...
- 【计算几何初步-判断是否凸多边形】【HDU2108】Shape of HDU
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- ACM 计算几何中的精度问题(转)
http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...
- 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 959 Solved: 489[Submit][Status] ...
随机推荐
- Memento pattern
21.5 再谈备忘录的封装 备忘录是一个很特殊的对象,只有原发器对它拥有控制的权力,负责人只负责管理,而其他类无法访问到备忘录,因此我们需要对备忘录进行封装. 为了实现对备忘录对象的封装,需要对备忘录 ...
- ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤
务实直接上代码: 1. 重写FilterModule.cs using System; using System.Collections.Generic; using System.Linq; usi ...
- jQuery来源学习笔记:整体结构
1.1.由于调用一个匿名函数: (function( window, undefined ) { // jquery code })(window); 这是一个自调用匿名函数,第一个括号内是一个匿名函 ...
- 【原创】纯OO:从设计到编码写一个FlappyBird (三)
第二部分请点这里 下面首先来实现Bing接口! 实现Bing接口的类取名SimpleBing. 容易发现,SimpleBing类总的来说要向下,但点击一下又得向上,向上到了一定界限又得向下,但我们又只 ...
- Redis实现分布式锁与任务队列
Redis实现分布式锁 与 实现任务队列 这一次总结和分享用Redis实现分布式锁 与 实现任务队列 这两大强大的功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说 ...
- Android技术——切换视图(两)随着ViewPage达到Tab幻灯片浏览
Android技术--切换视图(一)~(四)在资源项目:https://github.com/YongYuIT/MeiNv_Liulanqi 一.早期android(android.support.v ...
- C#软件开发实例.个人定制自己的屏幕抓图工具(八)加入了截图功能键盘
章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加入放大镜的功 ...
- Android系统APN配置具体解释
Android 系统APN配置具体解释 这些天一直在调系统原生的Settings.apk里面APN配置的问题.在设置里面手动添加了APN配置选项.可是在界面上还是看不到.所以跟了下代码.原以为就是简 ...
- Unity3d C# Socket 下载文件 (同步到)
续篇 Unity3d C# HttpWebRequest 异步下载文件 ,由于project编译为IL2CPP的情况下仍然无效.提示HttpWebrequest 在当前版本号不支持.所以还是寻求其他的 ...
- Web层的搭建
Web层的搭建 前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DD ...