【问题标题】:How do I partition an oriented bounding box?如何划分有向边界框?
【发布时间】:2012-06-03 04:07:12
【问题描述】:

我正在编写代码,该代码将为二维(不一定是凸面)多边形构建一个定向边界框 (obb) 树。

到目前为止,我能够通过找到凸包并在凸包上使用旋转卡尺来找到多边形的面积最小 obb。

下图就是一个例子。带有红线和红点的黄色填充多边形描绘了原始多边形。凸包显示为蓝色,黑色线条,obb 显示为紫色线条。

(编辑)根据要求:Interactive Version - 仅在 chrome 中测试

现在我想扩展我的代码来构建一个 OBB 树,而不仅仅是一个 OBB。这意味着我必须切割多边形,并为多边形的每一半计算新的 OBB。

这样做的推荐方法似乎是通过将 OBB 切成两半来切割多边形。但是,如果我将 obb 从其任一轴的中间切开,看起来我必须在多边形上创建新顶点(否则我如何找到该分区的凸包?)。

  1. 有没有办法避免像这样添加顶点?
  2. 如果不是,最简单的方法是什么(相对于实施难度)?什么是运行时效率最高的方式?

【问题讨论】:

  • 不知道这到底是怎么一回事,但仍然 +1 似乎是一个有趣的问题。不过,我们可以得到一些代码和/或小提琴吗?扔狗骨头。
  • @JaredFarrish:谢谢。我会努力搞定的:)
  • @JaredFarrish:添加了小提琴链接,虽然现在代码真的很乱。如果要输入自定义点,请注意 x,y 原点在左下方。
  • 来吧:jsfiddle.net/Pj2Ak/1 我将 JS 放在面向 Javascript 的区域中(而不是使用 body-style script 标签)。请记住,您需要有人知道这到底是怎么回事。
  • 这可能是题外话,但你见过three.js吗?

标签: javascript geometry computational-geometry bounding-box


【解决方案1】:

以下是我们要为其创建 OBB 树的凹多边形示例:

为了将它分割成一组新的凹多边形,我们可以简单地通过从中间切割边界框并酌情添加新的“交点”顶点来切割当前多边形:

:

这可以在 O(vertices) 时间内完成,因为我们可以简单地遍历所有边,如果边与红色分割线相交,则添加一个相交顶点。

然后可以根据这些相交顶点划分多边形,以获得一组新的更小(但仍然可能是凹面的)多边形。将至少有两个这样的多边形(红线的每边一个),但可能还有更多。在下一张图片中,新的多边形已被着色以强调:

递归地计算这些较小多边形的定向边界框可以得到所需的结果。例如,以下是递归深度为 2 的框:

希望这足以帮助那些与我一样苦苦挣扎的人!

【讨论】:

    【解决方案2】:

    如果没有进一步的上下文,我不确定这是否是您需要的,但这里是...

    将一个凹多边形细分为一组凸多边形

    在我上面的评论中,我建议递归地细分凹多边形以获得一组凸多边形。一种(常见)方法如下:

    1. 如果多边形是凸的,停止。 (我想将多边形添加到数组中)
    2. 选择多边形的未标记边。标记边缘。
    3. 沿边分割多边形(实际上是与边重合的无限线)。
    4. 对两个结果多边形(如果非空)递归重复此算法。

    注意:这正是 BSP 树的构建方式。除了在上面的算法中,我们没有构建树节点并在其中存储多边形。也许仅 BSP 的解决方案也可以解决您的问题(而不是使用 OBB)。

    测试多边形的凸度(步骤 1)

    对于每条边,将每个顶点分类为边上、边前或边后。所有顶点都应该在边上或边上。如果不是(边缘后面至少有 1 个顶点),则多边形是凹的。有关“分类”部分的详细信息,请参阅my answer to a different question,它也是这样做的。

    剩下的

    获得凸子多边形列表后,您可以为它们生成 OBB,就像您在原始帖子中所做的那样。不过你不会有 OBB tree...

    通过细分,您正在添加顶点(您问题中的一个问题)。但是,根据您的应用程序,您可能不需要使用细分的多边形:如果您要使用 BSP 树并且只需要简单的碰撞,您只需遍历树并进行一些点/边分类而不处理任何多边形顶点。

    无论如何,由于我不知道您希望您的应用程序做什么,因此不太确定进一步推荐什么,但希望这会有所帮助。

    编辑:我刚刚意识到,也许这就是你想要做的:构建一个 BSP 树并为每个节点生成 OBB,从根节点到叶节点。因此根节点 OBB 将包含整个凹多边形,而叶节点仅包含凸子多边形。我记得最初的 Doom 引擎做了类似的事情(除了轴对齐的 BB)。

    【讨论】:

    • 嘿Torious,感谢您的帮助(+1)!我做了更多的工作,我最终能够让这个工作用于凹多边形(正如你在底部编辑中所暗示的那样) - 我会在几分钟内发布这个效果的答案。
    猜你喜欢
    • 2021-07-07
    • 2023-03-18
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多