点集的凸包算法

这篇博客探讨了在二维平面上如何找到一组点的最小凸边形,即凸包。介绍了基于角度的Jarvis步进法,通过找到最左下角的点,然后不断寻找与当前边形成最小夹角的点,直至回到起点。文中详细阐述了算法步骤,包括向量叉乘判断点的位置,以及处理共线点的情况,提供了全局流程图和关键代码片段。
摘要由CSDN通过智能技术生成

问题:在二维平面上,给定一些带有坐标位置的点,如何获取包含所有这些点的最小凸边形?

该问题就是在二维平面上求凸包(Convex Hull)。

如下图,图中给定了一些点,外围连线所围成的凸边形刚好将所有给定的点包围起来。

如果我们将这些点和凸边形放到一个二维平面坐标系中观察。

我们可以发现,在这些点中,沿着横坐标方向上,x坐标值最大和最小的点一定在凸包上,同样的,沿着纵坐标方向上,y坐标值最大和最小的点也一定在凸包上。因为这本身就是凸包所定义的,凸包是最外围的一圈点,所以最外围的点必然是各个方向上的极值。

接着,从A点上观察,所给定集合的点都在AD边的一侧,也都在AB边一侧。同样的,凸包上的点都满足这个要求。这个特点,我们可以怎么利用呢?

我们先通过角度来利用。

以A点为例,边AB与x轴正方向所形成的角是集合中所有点与A所形成的边与x轴正方向所形成的的所有角中最小的,边AE与x轴正方向所形成的角是集合中所有点与A所形成的边与x轴正方向所形成的的所有角中最大的。

通俗一点描述,从A点出发,沿着平行与x轴的方向画一条射线,该射线围着点A逆时针转动,那么点B就是该条射线第一个碰到的点,点E是这条射线最后一个碰到的点。如下图:

 再以B点为例,如果从B点出发,沿着边AB方向画一条射线,该射线围绕着点B逆时针转动,那么点C就是该条射线第一个碰到的点(角最小),点A是这条射线最后一个碰到的点(角最大)。如下图:

 

依次分析凸包上其它的点,都满足该特性。

我们利用这个特点来求得凸包。步骤:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值