1

単にインデックスである立方体の 8 つの頂点があります。正規化されたキューブ内の各頂点のそれぞれのポイントを取得したいと考えています。次の図では、+x が右、+y が上、+z が画面の外に出ていると想定しています。(見えにくい場合は、頂点 2、3、6、および 7 が前にあります)。

多角化

(エッジ インデックスは無視します)

ここに私が持っているものがあります:

for (int v = 0; v < 8; v++) {
    float x, y, z;

    if(v < 4)                                    y = -1;
    else                                         y = +1;
    if(v == 1 || v == 2 || v == 5 || v == 6)     x = +1;
    else                                         x = -1;
    if(v == 2 || v == 3 || v == 6 || v == 7)     z = +1;
    else                                         z = -1;
}

非常に多くの論理 OR を使用せずに、これを行うためのより論理的な方法はありますか?

4

2 に答える 2

1

ルックアップ テーブルを使用できます。LUT は非常に効率的である傾向がありますが、直観に反すると感じる人もいます。

for (int v = 0; v < 8; v++) {
    int[] lutX = new int[] {-1, -1, -1, -1, 1, 1, 1, 1};
    int[] lutY = new int[] {-1, -1, -1, -1, 1, 1, 1, 1};
    int[] lutZ = new int[] {-1, -1, 1, 1, -1, -1, 1, 1};
    float x = lutX[v];
    float y = lutY[v];
    float z = lutZ[v];
}

通常、関数の外で静的に宣言する必要があります。

次のようなロジックによって、OR ベースのロジックから LUT を推測できます。

If for v==0, the OR-logic adds 1 to X, set lutX[0] to 1.
Else set lutX[0] to -1
于 2014-01-17T03:34:22.667 に答える
0

このワンライナーはどうですか:

float x = 2*((v/2)%2)-1, y = 2*(v/4)-1, z = 2*(v%2)-1;

テストコード:

static void Main(string[] args)
{
    Debug.Print("{0,3} {1,3},{2,3},{3,3}", "v", "x", "y", "z");
    for(int v=0; v<8; v++)
    {
        float x=2*((v/2)%2)-1, y=2*(v/4)-1, z=2*(v%2)-1;

        Debug.Print("{0,3} {1,3},{2,3},{3,3}", v, x, y, z);
    }
}

結果:

v   x,  y,  z
0  -1, -1, -1
1  -1, -1,  1
2   1, -1, -1
3   1, -1,  1
4  -1,  1, -1
5  -1,  1,  1
6   1,  1, -1
7   1,  1,  1
于 2014-01-17T18:07:16.847 に答える