征服凸壳算法前的婚姻实施问题

时间:2014-10-04 18:39:37

标签: c++ algorithm computational-geometry convex-hull

我有兴趣实施和研究Kirkpatrick–Seidel algorithm。 找到一些点的凸包是一种分而治之的方法。我只关心二维案例。

我发现了一个关于这个问题的有趣的讲义here

算法的一般步骤如下:

  INPUT: A set P of points on the plane.
  OUTPUT: The set of points that define the convex hull.
  1. Calculate median x-coordinate M of P. 
  2. Find the bridge segment that crosses the line x = M using the 
     Prune and Search Technique.
  3. Trim the set based on this segment
  4. Split P to sets PL, PR and recursively apply the above steps to find
     the remaining segments
  5. The above steps must be run twice, once for the upper hall and once
     for the lower hall. Once you find both, you have the convex hull.

(1)可以在O(N)中找到。这非常简单,特别是在C ++中,您只需将nth_element与指定的比较器

一起使用即可

(3)也可以在O(N)中找到。如果您找到的细分受到了p1点和p2点的定义,那么您只需要忽略p所在的每个点p1.x <= p.x <= p2.x

(4)只是(3)

的直接结果

(5)对刚刚找到的两个子集进行两次递归调用

为了从这种分而治之的算法中实现O(nlogn)复杂性。我们需要步骤(2)来取O(n)

根据讲义,这个步骤可以通过线性编程解决,因为我们在平面上工作,所以可以实现线性时间。

现在,讲义将更详细地解释(2)部分,以下是步骤。

enter image description here

我理解除(3)和(4)之外的每一步。

(3)。什么是b?我想这没关系。由于您已找到斜率m,然后继续找到集合P的支撑线.B正在寻找您。

(4)。 P集的支持线是什么以及如何有效地找到它?

1 个答案:

答案 0 :(得分:1)

给定斜率和点,存在一条具有通过该点的斜率的唯一线。设斜率为m,点为(px,py)。然后求解方程py = m px + b中的b(即b = py-m px);该线具有方程y = m x + b。您在步骤(3)和(4)中应该做的是为每个点计算b并将p_t作为具有最大b的点(通过最大x坐标断开连接)。这条直线是凸包的支撑线,因为它包含一个顶点,并且所有顶点(不正确地)都在一边(在这种情况下,不在它上面)。

<子> P.S。如果你因O(n log h)运行时间而感兴趣,那就不要满怀希望了;常数因素看起来很糟糕。