用Matlab计算点到三维三角网的距离

用Matlab计算点到三维三角网的距离,matlab,geometry,triangulation,delaunay,Matlab,Geometry,Triangulation,Delaunay,我有一个3D点云,我已经使用Matlab的函数DelaunayTri将其转换为Delaunay三角剖分。现在我有一个3D的测试点,我想用Matlab计算这个点和三角测量之间的最小距离 到目前为止,我一直在考虑在Matlab中使用DelaunayTri类的最近邻(…)成员函数,在三角剖分中找到离我的测试点最近的点,然后计算它们之间的距离。这很重要,但不是我真正想要的 一般来说,三角剖分上距离我的测试点最近的点不是三角剖分的顶点,而是三角形面上的某个地方。我怎样才能找到这一点 谢谢你 我已经为这些东

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

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

一般来说,三角剖分上距离我的测试点最近的点不是三角剖分的顶点,而是三角形面上的某个地方。我怎样才能找到这一点


谢谢你

我已经为这些东西编写了代码,但它们不在文件交换中。不过我可以相信我会通过直邮的方式把它们寄出去

找到到凸包的距离相对容易,但不是很简单。delaunay细分无论如何都以凸包为边界。因此,您可以很容易地将细分转换为凸面外壳,或者只使用凸面外壳。请注意,对于许多用途来说,凸包通常是非常糟糕的近似值,特别是当您将其用于颜色映射时,这可能是我看到的最常用的颜色映射。在这种情况下,alpha形状是更好的选择。Alpha形状也将有一个三角形的边界曲面,尽管通常它不是凸面

因此,要在凸三角剖分中找到最近点:

  • 转换为凸面边界曲面,即凸面外壳。这就简化了寻找那些在四面体对之间不共享的三角形的过程。内部面将始终在所有面列表中精确显示两次。当然,这个技巧也适用于非凸细分,对于alpha形状也是如此

  • 计算每个三角形曲面面的边界外圆。这允许您知道何时停止检查面

  • 获取到曲面上每个点的距离。根据到该面中最近点的距离对每个面进行排序。首先查看列表中最近的方面

  • 计算到步骤3中发现的表面最近的面的距离。通过最小距离规划(LDP)找到了一个简单的解,该解可以转化为约束线性最小二乘法。劳森和汉森对此有一个算法

  • 重复步骤4,直到找到的当前最佳距离小于该距离,并将其与步骤2中的任何外接圆进行比较。这个循环将非常短,至少对于凸壳来说是如此。对于阿尔法形状的更一般的非凸外壳,可能需要更多的时间


    通过从搜索中排除远离问题点的面,也可以稍微减少搜索空间。使用这些刻面法线进行测试。

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

    因此,基本上你要问的是,给定一个内部点的坐标和四个顶点的坐标,如何找到离四面体曲面最近的点?@Viruss mca:请仅对代码使用代码格式。@Dan:是的,我认为这是正确的。我必须承认,我不知道如何找到Matlab返回的结构中的4个顶点。然而,我的测试点不在四面体之内,而是在四面体之外。@Patrick看起来他们认真地改进了他们的delaunay方法,因为我上次使用了它们。查看
    pointLocation
    方法。我想你也会发现
    FaceNormal
    非常有用,因为从你的点到每个面的最短距离就是该点的法线face@Dan:谢谢你。通过点定位,如果我知道一个内点,我可以找到四面体。最近邻居返回的点是正确四面体上的点,这是真的吗?假设我有一个正确的四面体,我如何让三角形使用FaceNormal?谢谢你的解释。我不完全理解第3步和第4步。。。距离什么?如果能得到你的源代码那就太棒了!如果你愿意分享,我将非常感激!