비트맵 프로그래밍에 대한 질문입니다.

비트맵 프로그래밍에 대한 질문입니다.

작성일 2006.06.22댓글 1건
    게시물 수정 , 삭제는 로그인 필요

지금 책을 보고 있는데 도저히 이해를 할수가 없어서 이렇게 글을 올립니다.

 

책의 내용을 그래도 적습니다. 책은 C프로그래밍의 이해(3판)입니다.

 

16*16픽셀 크기의 흑백화면으로 된 작은 크래픽 장치에서 (4,7)의 비트값을

설정하려고 한다.

 

비트맵을 배열로 나타내는 데는 문제가 있다.

C에는 배열의 데이터형을 비트로 선언할 수  없다.  -->이해 안됨ㅜㅜ

 

따라서 16*16비트 배열을 2*16바이트 배열로 선언하였다. ->이해안됨

(-_- 2*2 바이트라면 이해가 되는데.. 왜 2 * 16 바이트인지???)

 

이제 x,y인덱스를 byte_x, byte_y. bit_index, bit로 바꾸는데 필요한 것이 무엇인지 알아보자

 

byte_y의 인덱스는 y인덱스와 동일하므로 (이해 안됨 ㅜㅜ먼소린지)이것의 변환은 간단하다.

byte_y= y;

 

(앞에 줄처논 부분이 이해가 안되서 그런지 이 이후론 완전 해맵니다.ㅜㅜ 죄다 이해가 안되기 시작해요..ㅜㅜ)

 

한 바이트는 8비트로 구성된다 따라서 X방향으로 바이트 인덱스는 비트 인덱스의 8배가

된다.  이 변환은 다음과 같다.

byte_x =x/8;

 

이제 비트 인덱스가 필요하다. 이 인덱스는 0에서 시작해서 7까지 변하고 다시 0부터 시작된다. 따라서 코드는 다음과 같다.

bit_index = x % 8;

 

이제 비트 그 자체를 지정해 보자 인덱스 0인 비트는 가장 왼쪽 비트 즉, 1000 0000이나

0x80으로 표시되는 비트다. 인덱스 1인 비트는 0100 0000이나 0x80 >>1로 나타내는 가장 왼쪽 바로 다음 비트다. 따라서 원하는 비트는 다음과 같은 코드로 표현할수 잇다.

(이 단락은 이해됩니다.^^;;)

bit = 0x80 >> bit_index;

 

전체 알고리즘은 다음과 같다.

byte_y = y;

byte_x = x  / 8;

bit_index = x % 8;

bit = 0x80 >> bit_index;

graphics[byte_x][byte_y]  |= bit;  

이 알고리즘은 하나의 매크로로 압축 될수 있다.

#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))

 

이렇게 책의 내용인데요..ㅜㅜ 너무 이해가 안되요 돌기 일보 직전이에요

하루이틀 보고 올리는거 아니거든요..ㅜㅜ한 일주일은 해멘것 같아요.

 

가장이해가 안되는것은

16*16비트 배열을 왜 2*16바이트 배열로 선언하는거죠?

2*2바이트도 아니구..ㅜㅜ

 

그냥 참고로 책에 붙어 있는 예제도 올려봅니다.

[예제11-3] 그래픽 배열의 대각선을 화면에 출력하는 프로그램이다.

#include <stdio.h>

 

#define X_SIZE 40                        // x방향 배열 크기
#define Y_SIZE 40                        // y방향 배열 크기

 

/*한바이트당 8비트이므로 X_SIZE/8을 사용*/

char graphics[X_SIZE / 8][Y_SIZE];

 

#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))

 

int main()
{
     int loc;
     void print_graphics(void);

 

     for(loc=0; loc<X_SIZE; ++loc)
     {
          SET_BIT(loc, loc);
     }

     print_graphics();


     return 0;
}

 

void print_graphics(void)
{
     int x;
     int y;

     unsigned int bit;

 

     for(y=0; y<Y_SIZE; ++y)
     {
          for(x=0; x<X_SIZE/8; ++x)
          {
               for(bit=0x80; bit >0; bit=(bit>>1))
               {
                    if((graphics[x][y]&bit) !=0)
                    {
                           printf("X");
                    }
                    else
                    {
                            printf(".");
                    }
               }
          }
          printf("\n");
     }
}



profile_image 익명 작성일 -

지금 책을 보고 있는데 도저히 이해를 할수가 없어서 이렇게 글을 올립니다.

 

책의 내용을 그래도 적습니다. 책은 C프로그래밍의 이해(3판)입니다.

 

16*16픽셀 크기의 흑백화면으로 된 작은 크래픽 장치에서 (4,7)의 비트값을

설정하려고 한다.

흑백이라고 한다면, 하얀색과 검정색의 두가지 표현이 가능합니다.  그러면 1비트로 처리가 가능하죠.  16x16 픽셀이라고 한다면, 총 256비트가 필요한 셈입니다.

 

비트맵을 배열로 나타내는 데는 문제가 있다.

C에는 배열의 데이터형을 비트로 선언할 수  없다.  -->이해 안됨ㅜㅜ

배열의 데이터형을 비트로 선언할 수 없다란 말은 배열은 최소 단위가 바이트 단위로만 사용가능하다는 것입니다.  C언어에서라는 단서를 달았지만, 이 부분은 모든 언어가 거의 공통적인 요소입니다.  컴퓨터는 데이터를 다루는 최소 단위가 바이트입니다.  즉 비트 단위로 처리하기 위해서는 별도의 오퍼레이션이 필요합니다.

 

따라서 16*16비트 배열을 2*16바이트 배열로 선언하였다. ->이해안됨

(-_- 2*2 바이트라면 이해가 되는데.. 왜 2 * 16 바이트인지???)

1바이트가 8비트이므로 256비트를 표현하기 위해서는 총 32바이트(32*8)가 필요합니다.  대부분의 흑백 디스플레이는 가로단위를 먼저 계산합니다.  그래서 가로 2바이트, 세로 16바이트를 설정한 것입니다.  2x2바이트라면 총 4바이트고 비트로 32비트밖에 안 되어서 16x16 픽셀을 표현할 수 없습니다.

 

이제 x,y인덱스를 byte_x, byte_y. bit_index, bit로 바꾸는데 필요한 것이 무엇인지 알아보자

 

byte_y의 인덱스는 y인덱스와 동일하므로 (이해 안됨 ㅜㅜ먼소린지)이것의 변환은 간단하다.

byte_y= y;

x축 해상도는 16이지만, 실제 바이트로 2바이트 표현됩니다.  그에 비해서 y축 해상도는 16이고, 바이트 배열도 16이므로 1:1 대응이 된다는 뜻입니다.  이 말에는 x축의 경우 1:1 대응이 되지 않는다는 뜻도 포함되어 있습니다.

 

(앞에 줄처논 부분이 이해가 안되서 그런지 이 이후론 완전 해맵니다.ㅜㅜ 죄다 이해가 안되기 시작해요..ㅜㅜ)

 

한 바이트는 8비트로 구성된다 따라서 X방향으로 바이트 인덱스는 비트 인덱스의 8배가

된다.  이 변환은 다음과 같다.

byte_x =x/8;

x축의 해상도가 16인데, 2바이트로 표현해야하니까 8:1 대응이 되겠죠.  그래서 8로 나누어 준 것입니다.

 

이제 비트 인덱스가 필요하다. 이 인덱스는 0에서 시작해서 7까지 변하고 다시 0부터 시작된다. 따라서 코드는 다음과 같다.

bit_index = x % 8;

 

이제 비트 그 자체를 지정해 보자 인덱스 0인 비트는 가장 왼쪽 비트 즉, 1000 0000이나

0x80으로 표시되는 비트다. 인덱스 1인 비트는 0100 0000이나 0x80 >>1로 나타내는 가장 왼쪽 바로 다음 비트다. 따라서 원하는 비트는 다음과 같은 코드로 표현할수 잇다.

(이 단락은 이해됩니다.^^;;)

bit = 0x80 >> bit_index;

 

전체 알고리즘은 다음과 같다.

byte_y = y;

byte_x = x  / 8;

bit_index = x % 8;

bit = 0x80 >> bit_index;

graphics[byte_x][byte_y]  |= bit;  

이 알고리즘은 하나의 매크로로 압축 될수 있다.

#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))

 

이렇게 책의 내용인데요..ㅜㅜ 너무 이해가 안되요 돌기 일보 직전이에요

하루이틀 보고 올리는거 아니거든요..ㅜㅜ한 일주일은 해멘것 같아요.

x/8은 바이트 인덱스를 찾는 부분이고, x%8은 비트인덱스를 찾는 부분입니다.  이 부분을 군대식으로 해석한다면, 소대는 8명으로 이루어져있고, 한 중대는 2개의 소대로 이루어집니다.  한 연대는 16개의 중대로 이루어집니다.  여기서 소대는 컴퓨터가 처리하는 데이터의 최소 단위인 바이트이고, 중대는 그래픽의 한 줄을 표시합니다.  연대는 그래픽 픽셀 전체를 표시하는 것으로 보시면 됩니다.  연병장에 연대가 모여있다고 생각하세요.  맨 첫줄에는 1중대가 있습니다.  두번째줄에는 2중대가 있고요.  1중대는 왼쪽에 1소대, 오른쪽에 2소대가 있습니다.  연대장이 훈시를 하는데 한 군인이 기침을 합니다.  그러면 그 군인을 연대장은 "세번째줄 왼쪽에서 9번째 녀석 나중에 나한테 오라고 해."  한다면 그 군인이 몇번째 소대인지 계산하실 수 있으시겠죠?  소대에서 몇번째 사람인줄도 알 수 있을 겁니다.  왼쪽에서 9번째이므로 9/8 = 1 (C언어에서는 0부터 시작하므로 2소대)가 되고, 9%8 = 1 (역시 0부터 시작하므로 2번째 군인)이 됩니다.  그러면 간단하게 세번째 줄이므로 3중대 2소대 2번째 군인이 되겠죠?  그래픽 표시도 이와 마찬가지입니다.

 

가장이해가 안되는것은

16*16비트 배열을 왜 2*16바이트 배열로 선언하는거죠?

2*2바이트도 아니구..ㅜㅜ

 

그냥 참고로 책에 붙어 있는 예제도 올려봅니다.

[예제11-3] 그래픽 배열의 대각선을 화면에 출력하는 프로그램이다.

#include

 

#define X_SIZE 40                        // x방향 배열 크기
#define Y_SIZE 40                        // y방향 배열 크기

 

/*한바이트당 8비트이므로 X_SIZE/8을 사용*/

char graphics[X_SIZE / 8][Y_SIZE];

 

#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >> ((x)%8))

 

int main()
{
     int loc;
     void print_graphics(void);

 

     for(loc=0; loc     {
          SET_BIT(loc, loc);
     }

     print_graphics();


     return 0;
}

 

void print_graphics(void)
{
     int x;
     int y;

     unsigned int bit;

 

     for(y=0; y     {
          for(x=0; x          {
               for(bit=0x80; bit >0; bit=(bit>>1))
               {
                    if((graphics[x][y]&bit) !=0)
                    {
                           printf("X");
                    }
                    else
                    {
                            printf(".");
                    }
               }
          }
          printf("\n");
     }
}

프로그래밍, 또 프로그래머에 대해서

... 일단 질문.. 1. 기본적인걸 다 습득할때까지(C,C++,비베... 게임프로그래밍에 대한 전문적인 지식과 기본적인... 메뉴/리소스 비트맵 파일 (DDB,DIB) 등 좀 배우셔야 하구요...

게임프로그래밍 언어에 대해...

... 게임프로그래밍언어에 대해 좀 알려주세요.. 질문대한 답변입니다... 도움이 되시길... 프로그램에... 메뉴/리소스 비트맵 파일 (DDB,DIB) 등 좀 배우셔야 하구요.....

[내공100] 3d 프로그래밍 질문입니다...

... 질문 드립니다. api와 mfc만을 이용해서 게임을 프로그래밍 할때는 배경이라던가 여러가지에 쓸 리소스, 비트맵등... 게임프로그래밍에서 많이 사용되는 수학 물리에 대한...

게임프로그래밍 언어에 대해...

... 게임프로그래밍언어에 대해 좀 알려주세요.. 질문대한 답변입니다... 도움이 되시길... 프로그램에... 메뉴/리소스 비트맵 파일 (DDB,DIB) 등 좀 배우셔야 하구요.....

게임프로그래밍에 관심이 많은데요...

안녕하세요 제가요 게임프로그래밍에 관심 이 맣아 이것저것 알아보다가요.. 이렇게 질문합니다... 직업을 뭘로... 메뉴/리소스 비트맵 파일 (DDB,DIB) 등 좀 배우셔야 하구요.....