【问题标题】:Multi-Dimensional Array to Single-Dimensional Index Math多维数组到一维索引数学
【发布时间】:2017-07-08 10:30:57
【问题描述】:

由于我们无法序列化多维数组(在 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 维网格,但我不知道如何将更改注入到上述方法中......我有一个心理障碍。

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

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 值。

谢谢, - 杰夫

【问题讨论】:

  • x + Width * (y + Height * z), x = i % Width; y = (i /= Width) % Height; z = i / Height.
  • 所以锯齿状数组不是一个选项?
  • 也许这个问题对你有帮助:stackoverflow.com/questions/3613429/…。我发现最好通过可视化问题来规避这些心理障碍。
  • 在实现中使用模数和除法效率非常低:除法需要多个周期。你在做游戏吗?将(锯齿状)锯齿状数组用于您自己的所有操作,然后将其转换为单个数组进行序列化可能会更有效。

标签: c# arrays unity3d


【解决方案1】:

编辑:请查看 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 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 2017-11-17
    • 2015-11-04
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多