Bresenham快速畫直線演算法

2021-06-14 12:19:58 字數 1539 閱讀 3785

一、

演算法原理簡介:

演算法原理的詳細描述及部分實現可參考:

假設以(x, y)為繪製起點,一般情況下的直觀想法是先求m = dy /dx(即x每增加1, y的增量),然後逐步遞增x, 設新的點為x1 = x + j, 則y1 = round(y + j * m)。可以看到,這個過程涉及大量的浮點運算,效率上是比較低的(特別是在嵌入式應用中,dsp可以一週期內完成2次乘法,一次浮點卻要上百個週期)。

下面,我們來看一下bresenham演算法,如fig. 1,(x, y +ε)的下乙個點為

(x, y +

ε + m)

,這裡ε為累加誤差。可以看出,當ε+m < 0.5時,繪製(x + 1, y)點,否則繪製(x + 1, y + 1)點。每次繪製後,ε將更新為新值:

ε = ε + m ,如果(ε + m)

ε = ε + m – 1, 其他情況

將上述公式都乘以dx, 並將ε*dx用新符號ξ表示,可得

ξ = ξ + dy, 如果2*(ξ + dy) < dx

ξ = ξ + dy – dx, 其他情況

可以看到,此時運算已經全變為整數了。以下為演算法的偽**:

ξ ← 0, y ← y1

for x

← x1 to x2 do

plot point at (x, y)

if (2(

ξ + dy) < dx)

ξ ←ξ + dy

else

y ← y + 1,ξ ←ξ + dy – dx

end if

end for

二、

演算法的注意點:

在實際應用中,我們會發現,當dy > dx

或出現fig.2 右圖情況時時,便得不到想要的結果,這是由於我們只考慮dx > dy,

且x, y的增量均為正的情況所致。經過分析,需要考慮8種不同的情況,如fig. 3所示:

當然,如果直接在演算法中對8種情況分別列舉, 那重複**便會顯得十分臃腫,因此在設計演算法時必須充分考慮上述各種情況的共性,後面將給出考慮了所有情況的實現**。

三、

演算法的實現

以下**的測試是利用opencv 2.0進行的,根據需要,只要稍微修改**便能適應不同環境

void line(point_t p1, point_t p2, color_t c)

} } else

} }}

C語言畫直線 Bresenham方法

數值微分dda digital differential analyzer 演算法 中點畫線演算法 bresenham演算法 來自知乎 char pic 50 50 void show pic printf n void drawline old int x0,int y0,int x1,int y...

直線掃瞄 Bresenham演算法

計算機掃瞄直線原理 直線方程 y kx b y kx b 0 在第一象限畫線 x0,y0 x1,y1 當前點pi xi yi 則下一點必為p1 xi 1,yi 或 p2 xi 1,yi 1 理想直線靠近哪個點,就取那個點。推導 令f x,y y kx b,那麼理想直線上方有f 0,下方f 0.取p1...

Bresenham直線演演算法

法,它會算出一條線段在 n 維光柵上最接近的點。這個演演算法只會用到較為快速的整數加法 減法和位元移位,常用於繪製電腦畫面中的直線。是計算機圖形學中最先發展出來的演演算法。經過少量的延伸之後,原本用來畫直線的演演算法也可用來畫圓。且同樣可用較簡單的算術運算來完成,避免了計算二次方程式或三角函式,或遞...