且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

3D 数组(1D 平面)索引

更新时间:2023-02-26 14:57:34

这取决于您希望如何在一维数组中对 3D 数据进行排序,如果您想按顺序排列索引:Z、Y、X,那么您的 2x2x2 尺寸的 3D 数据将像这样存储:

This depends on that how you want to order your 3D data in 1D array, if you wanted to have indexes in order: Z, Y, X then your 2x2x2 dimensioned 3D data will be stored like this:

index 0: [z=0,y=0,x=0]
index 1: [z=0,y=0,x=1]
index 2: [z=0,y=1,x=0]
index 3: [z=0,y=1,x=1]
index 4: [z=1,y=0,x=0]
index 5: [z=1,y=0,x=1]
index 6: [z=1,y=1,x=0]
index 7: [z=1,y=1,x=1]

DEPTH 维度对应z,HEIGHT 对应y,WIDTH 对应x

DEPTH dimension corresponds to z, HEIGHT to y and WIDTH to x

索引计算为:index = HEIGHT*WIDTH*z + WIDTH*y + x.

x 没有乘以任何东西,因为下一个 x 索引紧跟在前一个索引之后.

The x is not multiplied by anything because the next x index is right after the previous one.

如果要跳过 Y 行,则必须添加整行 WIDTH,在本例中为 2,例如,如果您位于索引 1,其中 z=0,y=0 和 x=1,然后添加WIDTH=2 索引,你会得到索引 3.只有 y 维度增加了 1.

If you want to skip one Y row, you have to add whole row WIDTH, in this case 2, for example if you are at index 1, which has z=0,y=0 and x=1 and you add WIDTH=2 to index, you'll get index 3. Only y dimension has increased by 1.

要从 z=0 移动到 z=1,您必须跳过 4 个索引(查看索引列表),数字是 HEIGHT*WIDTH(在本例中为 2*2).

To move from z=0 to z=1, you have to skip 4 indexes (look up at the index listing), the number is HEIGHT*WIDTH (in this example 2*2).

性能

为了提高处理速度,***使用 z、y、x 坐标按顺序递增的方式处理 3D 数据,这样您就不必经常重新计算索引.例如:

To gain speed its best to process your 3D data with z,y,x coordinates incrementing in a sequence so you don't have to recalculate the index so often. For example:

int z = 1, y=1, x=0;
int index = HEIGHT*WIDTH*z + WIDTH*y;
int data;

for(x=0;x<WIDTH;x++)
{
    Object obj = oneDArray[index+x];
}

在理想情况下,所有数据处理都是相互独立的,您甚至不必计算索引,只需在整个 oneDArray 中增加一个索引即可.可以预先计算的内容取决于您的使用情况.

In ideal case, all processing of data is independent from each other and you don't have to even calculate the index, just increment one index trough whole oneDArray. What's possible to precompute depends on your usage.