由于我们不能序列化多维数组(在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值。
谢谢, - 杰夫
答案 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;