C#-三角形网格的良好数据结构
作者:互联网
我正在寻找一种由三角形组成的3D网格或面集的内存有效但方便的数据结构.
目前,我正在使用这种“经典”结构:
>点列表和三角形列表.
>每个点都有一个X,Y和Z值.
>每个三角形都有三个索引i0,i1,i2,它们指向点列表中的一个点.
这是我能想到的最紧凑的布局.如果我要做的只是绘制网格,并且永远不要对其进行修改或过滤,那将是完美的选择.
但是,它的确会使修改网格或生成新的局部网格的大多数操作非常麻烦,例如:
>删除三角形非常无效.
>生成仅具有少于3个邻居的三角形的新网格
>查找并删除在给定边界框中具有一个或所有点的所有三角形
>以一定角度找到所有边缘
>去除所有短于一定长度的边缘
基本上,任何需要修改网格,在边缘上迭代或查找相邻面/边缘的操作都需要生成并丢弃多个临时字典和哈希集.没有简单的方法可以迭代单个面的点或边缘,或单个点周围的边/面.删除点意味着将其从每个三角形中删除,然后更改所有三角形中所有其他点的索引值,依此类推.
是否存在没有这些缺点的规范数据结构,但内存效率高?
我不是在寻找整个库,而是在寻找可以实现自己的结构(尽管了解特定库如何解决此问题可能很有趣)
解决方法:
有两种可能满足您需求的开源数据结构:
> CGAL https://www.cgal.org/
> OpenMesh http://openmesh.org/
>表面网眼http://opensource.cit-ec.de/projects/surface_mesh
我已经将它们从更难使用简化为更老了.他们都是half edge data structures
看看Bielefeld大学(Surface网格物体的开发者)的this paper,我认为这对您来说是一个很好的起点!
标签:3d,data-structures,mesh,c 来源: https://codeday.me/bug/20191122/2059475.html