我正在寻找有效找到边缘点的方法,这是与其他点最接近的点。
假设我知道两个点是边的顶点。我可以计算穿过这些点的线的方程。
计算边缘上与点中其他点最近点的点的最佳方法是什么。
我会张贴图片,但我没有足够的声望点。
答案 0 :(得分:16)
假设线由两点(x1,y1),(x2,y2)定义,“其他点”是(a,b)。 你要找的点是(x,y)。
您可以轻松找到黑线的等式。要找到蓝线方程,请使用m1 * m2 = -1(m1和m2是两条线的斜率)的事实。
显然,你要找的是两条线之间的交叉点。
我所说的有两个例外:
以下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)
您需要考虑三个区域。 “垂直”方法适用于中间区域:
对于其他两个区域,距离是距离最近的区段端点的距离。
该段的等式是:
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中给出较小值的那个。