我有一个扁平的3D数组,表示我正在尝试优化的程序网格的顶点索引。我像这样创建数组:
int* vertIndices = new int[WIDTH * HEIGHT * DEPTH];
并添加到数组
vertIndices[x + WIDTH * (y + HEIGHT * z)] = vertIndex;
问题是我只需要跟踪网格的 surface 上的顶点。内部顶点不会被创建。
因此,我创造了许多永远不会被使用的浪费整数。
这是一个循环遍历网格的vertIndices数组的循环,WIDTH:7,HEIGHT:7和DEPTH:7
所有这些-1163005939值都是位于网格内部但不会被创建的顶点。
我的问题是如何改进公式
x + WIDTH * (y + HEIGHT * z)
忽略内部价值。
谢谢!
答案 0 :(得分:1)
我认为你不会在公式中引入某种条件。像这样:
int getIndex(int x, int y, int z) {
//First get the amount of points in all layers before this z layer.
int beforeZ = (z) ? WIDTH*HEIGHT + (z - 1)*2*(WIDTH + HEIGHT - 2) : 0;
//Then get the amount of points within this layer before this line.
int beforeY = (y) ? WIDTH + 2*(y - 1) : 0;
if(z == 0 || z == DEPTH - 1) beforeY = y*WIDTH;
//And finally the amount of points within this line before this point.
int beforeX = (x) ? 1 : 0;
if(z == 0 || z == DEPTH - 1 || y == 0 || y == HEIGHT - 1) beforeX = x;
//Return the amount of points before this one.
return beforeZ + beforeY + beforeX;
}
我承认这有点难看,但我认为它与你能得到的最好的相近。至少如果你不想创建某种与坐标匹配的查找表,反之亦然。当然,这样的查找表将是可以处理任何情况的真正大枪,其缺点是内存使用量非常大并且操作速度可能较慢。