Convex Hull误会?

时间:2012-06-27 02:41:12

标签: algorithm convex-hull grahams-scan

我写了Graham扫描凸壳算法的实现,对于测试数据,我使用了点

[(2.0,2.0),(4.0,2.0),(0.5,2.5),(3.0,3.5),(1.0,4.0),(0.0,4.0),(1.0,1.0),(3.0,2.5),(4.0,4.0),(3.5,1.5),(0.5,1.0)]

根据我的程序,凸包是

[(0.0,4.0),(1.0,4.0),(4.0,4.0),(3.0,2.5),(4.0,2.0),(3.5,1.5),(1.0,1.0),(0.5,1.0)]

但是,我预计凸包将是

[(0.0,4.0),(1.0,4.0),(4.0,4.0),(4.0,2.0),(3.5,1.5),(1.0,1.0),(0.5,1.0)]

我也用https://github.com/shadwstalkr/GrahamScanDemo/尝试了我的一组点,并给出了同样的解决方案。经过多次抱怨和抱怨之后,我在维基百科上读到:“对象是凸的,如果对象中的每一对点,连接它们的直线段上的每个点也在对象内。”

抽出我的积分和船体。似乎我的程序在该定义中产生了一个对象,但是这并不意味着只是简单地按角度排序就会产生一个凸起的船体,而船体上没有任何点?

我不明白凸包实际是什么,我想解决一个不同的问题,或者我的实现和shadwstalkr都不正确?

2 个答案:

答案 0 :(得分:3)

使用wolframalpha Polygon{}命令,您可以看到解决方案与真实解决方案之间的差异:
您的:

enter image description here

真实:

enter image description here

因此,您的多边形不是convex,因为根据凸多边形的定义,多边形内的所有点对必须形成仅包含该多边形点的线段。例如,从{4,4}{4,2}的行形成了多边形之外的段。 第二 - 您的多边形不是convex hull,因为橡胶不能弯曲到多边形内部到点{3., 2.5}。 所以你需要修复你的算法。

答案 1 :(得分:0)

您的直观解决方案是正确的,只是它有一个点太多:(1, 4)。凸壳通常被定义为最小凸集。如果包含(1, 4),则该集合是凸的,但它不是最小的,因为(1, 4)位于集合中其他两个点之间的界线上:(0,4)(4,4)。如果删除(1, 4),则假想橡皮筋的形状不会改变。

看起来您的程序中存在错误。