线上两个最近点的位置

时间:2017-06-06 17:53:30

标签: python geometry line

我找到算法来计算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 

这不正确。我正在寻找其中一个点的坐标是:

-0.073455669 4.9843092 0.26107353

我找到here

的算法

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我想我有办法。

算法 找到与两条线垂直的单位向量。你也知道距离。这将为您提供连接两个兴趣点的线段矢量。

将该向量作为线性变换应用于u。这会为您提供一条新线u-prime,它在法线向量的方向上移动一段您计算过的距离。 u-primev与两个点中的一个相交。找到该交点(最接近的v上的点),减去连接向量,然后给出另一个点(在原始u上)。

如果它有助于可视化,而不是u-primev定义垂直于法线向量的平面。