畫圓是計算機圖形操作中一個非常重要的需求。普通的畫圓算法需要大量的浮點數參與運算,而眾所周知,浮點數的運算速度遠低於整形數。而最終屏幕上影射的像素的坐標均為整形,不可能是連續的線,所以浮點數運算其實純屬浪費。下面介紹的Bresenham算法就是根據上文的原理設計。該算法原應用於直線的繪制,但由於圓的八分對稱性,該算法也適用與圓(曲線圖形)的繪制。
該算法主要是這樣的原理:找出一個1/8的圓弧,用快速的增量計算找出下一個點。同時利用圓的八分對稱性,找出8個點(包括該點),進行繪制。
這里給出示例的SDL代碼實現DrewDemo.zip(Ubuntu 12.04LTS下編譯,Win用戶需要自行在連接時加庫libmingw32)。下面是程序運行時的截圖。程序運行有效時間(即繪制SDL_Texture的時間)在E3 V1230+HD6770的PC上為18ms。
Bresenham實在是一個很快的算法,尤其是在沒有硬件乘法(乘以2為底數的數均可用位運算代替)及除法器的單片機(MPU)上,效率將比浮點模擬畫圖法快上一個數量級。所以這是一個極容易硬件實現的算法。但是該算法也不是萬能的。如上圖可以看出,畫出的圓比較粗糙,不符合人類挑剔的審美。而且在日益強大的性能面前,算法的優化似乎有了些累贅(需要更多的精力查BUG,想代碼),所以沒有特殊需求(密集形繪圖或上文提到的嵌入式繪圖)的同學也沒必要寫這算法了。