2013-08-07 2 views
0

그래서 바둑판 패턴으로 겹치고 싶은 이미지가 있습니다. 이것은 내가 지금까지 함께 온 것입니다 :바둑판 패턴을 만드는 뛰어난 방법

for (uint_8 nRow = 0; nRow < image.width(); ++nRow) 
     for (uint_8 nCol = 0; nCol < image.height(); ++nCol) 
        if(((nRow/20 + nCol/20) % 2) == 0) 
         memset(&image.data[nCol + nRow], 0, 1); 

불행하게도 흰색 이미지를 생성합니다. 나는 memset가 다중 대신에 이미지의 모든 단일 픽셀에 대해 호출되기 때문에 이것이 매우 효과적이라고 생각합니다. 이 코드가 왜 칠판 패턴을 생성하지 않습니까? 어떻게 향상 시키겠습니까?

+1

성능에 대한 질문입니까, 아니면 원하는 결과를 얻지 못하는 이유입니까? – PlasmaHH

+0

글쎄, 처음에는'memset' 호출을'image.data [...] = 0;'으로 대체 할 수 있습니다. 성능상의 이점은 있지만 그렇지 않을 수도 있지만 추악하고 무의미합니다. – delnan

+0

내 질문을 명확히했습니다 – tzippy

답변

2

성능을 향상 시키려면 이미지를 2 차원 엔티티로 처리하지 마십시오. 대신, 이미지의 모든 라인이 차례로 배열되는 1D 연속 데이터 배열로 보아라.

이 방법으로

, 당신은) (모든 반복에 당신이 memset 함수 단일 루프, 여러 인접 픽셀을 한 번에 패턴을 쓸 수 있으며, 사용자가 설정 한 픽셀의 두 배에 의해 인덱스를 증가 :

int data_size = image.width() * image.height(); 
for (auto it = image.data; it < image.data + data_size; it += 20) { 
    memset(it, 0, 20); 
    if (((it - data) + 40) % (20 * 400) == 0) { 
     it += 40; 
    } else if (((it - data) + 20) % (20 * 400) != 0) { 
     it += 20; 
    } 
} 

(당신이 C++ (11)를 사용하지 않는 경우 image.data의 종류에 auto 교체, 나는 그것이 unsigned char*의 생각한다.)

이것은 CPU의 캐시 프리 페치에 매우 친화적이다. 또한 컴파일러에서 친숙하며 잠재적으로 루프 언 롤링을 벡터화 및/또는 수행 할 수 있습니다. 당신이 검사 정사각형 크기의 배수 이미지의 크기가있는 경우

+0

이것은 체커 보드에 짝수 개의 열이있는 경우에만 작동합니다. –

+0

아주 좋습니다! 감사! 이것은 수직 줄무늬를 만들지 만. 20 "의 간격마다 오프셋이 있어야합니다. 폭이나 높이가 20의 배수가 아닌 경우 – tzippy

+0

이주의해야합니다. 각 행/열에서 패턴을 오프셋합니다. – lucasg

0

는 : (나는 C로 코딩 있지만 C에 트랜스 상당히 쉬운을 ++)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define uint unsigned int 
#define WIDTH 40 
#define HEIGHT 40 
#define BLOCK_SIZE 5 

void create_checker_row(uint* row, uint size_block, uint nb_col, uint offset) 
{ 
    uint ic; 
    for (ic = size_block*offset ; ic < nb_col; ic+= 2*size_block) 
    { 
     memset((row + ic) , 0, size_block*sizeof(uint)); 
    } 
} 

int main() 
{ 
    uint ir,ic; 

    // image creation 
    uint* pixels = (uint*) malloc(WIDTH*HEIGHT*sizeof(uint)); 
    for (ir = 0; ir < WIDTH; ir++) 
    { 
     for (ic = 0; ic < HEIGHT; ic++) 
     { 
      // arbitrary numbers 
      pixels[ir*WIDTH + ic] = (ir*WIDTH + ic) % 57 ; 
      printf("%d,", pixels[ir*WIDTH + ic]); 
     } 
     printf("\n"); 
    } 

    for (ir = 0; ir < WIDTH; ir++) 
    { 
     create_checker_row(pixels + ir*WIDTH , // pointer at the beggining of n-th row 
          BLOCK_SIZE   , // horizontal length for square 
          WIDTH    , // image width 
          (ir/BLOCK_SIZE) % 2 // offset to create the checker pattern 
          ); 
    } 

    // validation 
    printf("\n"); 
    printf("Validation \n"); 
    printf("\n"); 
    for (ir = 0; ir < WIDTH; ir++) 
    { 
     for (ic = 0; ic < HEIGHT; ic++) 
     { 
      printf("%d,", pixels[ir*WIDTH + ic]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

나를 위해 꽤 체크 무늬를 보인다 : http://ideone.com/gp9so6

관련 문제