【问题标题】:nearest distance between a point and line segment点到线段的最近距离
【发布时间】:2021-11-05 02:28:09
【问题描述】:

给定一条坐标为'start'和'end'的线以及点'pnt'的坐标,找出从pnt到线的最短距离。我试过下面的代码。

    import math

def dot(v,w):
    x,y,z = v
    X,Y,Z = w
    return x*X + y*Y + z*Z

def length(v):
    x,y,z = v
    return math.sqrt(x*x + y*y + z*z)

def vector(b,e):
    x,y,z = b
    X,Y,Z = e
    return (X-x, Y-y, Z-z)

def unit(v):
    x,y,z = v
    mag = length(v)
    return (x/mag, y/mag, z/mag)

def distance(p0,p1):
    return length(vector(p0,p1))

def scale(v,sc):
    x,y,z = v
    return (x * sc, y * sc, z * sc)

def add(v,w):
    x,y,z = v
    X,Y,Z = w
    return (x+X, y+Y, z+Z)




def pnt2line(pnt, start, end):
    line_vec = vector(start, end)
    pnt_vec = vector(start, pnt)
    line_len = length(line_vec)
    line_unitvec = unit(line_vec)
    pnt_vec_scaled = scale(pnt_vec, 1.0/line_len)
    t = dot(line_unitvec, pnt_vec_scaled)    
    if t < 0.0:
        t = 0.0
    elif t > 1.0:
        t = 1.0
    nearest = scale(line_vec, t)
    dist = distance(nearest, pnt_vec)
    nearest = add(nearest, start)
    return (dist, nearest)

【问题讨论】:

  • 如果您可以提供一些示例输入/输出和您的尝试,可能会更有帮助。
  • 什么是“点”? x,y? x,y,z?
  • 它是一个二维空间,(x,y)
  • 你能说明这段代码在二维空间中是如何工作的吗?
  • “我已经尝试了下面的代码。”:我们为你感到高兴,但你的问题是什么?

标签: python math geometry coordinates


【解决方案1】:

分辨率可以用图来解释,图中显示了点在距线段给定距离处的轨迹。它由两个半圆和两条线段组成,在端点处被两条垂线分开。

我们可以通过确保片段处于规范位置来简化讨论,端点为 (0, 0) 和 (L, 0)。对于任何段,我们都可以应用相似变换将其置于规范位置(见下文),并相应地移动目标点。

现在距离的计算量为

    X < 0 -> √[X² + Y²]
0 ≤ X ≤ L -> |Y|
L < X     -> √[(X-L)² + Y²]

  • 从所有点中减去一个端点的坐标,使线段回到原点。
  • 计算长度L
  • 将向量归一化到第二个端点,得到单位向量,设U
  • X' = Ux.X + Uy.YY' = Ux.Y - Uy.X变换目标点。

技术说明:

几何分析证明,输出函数是分段二次函数的平方根,需要一到两次比较才能知道活动块,这是无法避免的。如果我是对的,代数表达式就不能简化很多了。

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 2020-01-26
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2021-12-06
    • 2023-03-11
    • 2018-01-17
    • 2015-01-25
    相关资源
    最近更新 更多