寫這篇文章的原因是因爲發覺網絡上太少關於計算機圖形學算法的資料了,所以我希望從我這次完成計算機圖形學大作業的例子給一些也正在學的人一些小小的幫助,即使不是些很高深的問題,但我更覺得我需要做的是掃盲。當然我寫的也不是教程,只是針對一道題目而討論。
題目:圖元掃描轉換算法改進:實現改進的畫線算法(DDA或Bresenham),使得線段無論從哪個端點開始畫,算法求出的象素點都是相同的(即與方向無關)。 (要求:交算法說明;源程序及詳細註釋;程序輸出每一個象素點座標)另外一個題目可能沒有明確說到但是我們做的時候要按照的規定是:如果開始是起點A,終點B,你的改進算法是應該以B爲起點,A爲終點,但不能在程序中又把A變爲起點,B爲終點。
我手頭上得到的一個Bresenham算法如下:
Bresenham_line(int x1 ,int y1,int x2 ,int y)
{ int dx,dy,s1,s2,temp,interchange=0,p,i;
float x,y;
dx = abs(x2 – x1); dy = abs(y2 – y1);
s1 = sign(x2 – x1); s2 = sign(y2 – y1); /*決定方向*/
x = x1 + 0.5*s1; y = y1 + 0.5*s2;
if(dy > dx){ /*決定m值*/
temp = dx; dx = dy; dy = temp; /*dx爲增長快的邊*/
interchange = 1;} /*在2,3,6,7區間*/
p = 2 * dy – dx;
for( i = 1; i <= dx; i++) {
setPixel(int(x), int(y));
if( p>0 ){
if(interchange)
x = x + s1; /*把xi當成yI */
else
y = y +s2;
p = p – 2 * dx;
}
if(interchange) /*當pi<=0,yi不變*/
y = y + s2; /*把yi當成xi*/
else
x = x + s1;
p = p + 2 * dy;
}/*for*/
}/* Bresenham_line */
因爲Bresenham畫線算法使用了最小的計算量,是最高效的單步畫線算法,所以值得去研究這算法的改進,使得其與畫線方向無關。