2017-06-06 87 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定義了一個垂直於法向量的平面。