簡體   English   中英

算法從坐標確定矩形

[英]algorithm to determine a rectangle from coordinates

我有用戶輸入,包含一個繪制的矩形(自由泳)。 現在這個繪制的圖形並不完美,所以我想基於算法重繪它們的形狀。

我有一堆來自用戶繪圖的坐標。 我想找到最大的(x,y)和最低(x,y)坐標,並使用它們之間的距離來確定矩形的對角線。

但是我很難確定最大(x,y)坐標和最低(x,y)坐標。

我不能用最大的x取最大的y,或者用最大的y取最大的x,例如因為用戶可能只是在他們的行中突然出現了。 (那有意義嗎?)

假設下面是用戶繪制的線..如果我使用最大的y和最大的x,我將沒有所需的坐標(因為它會在意外突出中找到坐標)

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

希望你能理解我的目標......

我想另一種方法是我希望坐標最接近(0,0),如果我的畫布是1000 x 1000,我希望第二個坐標最接近(1000,1000)。 (兩個極端坐標)

任何人都可以幫助這個算法嗎?

提前致謝!

根據您希望算法生成的矩形適合用戶輸入的程度,您可以嘗試以下操作:

  1. 平均所有x和y坐標,為您提供矩形的中心,(Xc,Yc)。
  2. 找到最高和最低x值,從最高值中減去最低值並除以2。 重復y值。 讓我們稱這些X和Y(s代表'側')。
  3. 然后重要的角(左上和右下)將變為(Xc-Xs,Yc-Ys)和(Xc + Xs,Yc + Ys)。
  4. 適當地畫線。

現在,這將為您提供一個包含所有用戶給定點的邊界框。 如果您正在尋找更多最佳擬合類型算法,請使用平均功能替換第二步中的(max - min)/ 2函數。 一個簡單的方法可能只涉及平均點到中心點的一側(上/下或左/右),並使用這些點作為中心偏移。 請注意,這將為您提供四個偏移,其中只有兩個將在任何給定時間使用。

這里提出的粗略想法可以根據您期望的用戶輸入類型進行調整(例如,您期望的扭曲程度如何)。 使用線性回歸線可以進一步改進,假設您能夠通過點本身或用戶輸入方法區分邊(例如,使用離散動作繪制矩形的每一邊而不是一次性繪制)。

希望這個簡單的例子能指出你正確的方向。

如果你想找到最接近(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;
}

您可以輕松修改算法以找到最接近屏幕邊緣其余部分的點。

只需對所有點做一個平均值並將其用作矩形邊的位置..當然這假設您能夠區分矩形的四邊,否則您可以嘗試將坐標分成4邊(通過檢查水平和垂直變化與一些閾值),然后計算每一側的平均值,並將其調整為鏈接邊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM