그래픽 & 멀티미디어
글 수 111
2007.04.23 22:42:12 (*.239.53.178)
30903
원 내부를 특정 색으로 칠하는 코드를 생각해 보겠습니다. 이전 코드에서 점 좌료를 그래도 이용하는 것으로 그림에서처럼 좌표와 좌표를 연결해서 원의 내부를 칠하는 것입니다.
이전 코드와 달라진 부분만 색상을 바꾸었습니다. 참고하세요. ^^
#include <stdio.h> #include <stdlib.h> #include <string.h> // abs #include <unistd.h> // open/close #include <fcntl.h> // O_RDWR #include <sys/ioctl.h> // ioctl #include <sys/mman.h> // mmap PROT_ #include <linux/fb.h> int screen_width; int screen_height; unsigned short *fb_mapped; void dot( int x, int y) { unsigned short *ptr; if ( 0 <= x && 0 <= y && x < screen_width && y < screen_height) { ptr = fb_mapped + screen_width * y + x; *ptr = 0xffff; } } static void inner_circle( int x_center, int y_center, int x_coor, int y_coor) { int x_dot; int y_dot; y_dot = y_center +y_coor; for ( x_dot = x_center -x_coor; x_dot < x_center +x_coor; x_dot++) dot( x_dot, y_dot); y_dot = y_center -y_coor; for ( x_dot = x_center -x_coor; x_dot < x_center +x_coor; x_dot++) dot( x_dot, y_dot); y_dot = y_center +x_coor; for ( x_dot = x_center -y_coor; x_dot < x_center +y_coor; x_dot++) dot( x_dot, y_dot); y_dot = y_center -x_coor; for ( x_dot = x_center -y_coor; x_dot < x_center +y_coor; x_dot++) dot( x_dot, y_dot); } void circle( int x_center, int y_center, int radius) { int x_coor; int y_coor; int p_value; x_coor = 0; y_coor = radius; p_value = 3 - 2 * radius; while ( x_coor < y_coor) { inner_circle( x_center, y_center, x_coor, y_coor); if ( p_value < 0) { p_value += 4 * x_coor +6; } else { p_value += 4 * ( x_coor -y_coor) +10; y_coor--; } x_coor++; } if ( x_coor == y_coor) inner_circle( x_center, y_center, x_coor, y_coor); } int main( int argc, char **argv) { int fb_fd; struct fb_var_screeninfo fbvar; struct fb_fix_screeninfo fbfix; int bytes_per_line; int mem_size; if ( access( "/dev/fb", F_OK)) { printf( "프레임 버퍼 장치가 없습니다.n"); return 0; } if ( 0 > ( fb_fd = open( "/dev/fb", O_RDWR))) { printf( "프레임 버퍼에 접근할 수 없습니다.n"); return 0; } if ( ioctl( fb_fd, FBIOGET_VSCREENINFO, &fbvar)) { printf( "FBIOGET_VSCREENINFO를 실행하지 못했습니다.n"); return 0; } if ( ioctl( fb_fd, FBIOGET_FSCREENINFO, &fbfix)) { printf( "FBIOGET_FSCREENINFO 실행하지 못했습니다.n"); return 0; } screen_width = fbvar.xres; // 스크린의 픽셀 폭 screen_height = fbvar.yres; // 스크린의 픽셀 높이 bytes_per_line = fbfix.line_length; // 한개 라인 당 바이트 개수 mem_size = bytes_per_line * screen_height; fb_mapped = ( unsigned short *)mmap( 0, mem_size, PROT_READ|PROT_WRITE, MAP_SHARED, fb_fd, 0); if ( 4 != argc) { printf( "사용방법: $]./sample x y rn"); } else { circle( atoi( argv[1]), atoi( argv[2]), atoi( argv[3]) ); } munmap( fb_mapped, mem_size); close( fb_fd); return 0; }
[jwjw@jwCentOS 026 circle]$ ./sample 500, 100, 60
[jwjw@jwCentOS 026 circle]$ ./sample 100, 100, 100
[jwjw@jwCentOS 026 circle]$ ./sample 400, 300, 80
[jwjw@jwCentOS 026 circle]$ ./sample 50, 400, 180
아래는 실행한 모습입니다.
태그: *그래픽