2017-02-19 6 views
0

Поскольку мы не можем сериализовать многомерные массивы (в Unity), мы ограничены использованием одномерных массивов вместе с математикой для преобразования из x, y пар в индекс и обратно. Вот текущие алгоритмы преобразования:Многомерный массив с одномерным индексом Math

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?

Однако мой массив не в высоту, ширину, глубину (у, х, г) порядок, а скорее ШИРИНА, ВЫСОТА , DEPTH (x, y, z). Кроме того, мне нужен алгоритм, чтобы превратить его из индекса обратно в значения x, y, z.

Спасибо, - Джеф

+1

'х + Ширина * (у + высота * г),' х = я% Ширина; y = (i/= ширина)% Высота; z = i/Height'. – PetSerAl

+0

Так что неровные массивы - это не вариант? – Slai

+1

Возможно, этот вопрос может быть вам полезен: http://stackoverflow.com/questions/3613429/algorithm-to-convert-a-multi-dimensional-array-to-a-one-dimensional-array. Я нахожу все возможное, чтобы обойти эти ментальные блоки, визуализируя проблему. – pijemcolu

ответ

0

Edit: пожалуйста, проверьте ссылку разделяемое 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, как вы используете int тип данных в C#.

$(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>