四面体网格中的点位置

时间:2012-08-07 15:41:55

标签: algorithm computational-geometry

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

另外,如果一个点位于四面体内,你就不会提及你是如何测试的。从我看过它已经有一段时间了,但也许barycentric coordinates可以加速你的四面体测试?或者sweep-line algorithm基于四面体顶点快速排除四面体,四面体顶点明显位于扫描线的错误一侧以包含该点。

答案 2 :(得分:0)

这无疑是一个头脑风暴。

也许kdTree的自定义使用面对齐的平面而不是轴对齐的平面。

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

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

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