【问题标题】:Point location in tetrahedron meshes四面体网格中的点位置
【发布时间】:2012-08-12 01:48:40
【问题描述】:

对于四面体网格中的点位置是否有任何经过验证的数据结构,其中四面体都是不相交但相互“接触”的? IE。大多数面恰好是两个四面体的面。

位置我的意思是我想找出给定点位于哪个四面体中,或者它是否不位于任何四面体中。

到目前为止,我已经尝试过:

  1. 一个简单的 KD 树。这对我的需求来说太慢了,因为平均树深度非常高,而且我仍然有很多单独的四面体要在每片叶子上进行测试。

  2. 一个网格,其中包含每个单元格的所有相交四面体。这似乎工作得更好,但仍然不够快。首先,网格包含很多空单元格,因为我的整体网格不是很“四四方方”。其次,实际上确实包含四面体的大多数细胞确实包含很多(10+)。我想这是因为很多四面体共享每个顶点,一旦一个顶点在一个单元格中,它的所有相邻四面体也是。

有关输入数据的一些进一步信息:网格通常不是凸面的,可能有孔或夹杂物。虽然最后两个不太可能,但我必须处理它们,这使得如果没有(昂贵且复杂的?)预处理,“行走”是不可能的。

【问题讨论】:

  • 您是否尝试过以下操作(找不到参考,所以我简要介绍一下)?从任意的tet开始。确定一个面,相对于该点位于 tet 之外(与第四个 tet 顶点相对的一侧)。踩在脸的另一侧的tet上。再检查一遍。如果没有这样的面孔,那么重点就在当前的春节。该算法适用于凸网格。它符合您的需求吗?
  • 另一个想法。您可以结合使用这两种方法。找到正确的网格单元后,就可以用上面的方法寻找正确的tet了。
  • 听起来不错。当然,您可以通过用“空”四面体填充凹面来使其适用于非凸网格?
  • 可能,尽管填补这些漏洞可能很困难。但是,如果您愿意,不妨试一试。
  • 也许interval tree,在您的情况下,定位较少数量的四面体进行测试。深度可能类似于 KD-Tree。

标签: algorithm computational-geometry


【解决方案1】:

如果您正在处理由具有邻接信息的四面体组成的 3D 三角剖分,则可以使用 walking。这是点定位的标准技术,使用 3D 方向测试

有关详细信息,请参阅 Olivier Devlers 等人的论文走在三角测量中。 (谷歌它,你会找到它的 PDF。)

【讨论】:

    【解决方案2】:

    一些快速的想法:八叉树将类似于您的网格方法,但允许您快速忽略空网格,并细分太满的网格。

    此外,您没有提到如何测试一个点是否位于四面体内部。我已经有一段时间没有看过它了,但也许 barycentric coordinates 可以加快您的四面体点测试?或sweep-line algorithm 以快速排除基于四面体顶点的四面体,这些顶点显然位于扫描线的错误一侧以包含该点。

    【讨论】:

    • 我已经在使用重心坐标了。您将如何在这里应用扫描线?
    • 一种简单的方法是在 x 坐标上对点进行排序。任何点的 x 坐标都小于您感兴趣的点的 x 坐标(类似地,都大于)的任何四面体都不可能是您感兴趣的四面体。
    【解决方案3】:

    这确实有点头脑风暴。

    也许是 kdTree 的一种习惯,它使用面对齐的平面而不是轴对齐的平面。

    如果一个点在四面体的所有四个平面的“正确”一侧,那么它必须在四面体内部。 (对吗?)如果你在任何飞机的错误一侧,那么你不仅可以排除当前的 tet,还可以排除飞机那一侧的任何其他人。

    看来您应该能够构建一棵树,其中每个节点都是一个平面,而叶节点意味着您处于一个特定的 tet 中(假设 tet 永远不会相交)。这棵树可能很深,但由于每个测试只针对一个平面(而不是更昂贵的三角形测试),并且由于叶节点给您准确的答案,它似乎应该很快。

    有效地构建树可能会很困难。

    【讨论】:

    • 那不就是一棵普通的BSP树吗?必须进行大量拆分或复制
    • @ltjax:不,它不是普通的 BSP。使用普通的 BSP 树,您会遍历到一个叶子,它会为您提供要测试的 tets 列表。使用我试图描述的方法,遍历树到一个 leat 给你一个特定的 tet,即该点在其中,或者表明该点不在任何 tet 中。它将分区与针对 tet 的测试相结合。
    • 这还是很普通的。我假设重复的数量和平均树深度使这不可行。请记住,如果您拆分一个四面体,您最终可能会得到多达六个四面体。除非你使用更“正交”的东西,比如 KD-Tree 或 Octree,否则在构建树时会遇到很多准确性问题。
    • 我不确定我是否理解您关于分裂四面体的评论。这些不是任意平面,而是包含四面体本身边的相同平面。不会涉及分裂。树下的每个分支都有效地排除了完全位于测试平面另一侧的 tets。无需拆分。
    • 选定平面两侧的四面体呢?
    猜你喜欢
    • 2023-01-20
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多