3 장 . 2 차원 기본 객체를 그리기 위한 기본적인 래스터 그래픽스 알고리즘

Post on 05-Jan-2016

152 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

DESCRIPTION

3 장 . 2 차원 기본 객체를 그리기 위한 기본적인 래스터 그래픽스 알고리즘. 한림대학교 정보통신공학부 송 창근. 그림 3.1 사각형 모양의 클리핑 영역에서 SRGP 기본객체 클리핑하기 (a) 기본 객체와 클리핑 사각형 (b) 클리핑된 결과. 3.1 개관 (Overview). 3.1.1 디스플레이 시스템 구조 (Implications of Display-System Architecture). 그림 3.2 응용 프로그램과 그래픽스 시스템의 중개자인 SRGP 는 입출력 파이프라인을 제공한다. - PowerPoint PPT Presentation

TRANSCRIPT

3 장 . 2 차원 기본 객체를 그리기 위한 기본적인 래스터 그래픽스 알고리즘

한림대학교 정보통신공학부송 창근

그림 3.1 사각형 모양의 클리핑 영역에서 SRGP 기본객체 클리핑하기(a)     기본 객체와 클리핑 사각형 (b) 클리핑된 결과

3.1 개관 (Overview)

3.1.1 디스플레이 시스템 구조 (Implications of Display-System Architecture)

그림 3.2 응용 프로그램과 그래픽스 시스템의 중개자인 SRGP 는 입출력 파이프라인을 제공한다

그림 3.3 SRGP 가 구동하는 두 가지 유형의 디스플레이 시스템 . (a)   디스플레이 컨트롤러와 프레임 버퍼를 가진 디스플레이 주변장치 (b) 디스플레이 컨트롤러를 갖지 않은 메모리 공유 프레임 버퍼

3.2 직선의 주사 변환 (Scan Converting Lines) 

그림 3.4 주사 변환한 직선

3.2.1 기본적인 점증 알고리즘 (The Basic Incremental Algorithm)

그림 3.5 (x,y) 의 점증 계산

프로그램 3.1 ( 직선 주사 변환을 위한 점증 알고리즘 ) void Line(int x0, int y0, int x1, int y1, int value){ /* Assumes -1 <= m <= 1, x0 < x1 */

int x; /* x runs from x0 to x1 in unit increments.*/float dy,dx,y,m;

dy = y1 - y0;dx = x1 - x0;m = dy/dx;y = y0;for( x=x0; x<=x1; x++ ){

WritePixel(x,(int)floor(y+0.5),value); /* Set pixel to value */y+=m; /* Step y by slope m */

}}

3.2.2 중간점 직선 알고리즘 (Midpoint Line Algorithm)

void MidpointLine(int x0, int y0, int x1, int y1, int value){

int dx, dy, incrE, incrNE, d, x, y;

dx = x1 - x0;dy = y1 - y0;d = dy*2 - dx; /* Initial value of d */incrE = dy*2; /* Increment used for move to E */incrNE = (dy-dx)*2; /* Increment used for move to NE */x = x0;y = y0;WritePixel(x, y, value); /* The start pixel */while(x < x1){

if(d <= 0){ /* Choose E */d += incrE;x++;

}else{ /* Choose NE */d += incrNE;x++;y++;

}WritePixel(x, y, value);

/* The selected pixel closest to the line */}

}

프로그램 3.2 중간점 직선 주사 변환 알고리즘

그림 3.6 중간점 직선 알고리즘을 위한 픽셀 격자

그림 3.7 점 (5,8) 에서 점 (9,10) 까지의 중간점 직선

3.2.3 문제점들 (Additional Issues)

그림 3.9. 기울기의 함수로 직선의 강도에 변화를 줌

3.3 원 의 주 사 변 환 (Scan Converting Circles) 

그림 3.10 x 값을 하나씩 증가시켜 가며 y 값을 계산하여 원을 그려 만들어진 4 분원

3.3.1 8 방향 대칭성 (Eight-way Symmetry)

그림 3.11 원 위의 8 개의 대칭점

Void CirclePoints (float x, float y, int value);

{

WritePixel(x,y,value);

WritePixel(y,x,value);

WritePixel(y,-x,value);

WritePixel(x,-y,value);

WritePixel(-x,-y,value);

WritePixel(-y, -x,value);

WritePixel(-y,x,value);

WritePixel(-x,y,value);

}

CirclePoint 함수

그림 3.12 중간점 원 일고리즘을 위한 픽셀 격자

void MidpointCircle(int radius, int value){

int x, y;float d;x = 0; /* Initialization */y = radius;d = 5.0/4 - radius;CirclePoints(x, y, value);while(y > x){

if(d < 0){ /* Select E */d += x*2.0 + 3;x++;

}else{ /* Select SE */d += (x - y)*2.0 + 5;x++;y--;

}CirclePoints(x, y, value);

}}

프로그램 3.3 ( 중간점 원 주사변환 알고리즘 )

void MidpointCircle(int radius, int value){

int x, y, d;

x = 0; /* Initialization */y = radius;d = 1 - radius;CirclePoints(x, y, value);while(y > x){

if(d < 0){ /* Select E */d += x*2 + 3;x++;

}else{ /* Select SE */d += (x -y )*2 + 5;x++;y--;

}CirclePoints(x, y, value);

}}

프로그램 3.4 ( 정수형 중간점 원주사 변환 알고리즘 )

그림 3.13 두 번째 8 분원은 중간점 알고리즘으로 , 첫번째 8 분원은 대칭성을 이용하여 만들어졌다

void MidpointCircle(int radius, int value){ /* This function uses second-order partial differences to compute increments in the decision variable. Assumes center of circle is at origin. */

int x, y, d, deltaE, deltaSE;

x = 0; /* Initialization */y = radius;d = 1 - radius;deltaE = 3;deltaSE = 5 - radius * 2;CirclePoints(x, y, value);while (y > x) {

if (d < 0) { /* Select E */d += deltaE;deltaE += 2;deltaSE += 2;x++;

} else { /* Select SE */d += deltaSE;deltaE += 2;deltaSE += 4;x++;y--;

}CirclePoints(x, y, value);

}}

프로그램 3.5 (2 차 편차를 이용한 중간점 원 주사 변환 알고리즘 )

3.4 사 각 형 채 우 기 (Filling Rectangles)

3.5 다각형 채우기 (Filling Polygons) 

그림 3.14 다각형과 8 번 주사선 : (2, 4.5, 8.5, 13)

그림 3.15 다각형을 위한 스팬 . 양끝점은 검은 색으로 , 내부 픽셀은 회색으로 그려짐 .

(a)     양 끝점은 중간점 알고리즘으로 계산되었다 . (b) 다각형 내부에 놓여진 양 끝점.

다각형 채우기의 3 단계

1. 다각형의 모든 선분과 주사선의 교차점을 구한다 .

2. 그 교차점들을 x 가 증가하는 방향으로 정렬한다

3. 교차점 쌍들 사이의 모든 픽셀을 채운다 .

3.1 교차점의 값이 실수값일 때 , 그 교차점의 어느쪽 픽셀을 내부로 결정할 것인가 ?

3.2 교차점의 픽셀 좌표가 정수일 때 어떻게 처리하는가 ?

3.3 공유하는 꼭지점들은 어떻게 처리할 것인가 ?

3.4 수평 선분의 픽셀들은 어떻게 처리할 것인가 ?

3.5.1 수평 선분 (Horizontal Edges) 

그림 3.16 다각형의 수평선분 .

3.5.2 끝이 뽀족한 다각형 (Silvers)

그림 3.17 끝이 뾰족한 다각형의 주사 변환

3.5.3 선분 일관성과 주사선 알고리즘 (Edges Coherence and the Scan-Line Algorithm)

void LeftEdgeScan(int xmin, int ymin, int xmax, int ymax, int value){

int x, y, numerator, denominator, increment;

x = xmin;numerator = xmax - xmin;denominator = ymax - ymin;increment = denominator;

for (y = ymin; y < ymax; y++) {

WritePixel(x, y, value);increment += numerator;if (increment > denominator) { /* Overflow, so round up to next pixel and decrement the increment */x += 1;increment -= denominator;}

}}

프로그램 3.6 ( 다각형 왼쪽 선분의 주사 변환 )

그림 3.18 그림 3.14 의 다각형에 대한 버켓 정렬된 선분 테이블(Edge Table, ET)

그림 3.19 그림 3.14 의 다각형에 대한 활동 - 선분 테이블(AET, Active Edge Table)

(a)     9 번 주사선 (b) 10 번 주사선

주사선 알고리즘

• ET 의 비어 있지 않은 첫 버켓 번호를 스팬 생성을 시작할 주사선의 위치 Y로 잡는다 .

• AET 가 비어 있도록 초기화 시킨다 .

• AET 와 ET 가 비워질 때가지 다음을 반복한다 .

• ET 의 버켓 Y 의 모든 선분을 AET 로 옮기고 , AET 의 모든 선분을 주사선과 교차하는 x 좌표값 X 가 증가하는 방향으로 정렬한다 .

• AET 의 X 쌍을 사용해서 주사선 Y 에 원하는 픽셀을 채운다 .

• Y=ymax 인 선분 , 즉 , 다음의 주사선 Y+1 과 교차하지 않는 선분을 AET 에서 지운다 .

• Y 를 1 만큼 증가 시킨다 .

• AET 에 남아 있는 선분 중 수직 선분이 아닌 모든 선분의 X 값을 새로운 주사선과 교차하는 점의 x 좌표값으로 수정한다 .

top related