如何积累3D三角网格的边缘?在c c ++中计算网格边缘的算法?

时间:2012-12-11 17:48:26

标签: c++ algorithm math computational-geometry mesh

我想积累三角模型/网格的边缘。例如,三角形立方体具有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();

我已经尝试了这个并且它工作得很完美但是我需要弄清楚它是否适用于所有类型的网格并且它是否是一种有效的方式?

3 个答案:

答案 0 :(得分:2)

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

3 * num_triangles - num_shared_edges

可以通过迭代每个三角形并累加相邻三角形的数量来累积num_shared_edges。然后除以2,因为你将它们全部计算两次(这显然假设每条边不超过两个三角形)

如果要构建唯一边的列表,则需要跟踪它们,最好是在一些易于索引的结构(如地图)中。

程序大致如下:

  1. 将边缘定义为两个索引(i1,i2)。订购那些指数,使i1&lt; I2。现在共享边缘保证匹配。
  2. 制作某种可以容纳这些边缘的列表结构。您需要能够通过其索引快速查找现有边缘,因此您需要一个可搜索的结构,例如某种树。如果您使用的是c ++,我建议使用带有i1,i2对的地图作为密钥。
  3. 遍历所有三角形,为每个三角形添加3条边。如果边缘已经存在,请不要添加边缘。
  4. 这就是它的全部内容。

答案 1 :(得分:1)

如果曲面简单且封闭,则Euler characteristic边数为E = F + V - 2。示例中的多维数据集包含V=8F=12

答案 2 :(得分:1)

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