2010-11-22 116 views
2

我需要轉換/訪問內存索引往返主行和笛卡爾*佈局。索引轉換:行大到笛卡爾座標(例如,像素)

如果它可以幫助你想象使用或問題:情況是訪問存儲在不同內存佈局中的像素(讀/操作)。

一個小程序來說明:

#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)我所說的笛卡爾是而不是列專業。

*也許有更好的術語呢?

回答

4

將您的原始索引轉換爲行列: r = i/WIDTH, c = i%WIDTH 然後轉換爲笛卡爾索引:c*HEIGHT + (HEIGHT-1-r)

相關問題