2017-06-06 90 views
0

我找到了算法来计算3D中两条线之间的最短距离,并用Python重写它。但是我也想增加它不仅可以返回距离,而且还可以返回位置最近的点。线上两个最近点的位置

def line2line(-0.073455669 4.9843092 0.26107353 0.0 0.0 -1.0 -3.85838175 12.1999998 -4.50372314 0.405142069 -0.76723671 0.497199893): 
    epsilon = 0.00000001 
    L1P0 = np.array([xbeam,ybeam,zbeam]) #position of P0 on first line 
    L2P0= np.array([xout,yout,zout]) #position of P0 on first line 
    L1P1 = np.array([xbeam + ubeam ,ybeam + vbeam ,zbeam + wbeam]) #ubeam,vbeam and wbeam are direction cosines 
    L2P1 = np.array([xout + cx,yout + cy,zout + cz]) #cx,cy,cz are direction cosines 
    u = L1P1 - L1P0 
    v = L2P1 - L2P0 
    w = L1P0 - L2P0 
    a = np.dot(u,u) 
    b = np.dot(u,v) 
    c = np.dot(v,v) 
    d = np.dot(u,w) 
    e = np.dot(v,w) 
    D = a*c - b*b 
    if D < epsilon: 
     sc = 0.0 
     tc = d/b if b>c else e/c 
    else: 
     sc = (b*e - c*d)/D 
     tc = (a*e - b*d)/D 
    dP = w + (sc * u) - (tc * v) 
    return np.linalg.norm(dP) 

它返回围绕0.049这是正确的,但是当我试图打印 W +(SC * U)或 (TC * V)我在想什么是位置,它印了我:

0.  , 0.  , -19.82274615 
3.8142822 , -7.22328672, 4.68097699 

这不是我要找的这些点之一correct.Coordinates是:

-0.073455669 4.9843092 0.26107353 

算法我发现here

+0

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在发布您的MCVE代码并准确描述问题之前,我们无法为您提供有效的帮助。 我们应该能够将发布的代码粘贴到文本文件中,并重现您描述的问题。 “我无法弄清楚”不是一个问题规范。你从这个算法得到什么?你是如何在网上找到解决方案的?这是一个已知的问题。 – Prune

+0

添加示例参数和结果是否会使其变为MCVE?如果是这样,我可以改变它,如果它使它更有用的StackOverflow社区。 即使这是已知的解决问题,我无法找到足够的解决方案,使用internet.How excatly我supsu解释我怎么没有找到什么? – wiedzminYo

+0

取样参数,结果和* try *分析可以帮助你很多。另外,你可能会包含一个到你实现的算法的链接。 – Prune

回答

1

dP是差异向量。但是您需要最近点的绝对坐标

我无法打开链接页面,但似乎sc是第一行参数方程的参数,tc是第二行的参数。在这种情况下,

ClosestPointAtFirst = L1P0 + sc * u 
ClosestPointAtSecond = L2P0 + tc * v 
0

我想我有办法。

算法确实找到单位向量与两条线都正常。你也知道距离。这给出了连接两个兴趣点的线段的向量。

将该向量作为线性转换应用于u。这会为您提供一条新线,即u-prime,它沿法向矢量的方向移动您计算的距离。 u-prime将与v相交于两点之一。找到该交点(这是最接近方法的v上的点),减去连接向量,并给出您的其他点(在原始u上)。

如果它有助于形象化,而不是u-primev定义了一个垂直于法向量的平面。