2010-11-22 3 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) 내가 직교로 참조하는 것은 이 아니고 열 major이다.

* 아마도 여기에 더 좋은 용어가 있습니까? 원래의 색인에서

답변

4

변환은 열을 행합니다 : r = i/WIDTH, c = i%WIDTH 다음 데카르트 색인에 : c*HEIGHT + (HEIGHT-1-r).