我正在寻找一种有效的方法来找到一条边上距离某个点最近的点。
假设我知道两个点,它们是边的顶点。 我可以计算通过这些点的直线方程。
什么是计算平面上距离某个点最近的边上点的最佳方法。
我想发布一张图片,但我没有足够的声望点数。
假设直线由两个点(x1,y1),(x2,y2)定义,且“其他点”为(a,b)。你要寻找的点是(x,y)。
您可以轻松地找到黑线的方程式。要找到蓝线方程,请使用m1 * m2 = -1这个条件(其中m1和m2是两条线的斜率)。
显然,您要寻找的点是两条线之间的交点。
我所说的有两个例外:
以下Python函数查找该点(如果您不了解Python,请将其视为伪代码):
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)
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 < g[x0],则您的点位于上图中的黄色区域,最近的点是B。
3)否则,您位于“垂直天蓝色区域”,任何其他答案都可以告诉您如何计算最近的点和距离(我不会剽窃 :))
希望对您有所帮助!
为了节省打字时间,我们继续使用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)
我可以用几何术语描述您想要做的事情,但手头没有算法。这样有帮助吗?
无论如何,您想要绘制一条包含杂点并垂直于边缘的线。如果有帮助的话,我认为斜率是垂直线之间的负倒数关系。
然后您需要找到两条线的交点。