gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:19 24 4
gpt4 key购买 nike

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

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

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

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

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

更新 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 * num_triangles - num_shared_edges

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

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

流程大致如下:

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

仅此而已。

关于c++ - 如何累积 3D 三角形网格的边?在 C C++ 中计算网格边缘的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13825693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com