我在3D中有两个凸多边形。它们在不同的平面上都是平的,因此它们是一对面。
计算这两个多边形之间最近距离的最简单方法是什么?
编辑:在第一个多边形中具有端点而在第二个多边形中具有另一个端点的最短可能线的长度。我正在寻找的距离是这条最短线的长度。
答案 0 :(得分:3)
嗯,只有几种可能性;两个多边形之间的最短线可以是:
通过将每个边+顶点对视为线段并枚举distance between all line-segment pairs来处理案例1-3。
对于案例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并查看交叉点是否在另一个多边形内 (请务必检查两个多边形)
在所有这些中找到最小距离,我们就完成了。
答案 1 :(得分:3)
这是一个简单的有界优化,具有线性约束和二次目标函数。可以使用许多算法,例如梯度下降。
答案 2 :(得分:2)
大多数人在这个帖子中提出的是“获取一个多边形的所有点/边缘并与另一个多边形的每个点/边缘进行比较”。如果您只是比较两个相当简单的多边形,并且如果您不太关心这样做,那么这可能会正常工作。
但是,如果你想要一个相当简单和更好的方法。使用Ben Voigt建议的二次优化方法(即Quadratic Programming)。基本上,您的多边形是您的线性约束集,即您的求解点必须位于多边形每条边的内侧(这是一个不等式约束)。而你的优化成本函数只是欧几里德距离,即标准公式中的Q只是单位矩阵。一旦被解决成这样的问题,你可以使用一个解决这个问题的库(那里有许多那些),或者你可以从一本书中学习它并为它编写你自己的代码(这是一个相当简单的编码算法) )。
如果你想要一个真正的方法来做到这一点,例如,如果这个简单的多边形到多边形测试是迈向更复杂的3D形状的第一步(就像一个由多边形组成的实体)。然后,您最有可能只使用已经这样做的包。 Here是一组碰撞检测库,其中许多输出穿透深度或等效的最小距离。
答案 3 :(得分:1)
目前还不清楚你的尝试。
This看起来很可能是片段。
那么你所要做的就是检查所有边对。在尝试优化之前,我希望先实现它。
在考虑从一个质心到另一个质心的向量时,可能有一个优化,只考虑在某个意义上的那个方向的边缘。
答案 4 :(得分:-3)
循环遍历第一个对象的所有顶点,然后在该循环中循环遍历第二个对象的所有顶点。在最里面的循环中,比较两个当前顶点之间的距离并存储最低距离。我一直这样做,只要你没有一个可笑的大网格,它几乎是瞬间完成的。