我找到算法来计算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
的算法答案 0 :(得分:1)
dP
是差异向量。但是你需要最近点的绝对坐标
我无法打开链接页面,但似乎sc
是第一行参数方程的参数,tc
是第二行的参数。在这种情况下
ClosestPointAtFirst = L1P0 + sc * u
ClosestPointAtSecond = L2P0 + tc * v
答案 1 :(得分:0)
我想我有办法。
算法 找到与两条线垂直的单位向量。你也知道距离。这将为您提供连接两个兴趣点的线段矢量。
将该向量作为线性变换应用于u
。这会为您提供一条新线u-prime
,它在法线向量的方向上移动一段您计算过的距离。 u-prime
将v
与两个点中的一个相交。找到该交点(最接近的v
上的点),减去连接向量,然后给出另一个点(在原始u
上)。
如果它有助于可视化,而不是u-prime
和v
定义垂直于法线向量的平面。