捕捉指向最近的线

时间:2014-06-23 08:05:18

标签: algorithm 2d point lines

我有每一行的起点和终点。每条线只能是垂直或水平的。

示例:

enter image description here

Lines = [
  ((1, 1), (1, 7)), // (start, end)
  ((1, 1), (7, 1)),
  ((4, 1), (4, 7))
]

Point = (6, 6)

NearestPointOnLine = (4, 6) // magic here

如何计算任何点的线上最近点?

3 个答案:

答案 0 :(得分:3)

这是一种方式。它不关心行的开始和结束,但你可以添加它以适应。应该让你开始。

注意(line.xline.yline上的任何一点,开头或结尾)

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);