如何找到与另一个点最近点的边上的点

ima*_*age 7 algorithm math

我正在寻找有效地找到边缘上的点的方法,该点是与其他点最接近的点.

假设我知道两个点是边的顶点.我可以计算穿过这些点的线的方程.

计算边缘上的点的最佳方法是什么,该点是平面中某个其他点的最近点.

我会发布一张图片,但我没有足够的声望点.

sna*_*ile 16

假设该线由两个点(x1,y1),(x2,y2)定义,而"另一个点"是(a,b).你要找的点是(x,y).

在此输入图像描述

您可以轻松找到黑线的等式.要找到蓝线方程,请使用m1*m2 = -1(m1和m2是两条线的斜率)的事实.

显然,您要寻找的是两条线之间的交叉点.

在此输入图像描述

我所说的有两个例外:

  1. 如果x1 = x2则(x,y)=(x1,b).
  2. 如果y1 = y2则(x,y)=(a,y1).

以下Python函数找到了重点(如果您不知道Python只是将其视为psudo代码):

def get_closest_point( x1,y1, x2,y2, a,b ):
    if x1==x2: return (x1,b)
    if y1==y2: return (a,y1)
    m1 = (y2-y1)/(x2-x1)
    m2 = -1/m1
    x = (m1*x1-m2*a+b-y1) / (m1-m2)
    y = m2*(x-a)+b
    return (x,y)
Run Code Online (Sandbox Code Playgroud)


Dr.*_*ius 6

您需要考虑三个区域."垂直"方法适用于中间区域:

在此输入图像描述

对于其他两个区域,距离是到最近的区段端点的距离.

该细分的等式是:

y[x] = m x + b
Run Code Online (Sandbox Code Playgroud)

哪里

  m -> -((Ay - By)/(-Ax + By)), 
  b -> -((-Ax By + Ay By)/(Ax - By))  
Run Code Online (Sandbox Code Playgroud)

并且垂线的斜率为-1/m

垂直通过A的方程是:

  y[x] = (-Ax + By)/(Ay - By) x + (Ax^2 + Ay^2 - Ax By - Ay By)/(Ay - By)
Run Code Online (Sandbox Code Playgroud)

通过B的垂直通过在上面的等式中交换A和B是相同的.

所以你可以知道你的点在哪个区域引入上述方程中的x坐标,然后将点的y坐标与y [x]的结果进行比较

编辑

如何找到您的观点在哪个区域?

我们假设Ax≤Bx(如果是另一种方式,只需更改以下公式中的点标签)

我们会给你的观点{x0,y0}

1)计算

 f[x0] =  (-Ax + By)/(Ay - By) x0 + (Ax^2 + Ay^2 - Ax By - Ay By)/(Ay - By)
Run Code Online (Sandbox Code Playgroud)

并与y0进行比较.

如果y0> f [x0],那么你的点位于上图中的绿色区域,最近的点是A.

2)否则,计算

g[x0] =  (-Bx + Ay)/(By - Ay) x0 + (Bx^2 + By^2 - Bx Ay - By Ay)/(By - Ay)  
Run Code Online (Sandbox Code Playgroud)

并与y0进行比较.

如果y0 <g [x0],那么你的点位于上图中的黄色区域,最近的点是B.

3)否则,你处于"垂直浅蓝色区域",任何其他答案告诉你如何计算最近的点和距离(我不会剽窃:))

HTH!