使用Matlab计算3D中从点到三角测量的距离

时间:2013-08-14 11:16:21

标签: matlab geometry triangulation delaunay

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

到目前为止,我已经想过在Matlab中使用DelaunayTri类的nearestNeighbor(...)成员函数来找到最靠近我的测试点的三角测量中的点,然后计算它们之间的距离。这是事情,但它不是我真正想要的。

三角测量到测试点的最近点通常不是三角测量的顶点,而是三角形面上的某个顶点。我怎么能找到这一点?

谢谢!!!

2 个答案:

答案 0 :(得分:0)

我已为这些内容编写代码,但它们不在文件交换中。我可以说服他直接通过直接邮寄给他们。

找到与凸包相距的距离相对容易,但不是微不足道的。无论如何,delaunay曲面细分受到凸包的限制。因此,您可以轻松地将该曲面细分转换为凸包,或者仅使用凸包。请注意,凸包通常是一个非常差的近似用于许多目的,特别是如果你使用它进行颜色映射,这可能是我看到的最常见的用途。在这种情况下,alpha形状是一个更好的选择。 Alpha形状也将具有三角形边界表面,但通常它不会凸出。

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

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

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

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

  4. 计算到步骤3中找到的显然最近的小平面的距离。通过最小距离编程(LDP)找到一个简单的解决方案,可以将其转换为约束线性最小二乘法。劳森&汉森有一个算法。

  5. 重复步骤4,直到找到的当前最佳距离小于距离,将其与步骤2中的任何一个外接圆相比较。这个循环非常短,至少对于一个凸包。对于α形状的更一般的非凸壳,可能需要更长的时间。

    您还可以通过排除搜索中从相关点指向AWAY的构面来缩小搜索空间。使用这些方面法线进行此测试。

答案 1 :(得分:0)

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