当前位置: 首页 > 知识库问答 >
问题:

求两个三角形之间最小距离的算法

万俟光临
2023-03-14

在数学上问这个可能更好。是的,但我先试试这里:

假设三角形不是共面的,我知道代表两个三角形之间最小距离的一个点必须位于其中一个三角形的顶点或沿边。对于另一个三角形,它可以位于平面上的任何位置,包括沿边或顶点。

实际上,我不需要最小距离本身——最终,我需要找到的只是三角形是否在彼此的某个epsilon内。

我尝试过的一件事是简单地对曲面进行采样,并应用快速ε测试,以查看一个三角形中的任何点是否在另一个三角形上的任何点的ε范围内,但这对我的应用程序来说太慢了。在我看来,这应该有一个直接的解析解,但我还没有找到关于这个问题的任何东西。

共有1个答案

彭博厚
2023-03-14

正如Axel评论中提到的,可以在PQP-Proximity Query Pack(特别是TriDist.cpp文件)中找到一个实现。然而,该算法没有附带的引用,我也找不到埃里克·拉森的任何东西,他显然是写的(事实上,这篇2014年的论文也提到,除了PQP源html" target="_blank">代码,他们找不到该算法的任何出版物)。

该算法的要点非常简单:

首先,找出每对边之间的最小距离(总共9个组合)。在这里,PQP使用以下算法:

弗拉基米尔J.线段间距离的快速计算。信息处理信件,第21号,第55-61, 1985页。

请注意,我已经将我们正在比较的两条边的顶点着色为蓝色,而离边顶点现在是绿色的。我们现在查看边缘顶点,并检查它们是否在两个平面之间的平板内。因为顶点D在两个平面之间,我们知道我们没有找到两个三角形之间的真正最小距离。

因为两个边外顶点都在两个平面之外,所以我们可以保证找到了两个三角形之间的最小距离。

在二维中,可以保证最小距离沿两个三角形的边,但在三维中并非如此。如果上述检查未找到最小距离(即,没有一对边通过平面测试),则以下情况之一必须为真:

  1. 其中一个最近点是一个三角形的顶点,另一个最近点在另一个三角形的面上
  2. 三角形相交
  3. 一个三角形的边平行于另一个三角形的面
  4. 一个或两个三角形是退化的

首先,你必须检查案例1:

将第一个三角形的点投影到第二个三角形上,并取投影点与第一个三角形法线的点积。所有的点积都应该有相同的符号(如果没有,交换你操作的三角形)。然后,找到投影最短的顶点,检查它的投影实际上位于另一个三角形的表面。如果是这样,你已经找到了你的两点(你正在看的顶点,以及它在另一个三角形上的投影)。

否则,它必须属于情况2-4。

如果这两个三角形在之前的检查中显示为不相交,则情况3或4。不管怎样,只需使用第一次测试中发现的最小点即可。否则,必须是情况2,在这种情况下,最小距离为零。

 类似资料:
  • 问题内容: 我需要创建一个类来计算两点之间的距离。我被困住了,我是一个完全的初学者。这是我的课程: 第二课。 我不确定如何在两个定义的点之间获取点对象(中间点)。 我可以创建点对象,但不确定如何通过位于这两个点对象之间的方法返回点对象。 问题答案: 平面上的两个点(x1,y1)和(x2,y2)之间的距离为: 但是,如果您想要的只是两个点的中点,则应将中点函数更改为: 这将返回一个全新的点对象,其点

  • 问题内容: 我对计算两个numpy数组(x和y)之间的各种空间距离感兴趣。 http://docs.scipy.org/doc/scipy-0.14.0/reference/generation/scipy.spatial.distance.cdist.html 但是,以上结果会产生太多不必要的结果。我如何仅将其限制为所需的结果。 我想计算[1,11]和[31,41]之间的距离;[2,22]和[3

  • 我对计算两个numpy阵列(x和y)之间的各种空间距离感兴趣。 http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance.cdist.html 但是,上述结果会产生太多不需要的结果。我怎样才能限制它只用于我所需的结果。 我想计算[1,11]和[31,41]之间的距离;[2,22]和[32,42

  • l和r分别是区间的起点和终点。

  • 我需要计算3D点(纬度、经度、海拔)和线(定义为两点)之间的最小距离。海拔在地面上是不必要的,我需要考虑飞行物体。我只找到了一篇文章,解释了如何在通用空间上做到这一点,但我的点是用纬度/纬度/海拔(米)定义的。 谢谢你指出了正确的方向,在我的例子中,我需要用Javascript来做这件事,但找不到任何考虑到海拔高度的库。 点线距离——三维

  • 我试图找到树中两个节点之间的最大距离。这是我的程序: 程序似乎正在运行;但是没有为一些测试用例显示正确的输出。我采取的方法是: 求根节点的子节点数(我一直认为根节点为0)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?