2017-02-19 55 views
0

由於我們無法序列化多維數組(在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軸的問題,但我無法弄清楚如何注入變化進入上面的方法......我有一個心理障礙。

我發現這個職位,說明一些吧:

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

然而,我的數組是不是在高度,寬度,深度(Y,X,Z)爲了而是寬度,高度,深度(x,y,z)順序。此外,我需要算法將其從索引變回x,y,z值。

感謝, - 傑夫

+1

'X +寬度*(Y +身高* Z)','X = I%寬度; y =(i/=寬度)%高度; z =我/高度「。 – PetSerAl

+0

所以鋸齒陣列不是一個選項? – Slai

+1

也許這一個問題可能會對你有所幫助:http://stackoverflow.com/questions/3613429/algorithm-to-convert-a-multi-dimensional-array-to-a-one-dimensional-array。我發現盡最大可能通過形象化問題來規避這些心理障礙。 – pijemcolu

回答

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#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>