通过最短距离将点移动到矩形

时间:2016-02-25 05:54:02

标签: algorithm

给定一个由4个点定义的矩形,有一个算法可以移动一个点,使其位于矩形内部,使其移动最短距离。

我应该澄清目标矩形有任意旋转。我也不太关心翻译向量我只是想知道任意矩形中哪个点最接近所述点

1 个答案:

答案 0 :(得分:0)

将点移动到矩形的最短距离会将点移动到其中一个角或其中一个边(假设该点已经在矩形内部,您可以像边界框一样进行测试)。所以你想要做的是找到从点到代表边的每个段的距离。这是一个点段距离,有很多地方可以在线查找示例。

这里是一个干净的例子,只返回距离,但我突出了三个几何情况1.最近的第一个点在第2段。最接近第二个点在第3段。最近的一侧。

float dist_Point_to_Segment( Point P, Segment S)
{
   Vector v = S.P1 - S.P0;
   Vector w = P - S.P0;

   double c1 = dot(w,v);  // Point is closest to first point on segment
   if ( c1 <= 0 )
      return distance(P, S.P0);

   double c2 = dot(v,v);  // Point is closest to second point on segment
   if ( c2 <= c1 )
      return distance(P, S.P1);

   double b = c1 / c2;    // Point is closest to a side 
   Point Pb = S.P0 + b * v;
   return distance(P, Pb);
}

所以你只需要为矩形的四个边中的每一边做上述操作。您将要确定哪个案例(1,2或3)为您提供了最接近的点。这将为您提供矩形的平移向量。

我应该提一下,如果您想加快实施速度,可以进行优化。例如,如果测试两个相邻边并且发现两个边的最近点都是相同的顶点,则可以停在那里,因为它必须是矩形上与该点最近的点。