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

时间:2011-03-05 15:07:14

标签: algorithm math

我正在寻找有效找到边缘点的方法,这是与其他点最接近的点。

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

计算边缘上与点中其他点最近点的点的最佳方法是什么。

我会张贴图片,但我没有足够的声望点。

4 个答案:

答案 0 :(得分:16)

假设线由两点(x1,y1),(x2,y2)定义,“其他点”是(a,b)。 你要找的点是(x,y)。

enter image description here

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

显然,你要找的是两条线之间的交叉点。

enter image description here

我所说的有两个例外:

  1. 如果x1 = x2则(x,y)=(x1,b)。
  2. 如果y1 = y2则(x,y)=(a,y1)。
  3. 以下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)
    

答案 1 :(得分:6)

您需要考虑三个区域。 “垂直”方法适用于中间区域:

enter image description here

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

该段的等式是:

y[x] = m x + b

其中

  m -> -((Ay - By)/(-Ax + By)), 
  b -> -((-Ax By + Ay By)/(Ax - By))  

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

垂直通过A的方程是:

  y[x] = (-Ax + By)/(Ay - By) x + (Ax^2 + Ay^2 - Ax By - Ay By)/(Ay - By)

通过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)

并与y0进行比较。

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

2)否则,计算

g[x0] =  (-Bx + Ay)/(By - Ay) x0 + (Bx^2 + By^2 - Bx Ay - By Ay)/(By - Ay)  

并与y0进行比较。

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

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

HTH!

答案 2 :(得分:0)

我可以用几何术语描述你想要做什么,但我手头没有算法。这会有帮助吗?

无论如何,您想绘制一条包含杂散点并垂直于边缘的直线。我认为斜率是垂直线之间的负反比关系,如果这有帮助的话。

然后你想找到两条线的交点。

答案 3 :(得分:0)

让我们坚持2D案例以节省打字。已经有一段时间了,所以请原谅我的代数中的任何基本错误。

形成两点(x1,y1),(x2,y2)之间边缘的线表示为函数

y = mx + b

(你可以自己弄清楚m和b,但这是基本的)

你想要做的是尽量减少从你的点(p1,p2)到这一点上的点的距离,即

(p1-x)^2 + (p2-y)^2     (equation I)

受等式

的影响
y = mx + b              (equation II)

将等式II代入等式I并求解x。你会得到两个解决方案;选择在等式I中给出较小值的那个。