对大组相似的向量进行分组

时间:2019-08-31 17:23:04

标签: algorithm math geometry

我有一个约200,000个三角形的3d网格。

要找到模型上的所有平坦表面(或足够接近平坦的表面),我认为我可以尝试按其法线向量对三角形进行分组(给我一个面对相同方向的三角形),然后可以在这些较小的集合中搜索一个位置或连接位置相似。

我想不出一种切实可行的方法同时又能使事情保持相对快速。我想出了需要n²的解决方案,但没有比这更优雅,更快捷的解决方案。

我有顶点信息和三角形信息(顶点,中心和法线)。

任何建议将不胜感激。

2 个答案:

答案 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个边缘。这可以在线性时间内完成:

  1. 对于具有更大索引的相邻顶点的每个顶点计数个数,请对这些数字进行部分求和。
  2. 分配并填充边缘数组(第二个顶点和实用程序数据)。使用步骤1中的数组来访问与顶点相邻的边。如果我们知道与顶点相邻的边数由一个常数从上方限制,并且整个步骤可以在线性时间内完成,则可以在恒定时间内完成这种访问。

因此,提到的效用数据是与边缘相邻的三角形对的数量。

好的,现在您有了邻接信息。现在该寻找连接的组件了。您可以使用DFS。因为每个三角形都有三个(恒定数量的)邻居,所以它将在线性时间内工作。

在这里您需要分配200'000 * sizeof(int) * 4个字节。而且可以在线性时间内完成。


您可能还想阅读有关doubly connected edge list的信息,但这非常昂贵。