y의 증가량 / x의 증가량
이다.d>0이면, 직선 F는 중점 M보다 더 위쪽에 있다는 뜻이므로 NE를 뜻한다
d<0이면, 직선 F는 중점 M보다 더 아래쪽에 있다는 뜻이므로 E를 뜻한다
d=0이면, 직선 F는 정확히 M을 지난다. 따라서 NE와 E 둘 중 아무거나 선택 가능하다.
대신 알고리즘은 일정해야 하므로 다음에 d = 0일때도 똑같은 방식을 적용해야 한다
맨 처음 d값은 시작점 으로 계산한다.
첫 값 기준, 이고, 이는 이다
직선상의 한 점은 무조건 0이 되므로 이다.
이 말은, 첫 값 기준 값은 라는 뜻이다.
만약 가 선택될 경우 다음 의 좌표는 이 되고, 이는 이다
이를 풀어서 계산해보면 이다
즉 가 채택되고 다음 값에 대한 값 증가량은 라는 뜻이다
만약 가 선택될 경우 다음 의 좌표는 이 되고, 이는 이다
이를 풀어서 계산해보면 이다
즉 가 채택되고 다음 값에 대한 값 증가량은 라는 뜻이다
`대화형 레스터 그래픽에서는 처리 속도가 생명이므로 정수형 연산으로만 이루어진 스캔 변환 알고리즘을 구현하는 것이 중요하다. 따라서 알고리즘을 정수형태로 변환하기 쉽게 만들어 주어야한다.
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;
//나눗셈은 오차가 많이 발생함으로 2를 곱해서 없애줌
d =dy*2 - dx; //맨 처음 M값에 대한 d값, 이 값의 절대값은 필요없고 오직 부호만 알면되니 2를 곱해도 상관없음
incrE=dy*2; //E가 채택되고 다음 M값에 대한 d값 증가량
incrNE=(dy-dx)*2; //NE가 채택되고 다음 M값에 대한 d값 증가량
x = x0;
y = y0;
WritePixel(x, y, value); //시작 pixel
while(x<x1) {
if (d <= 0) { //E를 선택한 경우
d += incrE;
x++;
}
else { //NE를 선택한 경우
d += incrNE;
x++;
y++;
}
WritePixel(x, y, value); //선택된 픽셀 그리기
}
}
스캔 변환 방향이 반대방향에서 시작한다면 고려해야할 사항은?
의 기울기는 즉, 1이므로 픽셀들간의 거리가 멀어서 밝기의 불균형이 일어나게 된다.
이는 하드웨어적인 해상도를 높이는 것으로는 해결되지 않는다.