2012-11-22 101 views
3

我正在製作一個photomosaic應用程序,一個簡單的解決方案是通過位圖掃描將位圖分成小方塊並用小圖像替換每個小方塊。但爲了提高生成圖像的質量,我想從中心而不是從左上角掃描位圖。有沒有現有的算法來解決這個問題?從中心掃描數組

例如:

在傳統的方法中,我們掃描從左上2-d數組:

1 2 3 4 

5 6 7 8 

9 10 11 12 

13 14 15 16 

但我想從中心到掃描到的邊界,螺旋狀:

16 15 14 13 

5 4 3 12 

6 1 2 11 

7 8 9 10 
+0

應該是線性掃描序列?它應該是10,11,7,6,5,9,13,14,15,16,12,8,4,3,2,1? – Deep

回答

0
bool between(int x, int low, int high) { 
    return low <= x && x <= high; 
} 

// we use this constant array to help tweaking the (row,col) coordinate 
const int D[4][2] = { 
    {0, 1}, // 0 - right 
    {1, 0}, // 1 - down 
    {0, -1}, // 2 - left 
    {-1, 0} // 3 - up 
}; 

int a[n][n]; // suppose the array is n times n in size 
int row = 0, col = 0, dir = 0; // initial direction is "0 - right" 

for (int m = n*n; m >= 1; m--) { 
    a[row][col] = m; 

    int old_row = row, old_col = col; // remember current coordinate 

    row += D[dir][0]; 
    col += D[dir][1]; 

    if (!(between(row,0,n-1) && between(col,0,n-1))) { // have to move back 
    // move back 
    row = old_row; 
    col = old_col; 

    // change direction 
    dir++; 
    dir %= 4; 

    // move again 
    row += D[dir][0]; 
    col += D[dir][1]; 
    } 
} 
+0

非常感謝! –

+0

@ user1833006如果您覺得沒關係,請考慮點擊左邊的複選標記以接受此答案。謝謝。 :-) –

0

解決這個問題的一種可能性是考慮將螺旋向後拉。 (0,0)然後轉到(0,y)→(x,y)→(x,0)→(1,0)。剩下的是一個更小的矩形。只要剩餘的高度/寬度大於2,就可以這樣做。

現在您有一個矩形,其大小爲(x,2)或(2,y),它是開始繪製的中心矩形。爲了簡單起見,我假設你有一個大小爲(x,2)的矩形。你從左下角開始。向右畫x步,然後畫1。然後你增加你的寬度或高度的步驟。

現在的問題是,你如何得到大小爲(x,2)的第一個矩形?假設你有一張尺寸爲(w,h)的圖片,其中w > h那麼你的第一個矩形是(w-h + 2,2),開始的座標是(w/2-(w-h + 2)/ 2, H/2)。

示例:給定矩形w = 8,h = 4。中心矩形是w = 6,h = 2。你從位置(1,2)開始。

繪製將:右6,上1,左6,下2,右7,上3,左7,完成。

+0

非常感謝! –