2012-04-14 3 views
2

Я использую 1D-вектор для представления трехмерной структуры данных с индексами от 0 до x * y * z, где x, y и z - количество ячеек в каждом направлении.1D vector - 3D-индексы

Для того, чтобы индексировать конкретные ячейки [хи] [уг] [цзы], я использую:

index = xi + x*yi + x*y*zi ; 

Моя проблема в том, что я не могу работать, как идти в другую сторону!

например. Я хочу, чтобы получить отдельные координаты, представленные в индексе 43.

Я думаю, что я работал, как получить хх:

xi = index % x ; 

, но я не могу за жизнь мне получить другие .. .:/

EDIT: Хммм. Это правильно?

xi = index % x; 
yi = ((index - xi)/x) % y; 
zi = ((index - xi - x*yi)/x)/y ; 
+0

Ваше правое право, но вычитания не нужны из-за целочисленного деления – SirGuy

ответ

4

Попробуйте это:

xi = index % x; 
yi = (index/x) % y; 
zi = ((index/x)/y) % z; 

Это легко может быть обобщена как можно было бы ожидать.

+0

«% z» не нужен, но он ясно показывает, как это обобщать. Небеса запрещают кому-то нуждаться в 4, 5 или 6 мерных массивах! – SirGuy

+0

Я слышал, что «они» используют ~ 7 мерных массивов в шахматных программах, поэтому кто знает;) Я нахожу «% z» неплохо, потому что он позволяет автоматически индексировать циклические массивы, что может пригодиться. – Anthales

+0

Я не уверен, что я одобряю индексирование циклического массива, большую часть времени (для меня, по крайней мере), если мой индекс больше, чем мой массив, это ошибка, но цикличность скроет это. Хотя в других случаях, если это удобно, тогда это удобно, и я бы одобрил. – SirGuy

1

Некоторая модульная арифметика должна делать трюк.

index % x = (xi + x*yi + x*y*zi) % x = xi % x, 
    but 0 <= xi < x therefore xi % x = xi. 

Тогда для уг:

(index/x) % y = yi. 

Тогда, наконец:

index/(x * y) = zi. 

EDIT:

В коде (в отличие от математики выше) было бы:

xi = index % x; 
    yi = (index/x) % y; 
    zi = index/(x * y); 
+0

хороший ответ ... так как это сайт кодирования, возможно, по крайней мере, чтобы последние уравнения выглядели как что-то, что могло бы быть кодом? (Я никогда не видел такого оператора присваивания) – Shep

+0

@ Шеп, ты прав, мне просто нравятся математические вопросы, так что я забываю маленькие детали. Отредактирован ответ – SirGuy

Смежные вопросы