我有每一行的起点和终点。每条线只能是垂直或水平的。
示例:
Lines = [
((1, 1), (1, 7)), // (start, end)
((1, 1), (7, 1)),
((4, 1), (4, 7))
]
Point = (6, 6)
NearestPointOnLine = (4, 6) // magic here
如何计算任何点的线上最近点?
答案 0 :(得分:3)
这是一种方式。它不关心行的开始和结束,但你可以添加它以适应。应该让你开始。
注意(line.x
和line.y
是line
上的任何一点,开头或结尾)
var closestLine;
var closestDistance = maxvalue;
foreach line
{
var distance = line.isHorizontal? line.x - point.x : line.y - point.y;
distance = Math.Abs(distance);
if (distance<closestDistance)
{
closestDistance = distance;
closestLine = line;
}
}
var snapX = closestLine.isHorizontal ? point.x : closestLine.x;
var snapY = closestLine.isHorizontal ? closestLine.y : point.y;
答案 1 :(得分:1)
你只需要考虑几种情况(我将展示如何对垂直线进行处理,对于水平线则几乎相同):
1)假设((x,y1);(x,y2))是线,(xp,yp)是点。
2)如果y1 <= yp&lt; = y2,则答案是(x,yp)。如果yp&lt; y1,它是(x,y1)。否则,最近的点是(x,y2)。
要查找所有线条的最近点,可以将此算法应用于所有线条并选择最接近的线条。
答案 2 :(得分:1)
从段到段迭代,对于每个段,找到从该段到点(a,b)的最近点
有三种情况:
水平线(x1,y)到(x2,y)和点(a,b)有x1 <= a&lt; = x2,所以最近点是(a,y)
垂直线(x,y1)到(x,y2)和点(a,b)具有y1 <= b <= y2,所以最近点是(x,b)
上述两种情况都不是,在这种情况下,最近点是细分的开始或结束点。您可以通过计算从(a,b)到开始和结束的距离来轻松确定。
获得所有观点后,只需返回与其他点相比距离最短的点。计算从点(a,b)到点(c,d)的距离的公式:
int x = a - c;
int y = b - d;
double dist = sqrt(x*x + y*y);