我正在寻找有效地找到边缘上的点的方法,该点是与其他点最接近的点.
假设我知道两个点是边的顶点.我可以计算穿过这些点的线的方程.
计算边缘上的点的最佳方法是什么,该点是平面中某个其他点的最近点.
我会发布一张图片,但我没有足够的声望点.
sna*_*ile 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)
Run Code Online (Sandbox Code Playgroud)
您需要考虑三个区域."垂直"方法适用于中间区域:

对于其他两个区域,距离是到最近的区段端点的距离.
该细分的等式是:
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!