扩展凸壳以减少侧面

时间:2015-06-25 22:05:48

标签: geometry computational-geometry

我们有一组标记点,其凸包不重叠。凸壳之间有一些空的空间。

鉴于未标记的点不在我们的数据中,我们想要近似确定它所在的凸包。

为了使计算速度更快,我们希望减少凸包上的边数(从而稍微扩展凸包,但不要太多)。

我可以使用哪些算法?

更新:理想情况下,我想在不与给定的附近多边形相交的约束下进行扩展。 (这种约束的动机是我有几个不相交的船体,并希望减少所有这些船体的侧面数量,同时仍然保持它们不相交。但是将其视为括号,因为我不想进行联合修改。我是很高兴修改一个船体,同时保持其他船体不变。我很乐意破解这个简单的案例,反复进行联合修改。)

4 个答案:

答案 0 :(得分:2)

也许这值得尝试。 找到 A union x 的凸包 A ',以及 B的凸包 B ' union x 。 选择最小的船体面积增加。 在下面的示例中, A '是赢家。

<小时/> Hulls2x 添加以回应评论: 一条路线是通过“最小封闭 k -gons”:

  • Mictchell等:“最小周长封闭k-gon”2006(CiteSeer link
  • Aggarwal等人:“最小面积环绕多边形”1985(CiteSeer link
  • O'Rourke等:“最小算法用于最小包围三角形”1986, Algorithmica ACM link

然而,这些算法非常复杂,不太可能有用。

答案 1 :(得分:2)

凸多边形中的&#34;点#34;测试不是那么昂贵,因为它可以通过二分法在Lg(N)比较中执行(用直线将多边形分成两部分,递归直到你剩下一个三角形)。 N是边数。实际上,27个(相应的130)边的多边形将花费你三角形的两倍(三倍)。

如果你有很多船体,那么对每一个船体进行详尽的比较都是一种浪费。有一些更好的方法,例如使用单调细分,在预处理之后,可以将搜索时间减少到总共M个边的O(Log(M))查询时间。

答案 2 :(得分:1)

如果通过增加的充气船体的假阳性率增加超过粗略阶段中的一个边缘处理的节省,则我不会感到惊讶。实际上,你甚至可以让更多为自己工作 - 无论如何,每一个通过粗略阶段检查的点都必须与真正的船体进行核对。

我没有尝试减少n包含检查中的O(n),而是想直接采取摊销O(1)的粗略通行证:

  1. 第一遍 - 检查轴对齐的边界框(AABB)。这样可以快速拒绝多边形外的绝大多数点。
  2. 第二次通过 - 将AABB划分为一个网格,其中每个网格四边形处于三种状态之一:完全在船体外部,与船体边缘相交或完全在船体内部。如果你的观点位于&#34; in&#34;或&#34; out&#34;四,你可以在这里停下来。
  3. 第3次传递 - 正常检查位于与多边形相交的网格四边形中的任何点。
  4. 可以提前计算网格的状态:

    1. 将每个网格四边形初始化为船体外
    2. 使用this answer中链接的算法跟踪网格上的船体边缘并设置所有相交的四边形。
    3. 网格现在包含船体的轮廓,因此使用简单的填充或扫描线方法来查找和设置船体内部的所有四边形。
    4. 可以改变网格的分辨率,以便在存储器成本(每个四位2位)和误报率(低分辨率网格将导致更多O(n)传统的船体检查)之间进行权衡。

答案 3 :(得分:1)

看起来你的最终目标并不是关于凸包,而是关于解决点位置问题https://en.wikipedia.org/wiki/Point_location)。而且你似乎决定通过简单地反复检查你的点与许多凸包来解决它。虽然我理解凸壳的来源(它们实际上代表了点集),但它仍然不是在算法中直接使用它们的理由。点位置问题可以通过许多更有效的算法(如基于梯形分解的搜索树)来解决,这些算法对船体边缘的数量要小得多。