检查两个线段之间的最短3D距离,其中线代表同时轨迹

时间:2014-04-28 11:19:14

标签: python 3d distance lines shortest

我必须解决的问题如下。我在3D空间中有两个线段,并希望找到它们之间的最短距离(如果有的话)。

我已经看到有找到最近点的解决方案,但在这种情况下的警告是线条代表一个属性给出的两个对象的位置。即:两条线都有一个开头,代表空间中的两个物体。两行都有一个结尾,表示空间中相同的两个对象。一条线的中途直接与另一条线的中途相关。等等 目标是找到表示两个对象最近的属性值(如果有意义的话?)。

到目前为止,我一直在做的事情是以百分比的方式递增并检查距离。然后在找到最近点之后精炼搜索,依此类推。大量检查...最终结果通常是足够接近"当我决定停止检查时。

我想要的是一个简单的公式,如果存在一个可以有希望避免暴力强迫它,或一个方向来查找以找到所述公式。如果可能的话,更好的是python代码中的一个例子。

先谢谢你们! :)

编辑:

因为我无法回答8小时...... 我设法以谷歌的方式找到了这个解决方案。我不确定是否有更优雅的解决方案(我打赌有!:P),但它似乎有效。

def VectorMath(method,p1,p2=None): #perform math on vector
    new = []
    for i in range(3):
        try:
            new.append( method(p1[i],p2[i]) )
        except TypeError:
            new.append( method(p1[i],p2) )
    return new
def ClosestPoint(p1, p2): #get closest point between two lines
    dv = VectorMath(lambda x,y: y-x, p1['v'],p2['v'])
    dv2 = sum(p*q for p,q in zip(dv,dv))
    if dv2 < 0.00001: #tracks are parallel
        return 0.0
    orig = VectorMath(lambda x,y: x-y, p1['p'], p2['p'])
    return sum(p*q for p,q in zip(orig,dv)) / dv2
def Distance(p1, p2):
    return m.sqrt(sum(VectorMath(lambda x,y: (y-x)**2, p1,p2)))

a = {'p':[1.0,0.0,-2.0] } #just establishing a test case of points
a['v'] = VectorMath(lambda x,y:y-x,a['p'],[4.0,0.0,6.0])
b = {'p':[0.0,0.0,0.0] } #second line test case
b['v'] = VectorMath(lambda x,y:y-x,b['p'],[3.0,0.0,0.0])

point = ClosestPoint(a,b) #location on lines where two objects reach nearest location
a1 = VectorMath(lambda x,y: x+y, a['p'],VectorMath(lambda x,y: x*point, a['v'])) #points at closest location
b1 = VectorMath(lambda x,y: x+y, b['p'],VectorMath(lambda x,y: x*point, b['v']))
dist = Distance(a1,b1) #distance between points

0 个答案:

没有答案