多维阵列到单维索引数学



,由于我们无法序列化多维数组(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;
}

现在,我有一个问题,需要创建一个3维网格,该网格引入深度以及Z轴,但我不知道如何将更改注入上面的方法...我有精神障碍。

我找到了这篇文章,解释了其中的一些内容:

如何弄平或"索引"1D数组中的3D阵列?

但是,我的数组不在高度,宽度,深度(y,x,z)顺序中,而是宽度,高度,深度(x,y,z)顺序。此外,我需要算法将其从索引返回x,y,z值。

谢谢-Jeff

编辑:请检查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;
}

注意:当您使用C#中的int数据类型时,您不需要使用floor

$(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 X Y Z 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 X Y Z</button></p>
<div id='output'></div>

最新更新