四面体网格中的点位置是否有任何经过验证的数据结构,其中四面体都是不相交的但彼此“接触”?即大多数面孔都是两个四面体的面。
按位置我的意思是我想找出给定点位于哪个四面体中,或者它是否位于任何四面体中。
到目前为止,我已经尝试过:
一个简单的KD树。这对我的需求来说太慢了,因为平均树深非常高,我仍然有很多单独的四面体在每片叶子中进行测试。
包含每个细胞的所有交叉四面体的网格。这似乎工作得更好,但仍然不够快。首先,网格包含许多空单元格,因为我的整体网格不是非常“四四方方”。其次,大多数实际上含有四面体的细胞确实含有大量细胞(10+)。我想这是因为很多四面体共享每个顶点,一旦顶点在一个单元格中,所有相邻的四面体也是如此。
关于输入数据的一些进一步信息:网格通常不是凸面的,可能有孔或夹杂物。虽然最后两个不太可能,但我必须处理它们,如果没有(昂贵和复杂的?)预处理,这就不可能“行走”。
答案 0 :(得分:6)
如果您正在处理由具有邻接信息的四面体组成的3D三角测量,您可以使用行走。这是点位置的标准技术,使用3D 方向测试。
有关更多信息,请参阅Olivier Devillers等人撰写的论文走在三角测量中。 (谷歌它,你会找到它的PDF。)
答案 1 :(得分:1)
一些快速的想法:八叉树将类似于您的网格方法,但允许您快速忽略空网格,并细分太满的网格。
另外,如果一个点位于四面体内,你就不会提及你是如何测试的。从我看过它已经有一段时间了,但也许barycentric coordinates可以加速你的四面体测试?或者sweep-line algorithm基于四面体顶点快速排除四面体,四面体顶点明显位于扫描线的错误一侧以包含该点。
答案 2 :(得分:0)
这无疑是一个头脑风暴。
也许kdTree的自定义使用面对齐的平面而不是轴对齐的平面。
如果一个点在四面体的所有四个平面的“正确”侧,则它必须在四面体内。 (对吗?)如果你在任何飞机的错误一侧,那么你不仅可以排除当前的tet,还可以排除飞机那一侧的任何其他部分。
看起来你应该能够构建一个树,其中每个节点都是一个平面,叶子节点意味着你处于一个特定的tet(假设tets永远不会相交)。树可能很深,但由于每个测试仅针对一个平面(而不是更昂贵的三角形测试),并且由于叶节点只给出了一个答案,所以它看起来应该很快。
有效地构建树可能会很困难。