3

私はフォトモザイクアプリを作成しています。簡単な解決策は、ビットマップをスキャンしてビットマップを小さな正方形に分割し、それぞれを小さな画像に置き換えることです。しかし、結果の画像の品質を上げるために、左上からではなく中央からビットマップをスキャンしたいと思います。それを解決するための既存のアルゴリズムはありますか?

例えば:

従来の方法では、左上から2D配列をスキャンします。

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
4

2 に答える 2

0

これを解決する1つの可能性は、スパイラルを後方に描くことを考えることです。

ポイント(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、完了。

于 2012-11-22T10:32:20.447 に答える
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];
  }
}
于 2012-11-22T14:10:50.827 に答える