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

30
3장. 2 장장 장장 장장장 장장장 장장 장장장장 장장장 장장장장 장장장장 장장장장장 장장장장장장장 장 장장

Upload: juliet

Post on 05-Jan-2016

152 views

Category:

Documents


7 download

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

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

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

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

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

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

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

3.1 개관 (Overview)

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

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

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

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

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

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

그림 3.4 주사 변환한 직선

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

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

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

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

프로그램 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 */

}}

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

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 중간점 직선 주사 변환 알고리즘

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

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

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

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

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

3.2.3 문제점들 (Additional Issues)

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

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

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

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

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

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

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

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

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

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 함수

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

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

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

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 ( 중간점 원 주사변환 알고리즘 )

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

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 ( 정수형 중간점 원주사 변환 알고리즘 )

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

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

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

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 차 편차를 이용한 중간점 원 주사 변환 알고리즘 )

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

3.4 사 각 형 채 우 기 (Filling Rectangles)

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

3.5 다각형 채우기 (Filling Polygons) 

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

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

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

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

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

다각형 채우기의 3 단계

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

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

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

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

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

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

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

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

3.5.1 수평 선분 (Horizontal Edges) 

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

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

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

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

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

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 ( 다각형 왼쪽 선분의 주사 변환 )

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

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

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

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

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

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

주사선 알고리즘

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

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

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

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

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

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

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

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