算法从坐标确定矩形

时间:2010-11-06 19:52:42

标签: algorithm geometry drawing coordinates

我的用户输入包含一个绘制的矩形(自由泳)。现在这个绘制的图形并不完美,所以我想根据算法重绘它们的形状。

我有一堆来自用户绘图的坐标。我想找到最大的(x,y)和最低的(x,y)坐标,并使用它们之间的距离来确定矩形的对角线。

但我很难确定最大(x,y)坐标和最低(x,y)坐标。

我不能用最大的y取最大的y,或者用最大的y取最大的x,例如因为用户可能只是在他们的行中突然出现了。 (这有意义吗?)

假设下面是用户绘制的线..如果我使用最大的y和最大的x,我将没有所需的坐标(因为它会在意外突出中找到坐标)

                       ----
                      /    \
                 ----/      \--------                 -----        --
  --------------/                    \---------------/     \------/  \--

希望你明白我的目标......

我想另一种方法是我希望坐标最接近(0,0),如果我的画布是1000 x 1000,我希望第二个坐标最接近(1000,1000)。 (两个极端坐标)

任何人都可以帮助这个算法吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

根据您希望算法生成的矩形适合用户输入的程度,您可以尝试以下操作:

  1. 平均所有x和y坐标,为您提供矩形的中心,(Xc,Yc)。
  2. 找出最高和最低x值,从最高值中减去最低值并除以2。重复y值。让我们称这些X和Y(s代表'侧')。
  3. 重要角落(左上角和右下角)将成为(Xc - Xs,Yc - Ys)和(Xc + Xs,Yc + Ys)。
  4. 酌情画线。
  5. 现在,这将为您提供一个包含所有用户给定点的边界框。如果您正在寻找更多最佳拟合类型算法,请使用平均功能替换第二步中的(max - min)/ 2函数。一个简单的方法可能只涉及平均点到中心点的一侧(上/下或左/右),并使用这些点作为中心偏移。请注意,这将为您提供四个偏移,其中只有两个将在任何给定时间使用。

    这里提出的粗略想法可以根据您期望的用户输入类型进行调整(例如,您可能会有多么扭曲)。使用线性回归线可以进一步改进,假设您能够通过点本身或通过用户输入方法区分边(例如,使用离散动作绘制矩形的每一边而不是一次性绘制)。

    希望这个简单的例子能指出你正确的方向。

答案 1 :(得分:1)

如果你想找到最接近(0,0)的点,那就找吧!

point FindClosestToOrigin(point[] P)
{
  point closest = P[0];
  foreach(point p in P)
  {
      if (DistanceOriginS(p) < DistanceOriginS(closest)) closest = p;
  }
  return closest;
}
float DistanceOriginS(point p)
{
   return p.x*p.x + p.y*p.y;
}

您可以轻松修改算法,找到最接近屏幕边缘其余部分的点。

答案 2 :(得分:0)

只需对所有点做一个平均值并将其用作矩形边的位置..当然这假设您能够区分矩形的四边,否则您可以尝试将坐标分割为4边(通过检查水平和垂直变化与某个阈值),然后计算每一侧的平均值,并将其调整为链接边。