一组点中最大的三角形

时间:2010-06-17 20:20:47

标签: computational-geometry

  

可能重复:
  How to find largest triangle in convex hull aside from brute force search

我有一组随机点,我希望从中找到最大的三角形区域,其中每个点都在其中一个点上。

到目前为止,我已经发现最大三角形的顶点只会位于点云(或凸包)的外侧点上,所以我编写了一个函数来做到这一点(在nlogn时间使用Graham扫描)

然而,这就是我被困住的地方。我能弄清楚如何从这些点找到最大三角形的唯一方法是在n ^ 3时使用蛮力,这在平均情况下仍然是可接受的,因为凸壳算法通常会踢出绝大多数点。然而,在最坏的情况下,点在圆上,这种方法会失败。

任何人都知道一种算法可以更有效地完成这项工作吗?

注意:我知道CGAL在那里有这个算法,但他们没有详细说明它是如何完成的。我不想使用库,我想学习它并自己编程(并且还允许我将其调整到我希望它操作的方式,就像graham扫描,其中其他实现获取共线点我不想要。)

5 个答案:

答案 0 :(得分:1)

不知道这是否有帮助,但是如果从凸包中选择两个点并旋转船体的所有点,使两个点的连接线平行于x轴,要么与最大或具有最小y坐标的那个形成具有最大面积的三角形以及首先选择的两个点。

当然,一旦为所有可能的基线测试了一个点,就可以从列表中删除它。

答案 1 :(得分:0)

在我的头顶,也许你可以做一些涉及网格化/将点集合分成组的事情?也许......将这些点分成三组(不知道在这种情况下最好的方法是什么),做一些事情来丢弃每组中比其他两组更接近其他两组的点。相同的组,然后使用剩余的点找到可以在每个组中有一个顶点的最大三角形?这实际上会使得所有点在圆上的情况变得更加简单,因为您只关注每个组中包含的弧中心附近的点,因为这些点将是距离每个组最远的点中的点。另外两组。

不过,我不确定这是否会为某些三角形/点的分布给出正确的结果。可能存在这样的情况:合成三角形不是最佳区域,因为分组和/或顶点选择不是/不是最佳的。这样的事情。

无论如何,这些都是我对这个问题的看法。我希望我至少能够为你提供如何处理它的想法。

答案 2 :(得分:0)

以下是关于如何将其降低到O(n 2 log n)的想法。我对计算几何一无所知,所以我将它标记为社区维基;请随时改进。

通过为每个点找到通过该点的线的斜率范围来预处理凸包,使得该组完全位于线的一侧。然后反转这种关系:为叶子节点中的点构建一个间隔树,这样当用斜率查询时,你会发现这些点之间存在相切的点。

如果凸包上没有三个或更多共线点的集合,则每个斜率最多有四个点(每边两个),但是在共线点的情况下,我们可以忽略中间点。 / p>

现在,迭代凸包上的所有点对(P,Q)。我们想找到点R,使得三角形PQR具有最大面积。以PQ为三角形的基础,我们希望通过尽可能远离PQ线找到R来最大化高度。通过R平行于PQ的直线必须使得所有点位于线的一侧,因此我们可以使用预构造的区间树在时间O(log n)中找到有界数量的候选。

为了在实践中进一步改进,在分对点集中进行分支定界:找到任意三角形高度的上限(例如两点之间的最大距离),并丢弃任何一对点其距离乘以此上限小于目前为止找到的最大三角形。

答案 3 :(得分:0)

我认为rotating calipers方法可能适用于此。

答案 4 :(得分:-1)

如何一次从凸包中掉落一个点?从凸包开始,计算由每个三个相邻点(p1p2p3,p2p3p4等)形成的三角形的面积。找到具有最小面积的三角形,然后放下形成该三角形的三个点的中间。 (换句话说,如果最小区域三角形是p3p4p5,则丢弃P4。)现在您有一个带有N-1个点的凸多边形。重复相同的步骤,直到剩下三个点。这应该花费O(N ^ 2)时间。

如果存在一些不起作用的病态情况,我不会感到惊讶,但我希望它适用于大多数情况。 (换句话说,我没有证明这一点,我没有任何来源引用。)