博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACM-凸多边形的计算几何——hrbust1429
阅读量:6861 次
发布时间:2019-06-26

本文共 1935 字,大约阅读时间需要 6 分钟。

凸多边形

称号:

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 
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
=0 || cross(a[0],a[n-1],b[i])<=0 ) { flag=1; break; } // ② 推断凸多边形在哪个三角形里头 low=2;high=n-1; while( low
>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;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
缺乏规模效应 腾讯视频或借道短视频突围竞争
查看>>
tomcat多实例配置
查看>>
gluSphere 函数解析(OpenGL画球体)
查看>>
高效系列:Win 10 关闭系统快速访问功能,设置自定义文件夹
查看>>
Spads 工作组为 Cikers 项目编写的密码库使用说明
查看>>
有道云笔记Markdown指南
查看>>
IDA中文编码设置
查看>>
linux上部署hadoop集群 HA+Federation篇
查看>>
交换器限制局域网速度方法:qos限制局域网网速
查看>>
rip等价负载均衡
查看>>
10.23cron10.24chkconfig工具10.25systemd管理服务10.26unit
查看>>
centosFailure:repodata/repomd.xml [Err14] yum inst
查看>>
linux下top命令详解
查看>>
我的友情链接
查看>>
hadoop Unable to load native-hadoop library for your platform
查看>>
MySQL优化讲解
查看>>
nagios配置出错记录
查看>>
开启Cisco交换机DHCP Snooping功能
查看>>
静态方法-类方法-属性方法
查看>>
jQuery实现的全选、反选和不选功能
查看>>