如何对不规则形状的晶格进行三角剖分?

问题描述

我有一个 XYZ 点列表,它们排列在 XY 平面中均匀间隔的晶格中,如下所示(例如):

Points arrayed in a lattice

我想用三角形来“平铺”这些点之间的空间,这些三角形将一个点连接到其直接(最多)八个邻居中的两个,如下所示:

The same point lattice as before,but now tiled with triangles

如何在 Python 中高效地执行此操作? 一种简单的方法会检查每个点是否有八个可能的三角形,但由于考虑了许多重复的三角形,因此效率非常低。做一些事情,比如考虑每个点右下角可能的三角形,会错过一些三角形。这个问题有什么通用的算法吗?

我认为 delaunay 三角剖分不合适,因为它总是会产生凸三角剖分。




上下文

此三角剖分是根据 LIDAR 高度数据生成建筑物 3D 网格过程中的一个步骤。当我使用“通常”算法从点云(泊松、旋转球)生成网格时,我最终得到的网格中有许多孔(尤其是在陡峭的斜坡上,如塔或墙)。我希望通过识别点云在 XY 平面中形成均匀间隔的晶格并从上述角度对其进行三角剖分,我可以解决很多这些空洞问题。

point cloud height-data of a local churc

Part of a pointcloud of a local church as seen from above

解决方法

考虑每个 2x2 子网格,其中至少存在三个点 abcd

a b

d c

要获得您所描绘的三角剖分,请测试是否只有三个点。如果是这样,请放置一个由这三个点组成的三角形。否则,放置三角形 abcacd