计算多个凸二维多边形交点的建议

时间:2016-06-22 18:24:43

标签: c++ multithreading boost-geometry

我正在编写这个问题钓鱼任何最先进的软件或方法,可以快速计算N 2D多边形(投影凸多面体的凸包)和{{1}的交叉点} 2D多边形,通常为MN >> M可能在订单中,或者至少有1M个多边形,N的顺序为50k。我现在已经搜索了一段时间,但我仍然提出下面显示的相同答案。

使用boost和循环

  1. 计算多面体的投影(不是瓶颈)
  2. 计算所述多面体的凸包(瓶颈)
  3. 计算投影多面体与现有2D多边形(主要瓶颈)的交集。
  4. 此循环重复N次,通常为NKK << M是与单个投影多面体相交的2D多边形的平均数。这样做是为了减少计算次数。

    这个问题是,如果我有KN=262144,它需要大约129秒(当多面体多线程时),这必须做大约300次。理想情况下,我希望将上述大小的计算时间缩短到大约1秒,所以我想知道是否有人可以帮助指出一些可以提高效率的软件或文献。

    [编辑]

    @ sehe的请求我发布了代码中最相关的部分。我没有编译它,所以这只是为了获得要点......这段代码假设有体素和像素,但形状可以是任何东西。网格中点的顺序可以是任意,但点在网格中的位置索引是相同的。

    M=19456

3 个答案:

答案 0 :(得分:1)

您可以创建多边形与边界框的比率:

这可以通过计算一次完成,以达到平均多边形区域与BB比R常数。 或者您可以使用由BB限定的圆来完成几何体,因为您只使用投影多面体:

R = 0.0;
count = 0;
for (each poly) {
    count++;
    R += polyArea / itsBoundingBoxArea;
}
R = R/count;

然后计算边界框的交集总和。

Sbb = 0.0;
for (box1, box2 where box1.isIntersecting(box2)) {
  Sbb += box1.intersect(box2);
}

然后:

Approximation = R * Sbb

如果允许凹形多边形,则所有这些都不起作用。因为凹形聚合物占据的边界框不到1%。你仍然需要找到凸包。

或者,如果您可以找到比其船体更快的多边形区域,则可以使用实际计算的平均多边形区域。这样可以给你一个不错的近似值,同时避免多边形交叉和包裹。

答案 1 :(得分:0)

嗯,问题似乎与做“碰撞检测”的游戏引擎类似。或“潜在可见集”。

虽然我对当前的最新技术知之甚少,但我记得优化是将对象封装在球体中,因为检查球体(或2D中的圆圈)之间的重叠非常便宜。 为了加速对碰撞的检查,通常将对象放入搜索结构(例如球形树(2D情况下的圆形树))。基本上将空间组织成层次结构,以便快速查询重叠。

所以基本上我的建议归结为:尝试查看用于碰撞检测的游戏引擎算法。

答案 2 :(得分:0)

<强>假设 我假设你的意思是&#34;十字路口&#34;而不是交集。此外,来自MN的大多数单个多边形不会同时重叠,这不是预期的用例。如果这个假设是真的那么:

<强>答案

使用2D游戏引擎完成此操作的方法是使用场景图,其中每个对象都有一个边界框。然后根据边界框确定的位置将所有多边形放入四叉树中的节点。然后任务变得平行,因为每个节点都可以单独处理以进行交集。

以下是四叉树的维基:

Quadtree Wiki

在3D中可以使用八叉树。

它实际上甚至不必是八叉树。您可以使用任何空间分区获得相同的结果。您可以找到多边形的最大间隔(让我们称之为S)。并创建说S/10空间分区。然后你将有10个独立的空格来并行执行。它不仅是并发的,而且不再是M * N时间,因为不是每个poly都必须与其他poly进行比较。