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;
        }
    }
}