扁平3D阵列内部值

时间:2014-12-06 20:38:11

标签: c++ arrays

我有一个扁平的3D数组,表示我正在尝试优化的程序网格的顶点索引。我像这样创建数组:

int* vertIndices = new int[WIDTH * HEIGHT * DEPTH];

并添加到数组

vertIndices[x + WIDTH * (y + HEIGHT * z)] = vertIndex;

问题是我只需要跟踪网格的 surface 上的顶点。内部顶点不会被创建。

因此,我创造了许多永远不会被使用的浪费整数。

这是一个循环遍历网格的vertIndices数组的循环,WIDTH:7,HEIGHT:7和DEPTH:7

enter image description here

所有这些-1163005939值都是位于网格内部但不会被创建的顶点。

我的问题是如何改进公式

x + WIDTH * (y + HEIGHT * z)

忽略内部价值。

谢谢!

1 个答案:

答案 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;
}

我承认这有点难看,但我认为它与你能得到的最好的相近。至少如果你不想创建某种与坐标匹配的查找表,反之亦然。当然,这样的查找表将是可以处理任何情况的真正大枪,其缺点是内存使用量非常大并且操作速度可能较慢。