多维数组到单维索引数学

时间:2017-02-19 01:25:02

标签: c# arrays unity3d

由于我们不能序列化多维数组(在Unity中),我们仅限于使用一维数组和数学来将x,y对转换为索引并退出。以下是当前的转换算法:

this

现在,我有一个问题,我需要创建一个引入深度和z轴的三维网格,但我无法弄清楚如何将更改注入上述方法......我&# 39;有精神障碍。

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

How to "flatten" or "index" 3D-array in 1D array?

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

谢谢, - 杰夫

1 个答案:

答案 0 :(得分:0)

编辑:请查看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#中使用floor数据类型时,您不需要使用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 X Y Z are: ' + JSON.stringify(retXYZ));
  });
});
&#13;
<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>
&#13;
&#13;
&#13;