算法提高:计算几何基础 | 详解凸包问题

举报
TiAmoZhang 发表于 2023/08/18 10:24:06 2023/08/18
【摘要】 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内。图1中由线段表示的多边形就是点集Q={P0,P1,P2,P3,P4,P5,P6}的凸包。

640.png


■ 图1 点集的凸包


01、实例应用:捕野猪

问题描述:

由于马克的家在未开发的原始森林,因此野生动物很多。春节前,马克和村民商谈决定大家一起捕野猪,将其作为年猪。捕野猪的方法很简单: 去捕野猪的人一人站一个地方。他们抓住同一根绳子,将一大片森林围起来。只要野猪在里面,就跑不掉。(围成的多边形是简单多边形)

输入:

先输入一个正整数t,表示有t组数据。然后输入一个正整数n,表示有n个人。接下来n行每行有两个整数,表示一个人的位置(顺序是沿着绳子向一个方向输入)。最后一行有两个整数,表示野猪的位置。

输出:

输出是否野猪被捕。若是,则输出yes,否则输出no。

输入样例:

1
3
0 0
2 0
0 2
1 1

输出样例:


yes

解题思路:

根据给定的点构造一个最小凸边形,然后判断野猪的位置与凸包的关系,确定是在凸包内,还是在凸包外。

判断点是不是在凸包中,以点P为端点,向右边做一条射线,由于多边形是有界的,所以设L一定与多边形相交,当交点数为基数时,P点在多边形内,否则P点在多边形外。其中特殊情况为: L与多边形的顶点相交,当顶点的两相邻边在射线的同侧时,该顶点不算,否则算一个;当射线与一条边重合时,这条边不算,进行逐条线段的扫描。

参考程序:

eb5432dea5d919ad02b0640f43ae0979.png

28531b91483b69a4fa67ae22a3307d25.png

34f1bc3d9f6443ca267ee11b0c6e0d30.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。