gpt4 book ai didi

python - 在没有for循环的情况下计算Python中点数组到线段之间的欧几里德距离

转载 作者:行者123 更新时间:2023-12-03 16:04:04 26 4
gpt4 key购买 nike

我正在寻找一个函数来计算具有两个坐标 (x, y) 和线段的 numpy 点数组之间的欧几里得距离。我的目标是在 0.01 秒内获得线段和 10k 点的结果。

我已经找到了一个单点函数。但是运行 for 循环非常低效。

我还发现了这个计算到无限线距离的函数:

def line_dists(points, start, end):
if np.all(start == end):
return np.linalg.norm(points - start, axis=1)

vec = end - start
cross = np.cross(vec, start - points)
return np.divide(abs(cross), np.linalg.norm(vec))

它非常有效,我想对有界线采用类似的方法。

感谢您的帮助。

最佳答案

设置 – 测试点 P , 端点 AB :
enter image description here

  • P - A 的点积与 normalize(A - B)获取签名 平行距离分量s来自 A .同样与 Bt .
  • 取这两个数字中的最大值和零以获得夹紧的平行距离分量。如果该点位于线段的“边界”(Voronoi 区域?)之外,则这只会是非零值。
  • 使用叉积,像以前一样计算垂直距离分量。
  • 使用毕达哥拉斯计算所需的最近距离(从 PA 的灰线)。

  • 以上是无分支的,因此很容易用 numpy 向量化:
    def lineseg_dists(p, a, b):

    # TODO for you: consider implementing @Eskapp's suggestions
    if np.all(a == b):
    return np.linalg.norm(p - a, axis=1)

    # normalized tangent vector
    d = np.divide(b - a, np.linalg.norm(b - a))

    # signed parallel distance components
    s = np.dot(a - p, d)
    t = np.dot(p - b, d)

    # clamped parallel distance
    h = np.maximum.reduce([s, t, np.zeros(len(p))])

    # perpendicular distance component, as before
    # note that for the 3D case these will be vectors
    c = np.cross(p - a, d)

    # use hypot for Pythagoras to improve accuracy
    return np.hypot(h, c)

    关于python - 在没有for循环的情况下计算Python中点数组到线段之间的欧几里德距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54442057/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com