2

我有一个 3D 点云,我使用 Matlab 的函数 DelaunayTri 将其转换为 Delaunay 三角剖分。现在我有一个 3D 测试点,想在 Matlab 中计算该点与三角测量之间的最小距离。

到目前为止,我一直在考虑使用 Matlab 中 DelaunayTri 类的nearestNeighbor(...) 成员函数来找到三角剖分中离我的测试点最近的点,然后计算它们之间的距离。那是一些东西,但这不是我真正想要的。

三角剖分上离我的测试点最近的点通常不是三角剖分的顶点,而是三角形面上的某个位置。我怎样才能找到这一点?

谢谢!!!

4

2 回答 2

0

我已经为这些东西编写了代码,但它们不在文件交换中。不过,我可以说服他们通过直接邮件发送出去。

找到到凸包的距离相对容易,但并非易事。无论如何,delaunay 细分都以凸包为界。所以你可以很容易地将镶嵌转换成凸包,或者只使用凸包。请注意,对于许多用途来说,凸包通常是非常差的近似值,特别是如果您将其用于颜色映射,这可能是我看到的最常见的用途。在这种情况下,alpha 形状是更好的选择。Alpha 形状也将具有三角形边界表面,但通常它不会是凸面的。

因此,要找到凸三角剖分上的最近点:

  1. 转换为凸边界面,即凸包。这减少了寻找那些在四面体对之间不共享的三角形。内部构面将始终在所有构面列表中恰好出现两次。当然,这个技巧也适用于非凸曲面细分,因此适用于 alpha 形状。

  2. 计算每个三角形表面刻面的边界外接圆。这使您可以知道何时停止检查构面。

  3. 获取到表面上每个点的距离。按到该构面中最近点的距离对每个构面进行排序。首先查看该列表中最近的方面。

  4. 计算到步骤 3 中找到的明显最近的面的距离。通过最小距离规划 (LDP) 找到一个简单的解决方案,可以将其转换为受约束的线性最小二乘法。Lawson & Hanson 对此有一个算法。

重复第 4 步,直到找到的当前最佳距离小于该距离,将其与第 2 步中的任何外接圆进行比较。这个循环实际上非常短,至少对于凸包而言。对于来自 alpha 形状的更一般的非凸包,可能需要更多时间。

您还可以通过从搜索中排除远离相关点的方面来稍微减少搜索空间。使用这些刻面法线进行此测试。

于 2013-08-14T12:34:25.773 回答
0

我为这个问题编写了工具point2trimesh。这是一种“蛮力”解决方案,也适用于非凸面。

于 2015-10-02T13:09:41.503 回答