将顶点0-7映射到3D点?

时间:2014-01-17 03:28:35

标签: c# sorting vector vertices

我有一个多维数据集的8个顶点,它们只是索引。我想得到每个顶点在标准化立方体中的相应位置。在下图中,假设+ x在右侧,+ y在向上,+ z从屏幕出来。 (如果很难看到,顶点2,3,6和7位于前面)。

Polygonise

(忽略边缘索引)

这就是我所拥有的:

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?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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