我已经为这些东西编写了代码,但它们不在文件交换中。不过,我可以说服他们通过直接邮件发送出去。
找到到凸包的距离相对容易,但并非易事。无论如何,delaunay 细分都以凸包为界。所以你可以很容易地将镶嵌转换成凸包,或者只使用凸包。请注意,对于许多用途来说,凸包通常是非常差的近似值,特别是如果您将其用于颜色映射,这可能是我看到的最常见的用途。在这种情况下,alpha 形状是更好的选择。Alpha 形状也将具有三角形边界表面,但通常它不会是凸面的。
因此,要找到凸三角剖分上的最近点:
转换为凸边界面,即凸包。这减少了寻找那些在四面体对之间不共享的三角形。内部构面将始终在所有构面列表中恰好出现两次。当然,这个技巧也适用于非凸曲面细分,因此适用于 alpha 形状。
计算每个三角形表面刻面的边界外接圆。这使您可以知道何时停止检查构面。
获取到表面上每个点的距离。按到该构面中最近点的距离对每个构面进行排序。首先查看该列表中最近的方面。
计算到步骤 3 中找到的明显最近的面的距离。通过最小距离规划 (LDP) 找到一个简单的解决方案,可以将其转换为受约束的线性最小二乘法。Lawson & Hanson 对此有一个算法。
重复第 4 步,直到找到的当前最佳距离小于该距离,将其与第 2 步中的任何外接圆进行比较。这个循环实际上非常短,至少对于凸包而言。对于来自 alpha 形状的更一般的非凸包,可能需要更多时间。
您还可以通过从搜索中排除远离相关点的方面来稍微减少搜索空间。使用这些刻面法线进行此测试。