如何将Delaunay三角剖分结果转换为多种边数据结构并对比存储空间
Delaunay三角剖分实现代码
import numpy as np import matplotlib.pyplot as plt from scipy.spatial import Delaunay points = np.array([[0.2, 0], [0.1, 1.1], [0.6, 0.1], [1, 0.5], [0.6,0.9], [0.4,0.4]]) tri = Delaunay(points) #plot plt.triplot(points[:,0], points[:,1], tri.simplices) plt.plot(points[:,0], points[:,1], 'o') plt.show() print(tri.points) """ [[0.2 0. ] [0. 1.1] [0.6 0. ] [1. 1. ] [0.2 0.8] [0.4 0.4]] """ print(tri.simplices) """ [[0 5 1] [5 4 1] [4 5 3] [5 2 3] [2 5 0]] """

问题说明
上述代码对输入点集完成了Delaunay三角剖分,输出得到点集数组tri.points和三角面片索引数组tri.simplices。需要将这两个输出分别转换为半边数据结构(half-edge data structure)、翼边数据结构(winged-edge data structure)、角表数据结构(corner table data structure)、*四边形边数据结构(quad edge data structures)*四种不同的网格表示形式,同时对比哪种结构的存储空间占用更低。需要确认Python生态中是否有支持此类转换的第三方库,还是需要完全自行编码实现。
解答
- 可用的现成第三方库如下:
trimesh:是Python生态中最常用的三角网格处理库之一,原生支持半边数据结构。你可以直接将scipy输出的点和面片数组传入trimesh.Trimesh(vertices=tri.points, faces=tri.simplices),生成的对象内置edges、halfedges等属性,可直接获取半边结构相关数据,也可以基于它提供的接口二次扩展得到翼边、角表、四边形边结构。pymesh:内置了半边、四边形边等结构的实现,不过安装门槛比trimesh高,部分环境下依赖配置比较麻烦。meshio:主要用于不同网格格式的读写,本身不直接内置这四种结构的封装,但可以基于它读取的点面数据快速做转换。
- 仍需自行编码的部分:
目前没有库能直接同时输出四种标准结构的完整定义,如果你需要严格复现四种结构的标准定义、做精确的存储空间对比,部分逻辑需要自行补充:- 翼边结构需要额外存储每条边的左右面、左右端点对应的前后边关联信息,trimesh没有直接打包好的翼边结构,需要基于半边数据做映射转换。
- 角表结构的存储逻辑最简单,仅需存储顶点、面片、每个角对应的对角角索引,可直接基于scipy输出的面片数组遍历生成,不需要额外依赖。
- 四边形边结构专门用于处理流形网格的拓扑,如果你处理的都是三角剖分的流形网格,可以基于trimesh的半边结构配对生成,否则需要自行处理非流形的边界情况。
- 存储空间对比结论:
同一张三角网格下,存储空间占用从低到高排序通常是:角表结构 < 半边结构 < 翼边结构 < 四边形边结构,具体占用大小和你存储每个属性的数据类型(比如用int32还是int64存索引)强相关。
内容的提问来源于stack exchange,提问作者Lyrk
相关产品推荐
相关产品推荐

