UNIV
2022-03-24 14:17
컴퓨터 그래픽스 - 3강. 컴퓨터 그래픽스 기본요소
데카르트 좌표계
- 하나의 점에서 수직으로 교차하는 직선 축으로 표현되는 좌표계
- 2차원, 3차원
- 동차 좌표: n차원 투영공간을 n + 1 개의 좌표로 나타내는 좌표계
- 2차원 동차 좌표
- 데카르트 좌표 (x, y)에 대한 동차좌표 표현
- (hx, hy, h), h != 0
OpenGL의 점 그리기
- 꼭지점 좌표의 전달
- 점 그리기
glDrawArrays
함수 사용
OpenGL의 선분 그리기
- mode: GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP 중 하나의 상수를 전달함
- 직선 방정식:
y = mx + b
- 기울기-절편 방정식:
y = mx + yl - mxl
DDA 알고리즘
- Digital Differential Analyzer
- |m|에 따라 기준 축을 정한 후, 기준 축의 좌표가 1만큼 변화 할 때 나머지 축 좌표의 변화를 구하여 다음 점의 좌표를 계산함
- |m| <= 1인 경우: x축 좌표를 1씩 변화 시킬 때, y축 좌표를 m만큼 변화시켜 다음 점의 좌표를 계산함
- |m| > 1인 경우: y축 좌표를 1씩 변화 시킬 때, x축 좌표를 1/m만큼 변화시켜 다음 점의 좌표를 계산함
void DDA(int x0, int y0, int xEnd, int yEnd)
{
int dx = xEnd - y0, dy = yEnd - y0, steps, k;
float xIncrement, yIncrement, x = x0, y = y0;
if (abs(dx) > abs(dy)) steps = abs(dx);
else steps = abs(dy);
xIncrement = float (dx) / float (steps);
yIncrement = float (dy) / float (steps);
setPixel(round(x), round(y));
for (k = 0; k < steps; k++) {
x += xIncrement;
y += yIncrement;
setPixel(round(x), round(y));
}
}
- DDA 알고리즘의 특성
- 기울기 값에 따라 한 축의 좌표는 1, 다른 축의 좌표는 m(m 또는 1/m)만큼 변화 시키며, 다음 좌표를 계산하여 가장 가까운 정수 좌표에 해당되는 픽셀을 그림
- 문제점
- 부동 소수점을 계산 해야 함
- 반올림 및 부동소수점 연산으로 시간이 많이 소요됨
- 긴 선분의 경우 부동소수점 연산의 오차가 누적되어 정확한 직선 경로를 벗어날 수 있음
- 부동 소수점을 계산 해야 함
Bresenhem의 직선 알고리즘
- 기울기가 0과 1 사이인 직선을 가정함
- 매 단계의 판별식의 값은 이전 단계의 판별식에 한 번의 정수 덧셈만 하면 구할 수 있어 실수 연산이 필요한 DDA 알고리즘에 비해 효율적이다.
- 판별식의 초기값 F(M1)
- 다음 픽셀 위치의 결정 및 판별식 갱신
ex) 선분 (1, 1) - (6, 4)
W = 5, H = 3
2H = 6, 2(H-W) = 4
F = 2H - W = 1
void bresenhem_line (int xl, int yl, int xr, int yr)
{
int x, y = yl, W = xr - xl, H = yr - yl;
int F = 2 * H - W, dF1 = 2 * H, dF2 = 2 * (H - W);
for (x = xl; x <= xr; x++) {
setPixel(x, y);
if (F < 0)
F += dF1;
else {
y++;
F += dF2;
}
}
}