그래픽 & 멀티미디어
글 수 111
2007.04.23 22:42:12 (*.239.53.178)
33352
원 내부를 특정 색으로 칠하는 코드를 생각해 보겠습니다. 이전 코드에서 점 좌료를 그래도 이용하는 것으로 그림에서처럼 좌표와 좌표를 연결해서 원의 내부를 칠하는 것입니다.
이전 코드와 달라진 부분만 색상을 바꾸었습니다. 참고하세요. ^^
#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
아래는 실행한 모습입니다.

태그: *그래픽


