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

标签 c++ algorithm math computational-geometry mesh

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

相关文章:

c++ - 运行编译程序 - "Invalid argument"

c++ - 截图 C++ directx 获取黑色图像

c++ - 数据包延迟变化 (PDV)

java - 字符串的线性时间排序算法?

python - Pandas 对负整数和正整数、多列进行排名

c++ - 使用给定的行 vector 和查找以最大形式排列的二进制矩阵的列 vector 和

javascript - 意外语法错误 : unexpected number

c++ - 如何交换数组元素以将数组从类列转换为类行表示

algorithm - 在大文件中查找重复项

algorithm - 压缩打乱的整数序列 [0, N)