我在3D中有两个凸多边形。他们都在不同的平面上,所以他们是一对面孔。3D中两个凸多边形之间的距离
什么来计算这两个多边形之间的最近距离的最简单的方法?
编辑:具有在第1多边形的端点以及在第二多边形另一个另一端点最短的线的长度。我正在寻找的距离是这条最短的线的长度。
我在3D中有两个凸多边形。他们都在不同的平面上,所以他们是一对面孔。3D中两个凸多边形之间的距离
什么来计算这两个多边形之间的最近距离的最简单的方法?
编辑:具有在第1多边形的端点以及在第二多边形另一个另一端点最短的线的长度。我正在寻找的距离是这条最短的线的长度。
这是线性约束和二次目标函数的简单优化有限。有许多可以使用的算法,例如梯度下降。
您能否请进一步解释 - 二次函数是什么? – 2011-02-25 02:28:11
目标是“最小化(x2 - x1)** 2 +(y2 - y1)** 2 +(z1 - z1)** 2”。给出最小距离的点也给出最小距离的平方。 – 2011-02-25 02:38:44
啊,对于每个边,约束条件是“x1,y1,z1位于这样的平面上”,“x1,y1,z1位于平面的这一半上”。辉煌!只要你能用一个等式*(我相信你可以,但说实话,我没有任何想法)在三维空间中划分一个平面,这会起作用,而且会更容易和比我的方法更容易出错。 +1! – 2011-02-25 13:22:32
环路通过所述第一对象的所有顶点,然后在循环中,通过所述第二对象的所有顶点循环。在最内层的循环中,比较两个当前顶点之间的距离并存储最小距离。我一直这样做,只要你没有一个可笑的大网眼,它几乎是瞬间的。
顶点可能不排队。例如,这两个多边形可以以直角相互接触,其中一个第二个多边形的顶点接触中间的第一个多边形。 – Dmi 2011-02-25 00:10:20
它不清楚你试过了什么。
This看起来可能对部分本身。
那么你所要做的就是检查所有的边缘对。我希望在尝试优化之前先实现这一点。
有可能是在考虑从一个质心的载体是在那个方向某种意义上其他,只考虑边缘的优化。
那么,只有几种可能性;两个多边形之间的最短线路可以是:
案例1-3的全部都通过将每个边+顶点对视为线段来处理,并列举distance between all line-segment pairs。
情况4,找到distance between each vertex and the other polygon's plane。检查以确保该线(从顶点到平面上的最近点)位于另一个多边形内部;如果不是,那么最短的路线到另一多边形将在其周边,这是已经在情况1或2
照顾(请确保为做这种检查既多边形)
对于情况5,至少一个线段必须与另一个多边形的区域相交 - 如果它们在它们的周界相交,我们将在1-3情况下捕获它,并且如果顶点与该区域相交,则我们将具有在案例4中发现它。因此,只需检查intersection of each edge with the other polygon's plane并查看交点是否在另一个多边形内。
(请确保为两个多边形做此项检查)
采取所有这些发现的最小距离,我们就大功告成了。
大多数人都提出了这个线程是“走一个多边形的所有点/边,并比较各点其他的/边缘”。如果你所做的只是比较两个相当简单的多边形,并且你不太关心如何快速做到这一点,那么这可能会正常工作。
但是,如果你想有一个相当简单和更好的方法。如Ben Voigt所建议的那样,使用二次优化方法(即Quadratic Programming)。基本上,您的多边形是您的一组线性约束,即您的解决方案点必须位于多边形的每个边的内侧(这是一个不等式约束)。而你的优化成本函数就是欧几里得距离,即标准公式中的Q就是单位矩阵。一旦出现这样的问题,你可以使用一个解决这个问题的库(这里有许多这样的问题),或者你可以从一本书中学习它,并为它编译你自己的代码(这是一个相当简单的编码算法)。
如果你想这样做,例如,如果是简单的多边形到多边形测试是迈向更复杂的三维形状的第一步(如由多边形的固体)真正的方法。那么,你应该很可能只是使用已经做到这一点的软件包。 Here是一组碰撞检测库,其中许多输出穿透深度或等效最小距离。
谢谢,这看起来像一个有趣的话题。我不会走向更复杂的形状,只是寻找3D面的简单距离对。 – Dmi 2011-02-25 03:28:47
您是否正在寻找他们的两个最接近的边缘之间的距离的质心之间的距离,还是? – 2011-02-25 00:00:43
两个最近的边缘。 – Dmi 2011-02-25 00:05:27
那么不是两个最近点之间的距离呢?你如何定义“最近边缘”,并给出一个合适的定义,你如何定义两个最近边缘之间的距离? – Troubadour 2011-02-25 00:20:13