Конвертация индекса: CORE-SHAIR к Cartesian Coornates (например, пикселей)
-
27-09-2019 - |
Вопрос
Мне нужно преобразовать / доступом памяти индексов памяти до и из строк-майора и декартовых макетов.
Если это поможет вам представить себе использование или проблему: дело доступа к пикселям (чтение / манипуляция), хранящимся в разных макетах памяти.
Небольшая программа для иллюстрации:
#include <cassert>
#include <iostream>
/*
memory layout:
row major:
0 1 2 3
4 5 6 7
8 9 10 11
cartesian:
2 5 8 11
1 4 7 10
0 3 6 9
*/
unsigned rowmaj_to_cartesian(const unsigned& i) {
return ?;
}
int main(int argc, const char* argv[]) {
const unsigned W(4);
const unsigned H(3);
const unsigned A(W * H);
unsigned a[A];
for (size_t i(0); i < A; ++i) {
/* populate a[] with row-major layout */
a[i] = i;
}
for (size_t i(0); i < A; ++i) {
/* convert the index values to cartesian layout */
a[i] = rowmaj_to_cartesian(a[i]);
std::cout << i << ": " << a[i] << "\n";
}
/* sanity check the results */
assert(a[0] == 2);
assert(a[1] == 5);
assert(a[2] == 8);
assert(a[3] == 11);
assert(a[4] == 1);
assert(a[5] == 4);
assert(a[6] == 7);
assert(a[7] == 10);
assert(a[8] == 0);
assert(a[9] == 3);
assert(a[10] == 6);
assert(a[11] == 9);
return 0;
}
Это простая проблема, но я не смог понять это (или найти ответ на поиск).
Спасибо за вашу помощь!
подробности:
1) Извините, внешние библиотеки не являются вариантом. (Может быть, пример был плохой: STL тоже не вариант)
2) то, что я имею в виду, как декартово нет Майор столбца.
* Возможно, есть лучший термин для этого?
Решение
Конвертировать из оригинальной индексации к колонне строки:r = i/WIDTH, c = i%WIDTH
Затем в декартовую индексацию: c*HEIGHT + (HEIGHT-1-r)
.