我有一个多维数据集的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?
答案 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