0

次の一連の数値を生成する方法を探しています (これは、北西ピクセルから始まり西ピクセルで終わる、ピクセルの 8 つの隣接ピクセルの相対座標です)。最初の数値は y 座標で、2 番目の数値は x 座標です。

 y,  x
 _____

 1, -1   // N-W
 1,  0   // N
 1,  1   // N-E
 0,  1   // E
-1,  1   // S-E
-1,  0   // S
-1, -1   // S-W
 0, -1   // W

座標を配列に入れるなど、これを達成するためのいくつかの醜い方法を思いつくことができますが、考えもしなかったクリーンで効率的な方法があるかどうか疑問に思っています。

編集:実装しようとしているアルゴリズムの設計方法により、ピクセルはその特定の順序(NWからW)で反復する必要があります。

4

2 に答える 2

1

別の読みやすい代替手段は、次のように辺を明示的に列挙することです。

int x = -1;
int y = 1;
for (int side = 0; side < 4; side++)
{
    for (int steps = 0; steps < 2; steps++)
    {
        // use coordinates here
        printf("%d, %d\n", y, x);

        if (side == 0) { x++; }
        else if (side == 1) { y--; }
        else if (side == 2) { x--; }
        else /* if side == 3) */ { y++; }
    }
}

/*
result:
1, -1
1, 0
1, 1
0, 1
-1, 1
-1, 0
-1, -1
0, -1
*/

これには、開始コーナーと側面に沿ったステップ数を変更することで、任意のサイズの近隣を横断できるという追加の利点があります。

@louism:「座標を配列に入れるなど、これを達成するためのいくつかの醜い方法を思いつくことができます」-実際には、それが最善の方法だと思います。これは明確で読みやすく(上記の@oseで説明したモジュラス算術法とは異なり)、おそらく最速です。

@louism:3つの異なる方法(配列ルックアップ、サイドの列挙、モジュラス演算)のベンチマークを行い、結果を投稿できますか?これは私が今書いているコードで使用するものなので、私はかなり興味があります。

于 2012-11-24T05:04:49.130 に答える