数组移位/错误索引/i = [x+y*size+z*size*size]

Posted

技术标签:

【中文标题】数组移位/错误索引/i = [x+y*size+z*size*size]【英文标题】:Array Shifting / Wrong Index / i = [x+y*size+z*size*size] 【发布时间】:2016-08-16 16:09:06 【问题描述】:

我有一个简单的问题。如何在 3 维中移动线性阵列? 它似乎太有用了,但在 X 和 Y 轴上我遇到了索引问题。 我想这样做的原因很简单。我想创建一个带有块缓冲区的体积地形,所以我只需要在视口移动时重新计算边缘上的值。

我读过一篇关于这个系统的文章:

本质上,它们提供了一种滚动可能无限数据的方法 字段通过固定大小的多分辨率缓存。

所以我的生成部分的管道是:

    当视口移动时获取轴 移动轴 仅为新单元格生成一些噪声 对新单元格进行三角测量 更新所有单元格位置

这是我的其他图片: http://forum.unity3d.com/threads/array-shifting-wrong-index-i-x-y-size-z-size-size.425448/#post-2751774

统一论坛中没有人可以回答我的问题...

public int size;
public float speed;

private byte[] volume;
private byte[] shifted;

public bool widthShift, heightShift, depthShift;

private int widthOffset = 0;
private int heightOffset = 0;
private int depthOffset = 0;

private float time = 0;
private int cube;

void Start()

    volume = new byte[size * size * size];
    shifted = new byte[size * size * size];

    cube = size * size * size;

    for (int x = 0; x < size; x++)
        for (int y = 0; y < size; y++)
            for(int z = 0; z < size; z++)
                volume[x + y * size + z * size * size] = (x == 0 || y == 0 || z == 0) ? (byte)1 : (byte)0;


void Update()

    time += Time.fixedDeltaTime * speed;

    if (time > 1)
    
        time = 0;

        widthOffset = (widthOffset >= size) ? 0 : widthOffset;
        heightOffset = (heightOffset >= size) ? 0 : heightOffset;
        depthOffset = (depthOffset >= size) ? 0 : depthOffset;

        if (widthShift)
            widthOffset++;
        else
            widthOffset = 0;

        if (heightShift)
            heightOffset++;
        else
            heightOffset = 0;

        if (depthShift)
            depthOffset++;
        else
            depthOffset = 0;

        Shift(widthOffset, heightOffset, depthOffset);
    


void Shift(int xOff, int yOff, int zOff)

    for (int x = 0; x < size; x++)
        for (int y = 0; y < size; y++)
            for(int z = 0; z < size; z++)
            
                int i = ((x + xOff) + (y + yOff) * size + (z + zOff) * size * size);
                i = (i >= cube) ? (i - cube) : i;

                shifted[x + y * size + z * size * size] = volume[i];
            


void OnDrawGizmos()

    if(Application.isPlaying)
        for(int x = 0; x < size; x++)
            for(int y = 0; y < size; y++)
                for(int z = 0; z < size; z++)
                
                    Gizmos.color = (shifted[x + y * size + z * size * size] == 1) ? new Color32(0, 255, 0, 255) : new Color32(255, 0, 0, 4);
                    Gizmos.DrawWireCube(new Vector3(x + 0.5f, y + 0.5f, z + 0.5f), new Vector3(0.95f, 0.95f, 0.95f));
                

【问题讨论】:

我得说,对于一个新用户来说,这个问题的格式和问得非常好。不是我在审核队列时经常看到的。 :) 欢迎来到堆栈溢出! 【参考方案1】:

试一试:

void Shift(int xOff, int yOff, int zOff)

    for (int x = 0; x < size; x++)
        for (int y = 0; y < size; y++)
            for(int z = 0; z < size; z++)
            
                int nx = (x + xOff) % size;
                int ny = (y + yOff) % size;
                int nz = (z + zOff) % size;
                int i = (nx + ny * size + nz * size * size);

                shifted[x + y * size + z * size * size] = volume[i];
            

【讨论】:

以上是关于数组移位/错误索引/i = [x+y*size+z*size*size]的主要内容,如果未能解决你的问题,请参考以下文章

848. 字母移位

使用2索引从数组中提取最小值[关闭]

在字符串中的 Y 索引处查找 X 字符并使用此信息过滤数组

lingo中两个数组对应元素相加如何表示

数组去重复

学习python的日常3