화면이나 그림에서 직선을 그리려면 직선의 방정식을 만족하는 모든 픽셀들을 찾으면 된다. 하지만 픽셀의 위치는 연속적인 값이 아니라 이산적이므로 그림에 그려진 직선을 구성하는 픽셀은 그 직선을 표현을 하는 식이 주는 값에 가장 가까운 정수를 찾아서 그린 것이다. 직선을 그리기 위해서 실수 연산을 한 후 정수로 반올림하는 과정이 들어가게 된다.
Bresenham 알고리즘은 평면 위의 두 점
이제,
이 과정을 실수 연산 없이 판별하는 방법을 알아내자.
로 표현되고, 나눗셈을 하지 않기 위해서
의 꼴로 표현되므로 직선의 정보(
이므로 다음과 같은 recursion relation을 만족한다:
이를 이용하면 시작 픽셀

void BresenhamLine(int x1, int y1, int x2, int y2, DWORD color) {
int dx = x2 - x1 ;
int incx = 1;
if (dx < 0) {
dx = -dx;
incx = -1;
}
int dy = y2 - y1;
int incy = 1;
if (dy < 0) {
dy = -dy;
incy = -1;
}
setPixel(x1, y1,color);
if (dx > dy) {
int p = (dy << 1) - dx;
while (x1 != x2) {
if (p >= 0) {
y1 += incy;
p -= (dx << 1);
}
x1 += incx;
p += (dy << 1);
setPixel(x1, y1, color);
}
} else {
int p = (dx << 1) - dy;
while (y1 != y2) {
if (p >= 0) {
x1 += incx;
p -= (dy << 1);
}
y1 += incy;
p += (dx << 1);
setPixel(x1, y1, color);
}
}
};
'Computational Geometry' 카테고리의 다른 글
Bezier Curve Approximation of an Ellipse (0) | 2021.04.11 |
---|---|
Bezier Curve Approximation of a Circle (0) | 2021.04.10 |
Rotating Calipers (3) | 2021.03.31 |
Convex Hull Peeling (0) | 2021.03.29 |
Graham Scan (0) | 2021.03.28 |