前言
博主目前在學習《計算機圖形學基礎》這本書,使用的是第二版。
此書第五章開始講解基本圖形生成算法。
在5.1.3 Bresenham算法中,如是寫到:
雖然中點Bresenham算法是一種效率非常高的算法,但也還有改進的余地。
而后,開始介紹Bresenham算法。
思考
然而通過學習和理解,博主發現這兩種算法的原理完全相同:
每次在最大位移方向上走一步,而另一個方向上走步還是不走步取決於誤差項的判別。
於是博主產生了疑問:
Bresenham算法真的改進了中點Bresenham算法嗎?
如果是,到底改進了哪里?
分析
博主認為
兩種算法核心均是在尋找最接近實際值的格點
均是以格點的二分之一處為分界線
均是逐位依次掃描
思維以及處理方式不同
所以猜測
這兩種算法等價,並沒有高低之分,更沒有所謂改進
證明
博主在此提供的是證明其編程代碼等價,由此說明兩種算法在效率上是完全一致的。
中點Bresenham
void MidBresenhamLine(int x0, int y0, int x1, int y1) { int dx, dy; int d, UpIncre, DownIncre; int x, y; if(x0 > x1) { x = x1; x1 = x0; x0 = x; y = y1; y1 = y0; y0 = y; } x = x0; y = y0; dx = x1 - x0; dy = y1 - y0; d = dx - 2 * dy; UpIncre = 2 * dx - 2 * dy; DownIncre = -2 * dy; while(x <= x1) { putpixel(x, y);
x++; if(d < 0) { y++; d += UpIncre; } else { d += DownIncre; } } }
Bresenham
void BresenhamLine(int x0, int y0, int x1, int y1) { int dx, dy; int e; int x, y; if(x0 > x1) { x = x1; x1 = x0; x0 = x; y = y1; y1 = y0; y0 = y; } dx = x1 - x0; dy = y1 - y0; x = x0; y = y0; e = -dx; while(x <= x1) { putpixel(x, y);
x++; e = e + 2 * dy; if(e > 0) { y++; e = e - 2 * dx; } } }
兩段代碼在迭代計算x、y的部分:
x++; if(d < 0) { y++; d += UpIncre; } else { d += DownIncre; }
x++; e = e + 2 * dy; if(e > 0) { y++; e = e - 2 * dx; }
令e = –a - 2 * dy ,此時 初始化 a = dx – 2 * dy
后者代入得:
x++; a = a - 2 * dy; if(a < -2 * dy) { y++; a = a + 2 * dx; }
令a = d - 2 * dy , 此時,初始化 d = dx
x++; d = d - 2 * dy; if( d < 0) { y++; d = d + 2 * dx; }
此時,使初始化 d = dx – 2 * dy
代碼塊等價變換得
x++; if( d < 0) { y++; d = d + 2 * dx; } d = d - 2 * dy;
又可變換為
x++; if( d < 0) { y++; d = d + 2 * dx; d = d - 2 * dy; } else { d = d - 2 * dy; }
很容易看出該代碼塊與中點Bresenham算法的核心代碼塊完全等價
x++; if(d < 0) { y++; d += UpIncre; } else { d += DownIncre; }
結論
這兩種算法等價,並沒有高低之分,更沒有所謂改進
