-
2D 직선 그리는 방법3D Graphics/Software Rendering 2007. 3. 26. 15:50728x90
두점 (x1,y1), (x2,y2)를 잇는 직선을 그릴때 다음과 같은 방법을 사용합니다.
첫번째로 간단하게 직선의 기울기를 이용해 그리는 방법입니다.
직선의 기울기는 (y2-y1) / float(x2-x1)으로 구합니다. 이때 분모가 음수가 되면 안되기에
x1과 x2를 비교해서 큰값이 x2에 들어가도록 스왑해야 합니다..
이런게 저장한 기울기를 저장하고...
int gradient = (y2-y1) / float(x2-x1);
x값이 1증가할때 y값을 구해서 그려나가면 됩니다.
int i, y;
y = y1;
for (i=x1; i< x2; i++)
{
y+=gradient*i;
PutPixel(i,y,color); //화면에 점을 찍는 함수.
}
다음은 완성되 라인 함수입니다. 클리핑 처리는 하지 않았네요.
void Line(int x1, int y1, int x2, int y2, BYTE color)
{
int i,temp,y;
float gradient;if (x2 > x1)
{
temp = x1;
x1 = x2;
x2 = temp;temp = y1;
y1 = y2;
y2 = temp;
}gradient = (float)((y2-y1) / float(x2-x1));
for (i=x1; i< x2; i++)
{
y+=gradient*i;
PutPixel(i,y,color);
}
}
위 방법에는 문제점이 있는데 실수를 정수형으로 변환하는데는 생각보다 많은 연산이
일어난다는 겁니다. 이걸 조금더 개선한 나머지를 이용한 알고리즘이 있습니다.
for (i=x1; i< x2; i++)
{
y += y%i;
PutPixel(i,y,color);
}
실수 연산대신 정수의 나머지 연산를 사용하게 보이시죠?? 이렇게하면 상당히 속도를 개선시
킬수가 있습니다~^^
그외에도 정수 연산만으로 직선을 그리기위해 브로즈넴 알고리즘과 중점(Mid point)알고리즘
이라는게 있습니다. 이에 대해서는 시간이 되는데로 다시 다루도록 할께요~^^'3D Graphics > Software Rendering' 카테고리의 다른 글
Proejection matrix (0) 2007.05.09 정점배열과 인덱스 배열로 삼각형 그리기 (0) 2007.04.11 Bresenham Algorithm을 이용한 직선 긋기 (0) 2007.04.11 3D 프로그래밍 - 3월 28일 (0) 2007.03.28