Python 直线上两个最近点的位置

Python 直线上两个最近点的位置,python,geometry,line,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([

我已经找到了在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.073455669 4.9843092 0.26107353

我找到的算法

我想我有办法

该算法确实找到了垂直于两条直线的单位向量。你也知道距离。这将为您提供连接两个关注点的线段向量

将该向量作为线性变换应用于u。这将为您提供一条新线,u-prime,它在法向量的方向上移动您计算的距离。u-prime将在两点之一处与v相交。找到最接近的v点的交点,减去连接向量,得到原始u上的另一点

如果它有助于可视化,那么u素数和v不能定义一个垂直于法向量的平面。

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

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

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

欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。我不明白这不是个问题。你从这个算法中得到了什么?你是怎么在网上找不到解决办法的?这是一个已知已解决的问题。添加示例参数和结果是否会使其成为MCVE?如果是这样的话,我可以改变它,如果它使它对StackOverflow社区更有用的话。即使是已知已解决的问题,我也无法通过互联网找到足够的解决方案。我有多大理由解释我是如何没有找到东西的?示例论点、结果和您对试图找到要点的分析会有很大帮助。此外,您还可以包含一个指向您实现的算法的链接。我已经将直接lint包含到该算法中。它就在代码下面。@Ajean:不,OP有最短距离的算法。此算法无法在最近的接近处找到点。
ClosestPointAtFirst = L1P0 + sc * u
ClosestPointAtSecond = L2P0 + tc * v