我写了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都不正确?
答案 0 :(得分:3)
使用wolframalpha
Polygon{}
命令,您可以看到解决方案与真实解决方案之间的差异:
您的:
真实:
因此,您的多边形不是convex
,因为根据凸多边形的定义,多边形内的所有点对必须形成仅包含该多边形点的线段。例如,从{4,4}
到{4,2}
的行形成了多边形之外的段。
第二 - 您的多边形不是convex hull
,因为橡胶不能弯曲到多边形内部到点{3., 2.5}
。
所以你需要修复你的算法。
答案 1 :(得分:0)
您的直观解决方案是正确的,只是它有一个点太多:(1, 4)
。凸壳通常被定义为最小凸集。如果包含(1, 4)
,则该集合是凸的,但它不是最小的,因为(1, 4)
位于集合中其他两个点之间的界线上:(0,4)
和(4,4)
。如果删除(1, 4)
,则假想橡皮筋的形状不会改变。
看起来您的程序中存在错误。