用于在区域内查找三角形的算法

时间:2015-09-14 23:40:38

标签: algorithm graphics geometry

我正在研究小项目,要求我快速找到一组三角形中的哪些三角形部分或完全包含在给定的矩形区域内。我对优化快速搜索感兴趣 - 我不受内存限制。

这不是我太熟悉的领域,所以我迄今为止所做的就是在谷歌上寻找处理这个问题的标准算法。到目前为止,我最接近的是使用两个间隔树。这有点笨拙,因为我必须对每个三角形的边缘和矩形区域的边缘在x和y方向上的间隔重叠进行测试。

有人可以指向任何“正确”的资源吗?处理这个问题的方法是什么?

谢谢!

编辑:我忘了提到我目前使用的矩形区域与坐标轴x和y平行。目前,我对任何利用此约束的解决方案感到满意。但是,一般来说,完全任意矩形的解决方案很容易理解。

3 个答案:

答案 0 :(得分:3)

您可以使用AABBTree(AABB代表Axis Aligned Bounding Box树),. 想法是将每个三角形包含在其轴对齐的边界框中,然后构建一个树,其初始三角形为叶子,并且上部节点具有边界框,该边界框是其子节点的边界框的并集​​。然后,当搜索哪些三角形与"某些"有一个非空的交集时,你会检查"是什么"与节点的边界框有一个交集,然后沿着树向下测试它的子节点(递归函数)。

您可以在以下位置找到AABBTrees的有效实施:

答案 1 :(得分:1)

假设矩形是轴对齐的,我就这样做:

  1. 将三角形的边界框与区域进行比较。如果它在里面,则三角形在里面。如果根本没有重叠,那就没有了。如果需要检查具有不同区域的同一组三角形,请为此步骤的每个维度使用间隔树。

  2. 我们在第一步检查了两个简单的情况,因此我们知道区域和边界框重叠。检查三角形的任何点是否在矩形内。如果是这样,三角形就在里面。

  3. 检查矩形的四边,三角形的三边是线段交点

答案 2 :(得分:1)

如果不允许对三角形集进行预处理,那么除了将每个三角形详尽地与窗口进行比较之外,没有比这更好的了。

为了轻松解决三角形/矩形重叠问题(或仅仅是为了解释它),您可以形成两个多边形的Minkowski和,以便在"凸点多边形中转换问题&# 34;实例

enter image description here

当然,欢迎进行初始的轴对齐边界框测试。

如果您的窗口是旋转的矩形,您可以"取消旋转"整个场景使窗口轴对齐并恢复到第一个问题。