我有一个约200,000个三角形的3d网格。
要找到模型上的所有平坦表面(或足够接近平坦的表面),我认为我可以尝试按其法线向量对三角形进行分组(给我一个面对相同方向的三角形),然后可以在这些较小的集合中搜索一个位置或连接位置相似。
我想不出一种切实可行的方法同时又能使事情保持相对快速。我想出了需要n²的解决方案,但没有比这更优雅,更快捷的解决方案。
我有顶点信息和三角形信息(顶点,中心和法线)。
任何建议将不胜感激。
答案 0 :(得分:0)
我可能误解了这个问题,所以我要说一下我认为您需要做的事情:“给出一组向量,将并行向量组合在一起”。。
您可以使用哈希映射来解决此问题。我假设您以以下形式存储法线向量:
a + b + c = 0 < / strong>
您只需要编写一个将向量转换为整数的函数,例如,如果我知道 0 <= a,b,c <= 1000 ,那么我可以使用 F(a,b,c)= a + 1000b + 1000000c ,可以保证每个唯一矢量都有唯一的整数。此后,只需创建一个哈希图即可,该哈希图将一些整数映射到列表,并将所有并行向量存储在同一列表中。
答案 1 :(得分:0)
您想从三角形中找到图形上的连接组件。您唯一需要的就是以一种方便的形式存储邻接信息。
创建所有边缘(min, max)
的列表,如果所有边缘都有两个相邻的三角形,则有300'000个边缘。这可以在线性时间内完成:
因此,提到的效用数据是与边缘相邻的三角形对的数量。
好的,现在您有了邻接信息。现在该寻找连接的组件了。您可以使用DFS。因为每个三角形都有三个(恒定数量的)邻居,所以它将在线性时间内工作。
在这里您需要分配200'000 * sizeof(int) * 4
个字节。而且可以在线性时间内完成。
您可能还想阅读有关doubly connected edge list的信息,但这非常昂贵。