Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 什么是误解?_Algorithm_Convex Hull_Grahams Scan - Fatal编程技术网

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)不应该是它的一部分吗?