【发布时间】:2010-06-17 20:20:46
【问题描述】:
可能重复:
How to find largest triangle in convex hull aside from brute force search
我有一组随机点,我想从中找到按面积计算的最大三角形,每个顶点都在其中一个点上。
到目前为止,我已经发现最大三角形的顶点只会位于点云(或凸包)的外部点上,所以我编写了一个函数来做到这一点(在 nlogn 时间内使用 Graham 扫描) .
然而,这就是我卡住的地方。我可以弄清楚如何从这些点中找到最大三角形的唯一方法是在 n^3 时间使用蛮力,这在平均情况下仍然是可以接受的,因为凸包算法通常会剔除绝大多数点。但是,在点在一个圆上的最坏情况下,这种方法会失败。
有谁知道更有效地执行此操作的算法吗?
注意:我知道 CGAL 有这个算法,但他们没有详细说明它是如何完成的。我不想使用库,我想学习这个并自己编程(并且还允许我将它调整到我想要它的操作方式,就像其他实现拾取共线点的格雷厄姆扫描一样我不想)。
【问题讨论】:
-
CGAL 中执行此操作的例程的名称是什么?
-
@andand:maximum_area_inscribed_k_gon_2,我想。
-
@Faken:源代码没有说明 CGAL::maximum_area_inscribed_k_gon_2 使用什么算法。不过,您可能想看看它(cgal.org/Manual/latest/include/CGAL/extremal_polygon_2.h),看看您是否可以重构逻辑。
-
@Faken:这是stackoverflow.com/questions/1621364/… 的完全相同的副本。接受的答案提供了明确的 O(n) 解决方案。
-
@andand:我想到了一个类似的方法,但我很快就忽略了它,因为我无法证明它总是会以最大的三角形结束(更糟糕的是,我曾认为我也有一个反例,我忽略了在纸上实际测试)。这个想法非常简单,感谢您向我指出,为我提供了另一种探索途径,但说实话,我仍然有疑问,O(n) 时间?听起来好得令人难以置信。