преобразование индекса: координаты строки в декартовы координаты (например, пиксели) - PullRequest
2 голосов
/ 22 ноября 2010

Мне нужно преобразовать / получить доступ к индексам памяти в / из основных и декартовых * макетов.

, если это поможет вам вообразить использование или проблему: дело касается пикселей (чтение / манипулирование), хранящихся в разных макетах памяти.

небольшая программа для иллюстрации:

#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) то, что я называю декартовой, это , а не основной столбец.

* возможно, есть лучший термин для этого?

1 Ответ

4 голосов
/ 22 ноября 2010

преобразовать из исходной индексации в столбец строки: r = i/WIDTH, c = i%WIDTH, затем в декартову индексацию: c*HEIGHT + (HEIGHT-1-r).

...