Algorithm 什么是误解?
我编写了格雷厄姆扫描凸包算法的一个实现,对于测试数据,我使用了点Algorithm 什么是误解?,algorithm,convex-hull,grahams-scan,Algorithm,Convex Hull,Grahams Scan,我编写了格雷厄姆扫描凸包算法的一个实现,对于测试数据,我使用了点 [(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)] 然而,我期望凸面外壳
[(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)]
我也尝试了我的点集,这也给出了相同的解决方案。在抱怨和抱怨之后,我在维基百科上读到“一个物体是凸的,如果物体内的每一对点,连接它们的直线段上的每一点也在物体内。”
在画出我的点和外壳之后。看起来我的程序在这个定义范围内生成了一个对象,但是这难道不意味着仅仅按角度排序就可以得到一个凸面外壳,外壳中没有任何点吗
我不明白凸包实际上是什么,我想解决一个不同的问题,还是我的实现和shadwstalkr都不正确?您直观的解决方案是正确的,只是它有一点太多:
(1,4)
。凸包通常被定义为最小凸集。包括(1,4)
,集合是凸的,但它不是最小的,因为(1,4)
位于集合中其他两个点之间:(0,4)
和(4,4)
。如果移除(1,4)
,则虚拟橡皮筋的形状不会改变
看起来您的程序中有一个bug。通过使用
wolframalpha
命令,您可以看到您的解决方案与实际解决方案之间的差异:
你的: 真实: 因此,多边形既不是凸的,也不是凸的,因为根据凸多边形的定义,多边形中的所有点对都必须形成线段,其中只包含该多边形中的点。例如,从
{4,4}
到{4,2}
的直线形成多边形外的线段。
第二,您的多边形既不是凸包
,因为橡胶不能弯曲到多边形内部指向{3,2.5}
。
所以你需要修正你的算法。你从哪里得到期望点的?这就是我的直觉和“橡皮筋”的比喻所产生的。False-OP解既不是
凸的
,也不是凸壳的
。请看我的答案。正确-格雷厄姆扫描的OP解决方案是错误的,但他的直觉解决方案是正确的。是的,我只评论了他的实现输出。凸包不应该是最小的,即(1,4)不应该是它的一部分吗?