【问题标题】:Convex Hull Misunderstanding?凸壳误解?
【发布时间】:2012-06-28 10:35:12
【问题描述】:

我写了一个格雷厄姆扫描凸包算法的实现,对于测试数据我使用了点

[(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 都不正确?

【问题讨论】:

  • 你的期望值是从哪里得到的?
  • 这就是我的直觉和“橡皮筋”隐喻产生的结果。

标签: algorithm convex-hull grahams-scan


【解决方案1】:

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

真实的:

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

【讨论】:

  • 凸包不应该是最小的,即(1,4)不应该是它的一部分吗?
【解决方案2】:

您的直观解决方案是正确的,只是它有一个点太多:(1, 4)。凸包通常定义为 minimal 凸集。包括(1, 4),这个集合是凸的,但它不是最小的,因为(1, 4) 在集合中另外两个点之间的线上:(0,4)(4,4)。如果删除(1, 4),假想的橡皮筋的形状不会改变。

您的程序中似乎存在错误。

【讨论】:

  • False - OP 解决方案既不是convex,也不是convex hull。看我的回答。
  • True - Graham 扫描的 OP 解决方案是错误的,但他的直觉解决方案是正确的。
  • 是的,我只评论了他的实现输出。
猜你喜欢
  • 2016-09-28
  • 2015-02-07
  • 2018-05-17
  • 1970-01-01
  • 2012-06-13
  • 2021-11-07
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
相关资源
最近更新 更多