2012-12-11 78 views
0

我想积累三角模型/网格的边缘。例如,三角形立方体有18个边。如何累积3D三角形网格的边缘?在c C++中计算网格边缘的算法?

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

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

首先是如何计算边的总数。记住一个立方体有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(); 

我已经试过这和它的作品完美,但我需要弄清楚它是否会在所有类型的网格工作,它是一个有效的方法?

回答

1

如果你有三角形的数量,以及每个邻接信息,然后边的数量很简单:

3 * num_triangles - num_shared_edges

凡num_shared_edges可以通过遍历每个三角形积累并累加相邻三角形的数量。然后除以二,因为你已经算他们所有的两倍(这显然是假设你有每边不超过两个三角形)

如果你想建立的独特边缘的列表,你需要跟踪其中,最好在一些像地图一样易于索引的结构中。

的过程大致如下:

  1. 限定边缘为两个索引(I1,I2)。订购这些指数,使i1 < i2。现在共享边保证匹配。
  2. 制作一些可以容纳这些边缘的列表结构。你需要能够通过它的索引快速找到现有的边缘,所以你想有一个结构,它是搜索的,比如某种树。如果您使用的是C++,我会建议使用i1,i2作为关键字的地图。
  3. 遍历所有三角形,加入每3个边缘。如果边缘已经存在,不要添加边缘。

这就是它的全部。

+0

是的主要问题是这一个,当我将添加共享的三角形,那么我将如何知道这个三角形我已经添加或已经计数。例如在一个立方体的情况下,每个三角形与3个三角形共享。当我将标记为三角形的第一个边缘时,当共享三角形进入循环时,该边缘再次出现。 – furqan

+0

我试图添加一些更多的细节,但它有助于扩展您的原始问题,提供更多关于您实际拥有的数据,结构和实际结果的更多信息。 – JasonD

+0

谢谢你的加入。我试图理解你,但仍然困惑。我已经更新了我的问题,请现在查看。我没有使用链接列表,而只是c数据结构。问题是我有一切与三角形的邻接有关,但我需要比较哪些信息来提取共享边缘? “您可以根据其端点的两个索引为边缘建立ID。”如果多维数据集ID应该为18,那么这就是如何给共享边缘赋予唯一ID的问题。但是,如何? – furqan

1

如果表面简单并且比通过Euler characteristic关闭的边数是E = F + V - 2。您示例中的多维数据集有V=8,F=12

1

我已经学会了一个简单的把戏。
首先,定义一个无序对顶点索引的结构(例如,保证i<jstruct{int i,j})。 然后创建一个std::set<UnorderedPair>。 最后,每次遇到边缘时,只需将其插入到该集合中即可。最后,这个集合中的元素数量会给你独特的边缘数量。

+0

您的意思是,如果是立方体,则会有36对顶点。并且在每一对v1中应该小于V2 v1 furqan