알고리즘
2008/09/12 12:00
Anti-aliased 선 긋기 (Xiaolin Wu's line algorithm)
refer to : http://helloktk.tistory.com/entry/Wus-Line-Algorithm
Bresenham 선 긋기 방법은 매우 빠르나 경계선이 드러나서 보기에 좋지 않다. Xiaolin Wu의 안티알리아스 선 긋기를 배워본다.;
이 알고리즘은 한쌍의 픽셀을 연달아 찍어서 선을 그리는 것인데, 반복동작으로 선의 길이만큼 여러 쌍의 픽셀을 그리고 양 끝점을 따로 계산해서 픽셀을 찍는다.
위에서 보는 것처럼 선은 픽셀칸의 중심을 정확하게 지나가는 것이 아니기 때문에, 선분에 영향력을 미치는 2개의 픽셀칸의 밀도를 조절하여 블러가 된 선을 그릴 수 있다. 픽셀 칸의 밀도를 1로 보았을 때, 선분 위에 있는 칸은 1-a 의 농도를 갖고 선분 아래에 있는 칸은 1-b의 농도를 갖으면 된다.
우선 기울기가 1보다 작은 경우만 생각하자. 나머지의 경우는 대칭을 생각하면 쉽게 확장이 가능하다. 이 경우 x 좌표값을 독립변수로 하고, y를 종속변수로 두면, y 값은 일반적으로 실수 값을 갖는다. 이 y 값에 가까운 두 개의 정수 y 값에 해당하는 픽셀에 색을 칠하는데, 이때 농도는 거리의 차이에 반하도록 잡는다.
-> (x, int(y)+1), 명암 = y- int(y)
처음과 끝 점은 좀 더 특별한 처리가 필요하다.
블러링 효과를 주기 위해서 x에 대한 가중치도 더한다. x가 정수값을 취할 경우 50퍼센트의 가중치를 주는 것을 기준으로 하면, x+ 0.5 를 기준으로 이것의 정수값이 벗어나는 정도를 취하면 된다. 그리고 x의 경우는 가장 가까운 정수에서부터 시작한다.
(x,y) -> (int(x + .5), int(y)), 명암 = (1-(y-int(y)))*(1-(x+.5 - int(x+.5)))
-> (int(x + .5), int(y)+1), 명암 = (y-int(y))*(1-(x+.5 - int(x+.5)))
오른쪽 끝 점에서 x의 가중치는 왼쪽의 complement 이므로 x+.5-int(x+.5)로 바꾸어야 한다.

