2010-11-06 103 views
4

我有用戶輸入,包括一個繪製的矩形(自由式)。現在這個繪製的圖形並不完美,所以我想根據算法重新繪製它們的形狀。算法從座標確定矩形

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

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

我不能用最大的x來代表最大的y,或者代表最大的y代表最大的y,因爲也許用戶只是在他們的線上做出了意外突出。 (這是有道理的嗎?)

假裝下面是一個用戶畫的線..如果我用最大的x與最大的x,我不會有所需的座標(因爲它會發現意外突出的座標)

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

希望你明白我在得到..

我猜把它就是我想的另一種方式的座標最接近(0,0),如果我的畫布是1000 ×1000,我希望第二個座標最接近(1000,1000)。 (兩個極座標)

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

在此先感謝!

+0

矩形是否平行於X和Y軸?或者矩形可以在2D空間轉動? – 2010-11-06 19:58:46

+0

你知道用戶是否從矩形的一個角落開始並首先繪製一側?我正在考慮通過在每個邊緣上劃一條線來得到矩形。必須有一個搜索算法來決定哪些點屬於哪個邊緣。許多可能性在那裏.. hmm – ja72 2010-11-06 20:00:34

+0

@Julian - 沒有矩形可以以任何方式相對於軸旋轉。 – developer 2010-11-06 20:02:31

回答

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

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

+0

啊..我從來沒有想過這個!我覺得我好笨。但它不應該是sqr(p.x^2 + p.y^2)? (即你計算的平方根) – developer 2010-11-06 20:19:54

+0

你是正確的,那是距離平方,但你不需要實際的距離來找到最小的。 – DennyRolling 2010-11-06 20:25:43

+0

@Julian - 請記住,矩形可以旋轉,用戶可以添加「噪音」,但不能保證最接近0,0的點是角落! – 2010-11-06 20:55:10

0

只需在所有點上做一個平均值,並將其用作矩形邊的位置..當然,這裏假定您能夠區分矩形的四條邊,否則您可以嘗試將座標分割爲四條邊(通過檢查具有某個閾值的水平和垂直變化),然後計算每邊的平均值並調整它以鏈接邊。

+0

不,我無法精減四邊形只畫一個動作(一條線用於繪製形狀) – developer 2010-11-06 20:07:26

2

根據你想如何做好算法生成的矩形,以適應用戶的輸入,你可以嘗試以下操作:

  1. 平均所有的X和Y座標來給你矩形的中心,(XC ,Yc)。
  2. 找到你的最高和最低x值,從最高值減去最低值併除以二。重複y值。讓我們稱這些X和Y(s爲'side')。
  3. 重要的角落(左上角和右下角)將變成(Xc-Xs,Yc-Ys)和(Xc + Xs,Yc + Ys)。
  4. 根據需要畫線。

現在,這將給你一個包含所有用戶給定點的邊界框。如果您正在尋找更多的最佳擬合算法,請使用平均功能替換第二步中的(最大 - 最小)/ 2功能。一個簡單的方法可能涉及只將點指向中心點的一側(上/下或左/右),並將它們用作中心的偏移。請注意,這會給你四個偏移量,其中只有兩個偏移量會在任何給定時間使用。

這裏提出的粗略想法可以根據您期望的用戶輸入類型(例如您期望的扭曲程度)進行調整。假設您能夠通過點本身或用戶輸入方法(例如,用矩形繪製矩形的每一面而不是一次繪製所有矩形)來進一步改進,可以使用線性迴歸線進行進一步改進。

希望這個快速示例將指出你在正確的方向。