0

我想积累三角形模型/网格的边缘。例如,一个三角形立方体有 18 条边。

它看起来如此简单和容易,但实际上它太复杂了。我有一个三角形的所有相邻信息。例如,我有相邻的顶点和三角形,我知道哪些三角形有共同边,但问题是如何提取两个三角形之间的共同边。

需要考虑的一件事是边的点/顶点不应该有任何重复的索引。

首先是如何计算边的总数。记住一个立方体有 18 条边。

我尝试了很多,但现在放弃了。:) 任何想法?.

更新1:

好的,我有一个三角形 T[i](索引 v1,索引 v2,索引 v3),它具有三个边 v1v2、v2v3、v3v1。

我有一个所有边缘的邻居三角形。

T[i].index_of_sharedTri1_with_edge_v1v2, 
T[i].index_of_sharedTri2_with_edge_v2v3, 
T[i].index_of_sharedTri3_with_edge_v3v1; 

现在我需要制作哪个循环才能提取独特的边缘?我需要比较哪些信息?我需要比较边顶点、共享三索引还是什么?我尝试了很多方法,但它太复杂了。

更新 2:

GLTris *e = new GLTris[nb_Tris*3];
int n = getTotalEdges_Sorted(indices, nb_Tris, e);
cout<<n<<endl;
int ne = RemoveDublicatesFromAnSortedEdgeArray(e, n);
for(int i=0; i<ne; i++)
   e[i].Cout();

我已经尝试过了,效果很好,但我需要弄清楚它是否适用于所有类型的网格,这是一种有效的方法吗?

4

3 回答 3

2

如果你有三角形的数量,以及每个三角形的邻接信息,那么边的数量就是:

3 * num_triangles - num_shared_edges

其中 num_shared_edges 可以通过迭代每个三角形并将相邻三角形的数量相加来累积。然后除以 2,因为您将把它们都数了两次(这显然是假设每条边的三角形不超过两个)

如果你想建立一个独特的边缘列表,你需要跟踪它们,最好是在一些容易索引的结构中,比如地图。

流程大致如下:

  1. 将边定义为两个索引 (i1, i2)。对这些索引进行排序,使 i1 < i2。现在共享边保证匹配。
  2. 制作某种可以容纳这些边缘的列表结构。您需要能够通过其索引快速找到现有边,因此您需要一个可搜索的结构,例如某种树。如果您使用的是 c++,我建议使用以 i1,i2 对作为键的映射。
  3. 遍历所有三角形,为每个三角形添加 3 条边。如果边缘已经存在,请不要添加它。

这里的所有都是它的。

于 2012-12-11T17:53:18.653 回答
1

If surface is simple and closed than by Euler characteristic number of edges is E = F + V - 2. Cube in your example has V=8, F=12.

于 2012-12-11T23:56:25.023 回答
1

我学会了一个简单的技巧。
首先,您定义一个结构,它是一对无序的顶点索引(例如,struct{int i,j}保证的 a i<j)。然后创建一个std::set<UnorderedPair>. 最后,每次遇到边缘时,只需将其插入此集合即可。最后,该集合中的元素数量将为您提供唯一边的数量。

于 2012-12-12T01:34:47.530 回答