繁体   English   中英

多维数组到一维索引数学

[英]Multi-Dimensional Array to Single-Dimensional Index Math

由于我们无法序列化多维数组(在Unity中),我们仅限于将一维数组与数学一起用于将x,y对转换为索引并返回。 以下是当前的转换算法:

int Width = 3; // Number of cells along the x axis
int Height = 3; // Number of cells along the y axis

GameObject[] Cells = new GameObject[ Width * Height ]; 

public int CalculateIndex( int x, int y )
{
    return y * Width + x;
}

public void CalculateXY(int i, out x, out y)
{
    x = i % Width;
    y = i / Width;
}

现在,我有一个问题,我需要创建一个引入深度和z轴的3维网格,但是我不知道如何将更改注入上述方法中……我有一个想法。

我发现这篇文章解释了其中的一些内容:

如何在1D数组中“拉平”或“索引” 3D数组?

但是,我的数组不是按HEIGHT,WIDTH,DEPTH(y,x,z)顺序排列,而是按WIDTH,HEIGHT,DEPTH(x,y,z)顺序排列。 此外,我需要将其从索引转换回x,y,z值的算法。

谢谢-杰夫

编辑:请检查pijemcolu共享的链接,那里有很好的解释。

~~

我正在使用JS代码,因此您/其他人可以在下面直接对其进行测试。

您正在寻找的主要功能是:

function CalculateIndex(x, y, z)
{
    return (x * HEIGHT * DEPTH) + (y * DEPTH) + z;
}

function CalculateXYZ(i)
{
  var ret = {};
  ret.x = Math.floor(i / (DEPTH * HEIGHT));
  ret.y = Math.floor(i / DEPTH) % HEIGHT;
  ret.z = i % DEPTH;

  return ret;
}

注意:您不需要使用floor因为您在C#中使用int数据类型。

 $(function(){ $('#process').click(function(){ var WIDTH = +$('#w').val(); var HEIGHT = +$('#h').val(); var DEPTH = +$('#d').val(); var _x = +$('#X').val(); var _y = +$('#Y').val(); var _z = +$('#Z').val(); if(_x >= WIDTH || _y >= HEIGHT || _z >= DEPTH) { $('#output').text('Invalid input'); return; } function CalculateIndex(x, y, z) { return (x * HEIGHT * DEPTH) + (y * DEPTH) + z; } function CalculateXYZ(i) { var ret = {}; ret.x = Math.floor(i / (DEPTH * HEIGHT)); ret.y = Math.floor(i / DEPTH) % HEIGHT; ret.z = i % DEPTH; return ret; } var ind = CalculateIndex(_x, _y, _z); var retXYZ = CalculateXYZ(ind); $('#output').html('Calculated index is: ' + ind + '<br/>' + 'Calulated XYZ are: ' + JSON.stringify(retXYZ)); }); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p>Width: <input id='w' type='number' value='4' min=0></p> <p>Height: <input id='h' type='number' value='3' min=0></p> <p>Depth: <input id='d' type='number' value='2' min=0></p> <hr> <p>x: <input id='X' type='number' value='0' min=0></p> <p>y: <input id='Y' type='number' value='0' min=0></p> <p>z: <input id='Z' type='number' value='0' min=0></p> <p><button id='process'>Process XY Z</button></p> <div id='output'></div> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM