Bresenham高效畫線演算法 (轉)
Bresenham高效畫線演算法
畫線的演算法不少,但要作到高速、簡單並不容易。斜率相乘法是最簡單的方法之一,但計算每個點均要花費不少時間用於乘、除法運算;下面介紹的是Bresenham's高效畫線演算法,對每個點的座標計算只要加、減法就能完成。
簡化演算法用偽Pascal語言描述如下:
procedure DrawLine(x1, y1, x2, y2: Integer);
var
x, y, DeltaX, DeltaY, HalfX, ErrorTerm, i: Integer;
begin
DeltaX := x2 - x1;
DeltaY := y2 - y1;
HalfX := (x2 - x1) shr 1;
ErrorTe:= 0;
x := x1;
y := y1;
for i:=0 to DeltaX do
begin
Plot(X, Y);
Inc(x);
ErrorTerm := ErrorTerm + DeltaY;
if ErrorTerm>HalfX then
begin
ErrorTerm := ErrorTerm - DeltaX;
Inc(y);
end;
end;
end;
為方便閱讀,上述作了簡化。實際程式應略作修正,以分別處理DeltaX與DeltaY比較大小, 必要時起始、結束點等。
修正後的的偽Pascal演算法如下:
procedure DrawLine(x1, y1, x2, y2: Integer);
var
x, y, DeltaX, DeltaY, HalfCount, ErrorTerm, i, Flag: Integer;
begin
DeltaX := x2 - x1;
DeltaY := y2 - y1;
if Abs(DeltaY)
if DeltaX<0 then
begin
i := x1; x1 := x2; x2 := i;
i := y1; y1 := y2; y2 := i;
DeltaX := x2 - x1;
DeltaY := y2 - y1;
end;
if DeltaY<0 then Flag := -1
else Flag := 1;
DeltaY := Abs(DeltaY);
HalfCount := DeltaX shr 1;
ErrorTerm := 0;
x := x1;
y := y1;
for i:=0 to DeltaX do
begin
Plot(X, Y);
Inc(x);
ErrorTerm := ErrorTerm + DeltaY;
if ErrorTerm>HalfCount then
begin
ErrorTerm := ErrorTerm - DeltaX;
y := y + Flag;
end;
end;
end
else
begin
if DeltaY<0 then
begin
i := x1; x1 := x2; x2 := i;
i := y1; y1 := y2; y2 := i;
DeltaX := x2 - x1;
DeltaY := y2 - y1;
end;
if DeltaX<0 then Flag := -1
else Flag := 1;
DeltaX := Abs(DeltaX);
HalfCount := DeltaY shr 1;
ErrorTerm := 0;
x := x1;
y := y1;
for i:=0 to DeltaY do
begin
Plot(X, Y);
Inc(y);
ErrorTerm := ErrorTerm + DeltaX;
if ErrorTerm>HalfCount then
begin
ErrorTerm := ErrorTerm - DeltaY;
x := x + Flag;
end;
end;
end;
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988396/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Bresenham畫線演算法C++演算法C++
- Bresenham畫線演算法(計算機圖形學)演算法計算機
- VC++ Bresenham畫線例項C++
- 【十天自制軟渲染器】DAY 02:畫一條直線(DDA 演算法 & Bresenham’s 演算法)演算法
- 計算機圖形學----DDA、Bresenham直線演算法計算機演算法
- QT 驗證改進後Bresenham演算法QT演算法
- 畫直線的演算法之DDA演算法+程式碼實現(法一)演算法
- 漫畫演算法:輾轉相除法是什麼鬼?演算法
- 實現SLIC演算法生成畫素畫演算法
- 相似人群畫像演算法演算法
- 骰子作畫的演算法演算法
- matlab畫折線圖Matlab
- 學習筆記 詳解一種高效位反轉演算法筆記演算法
- 京東ES支援ZSTD壓縮演算法上線了:高效能,低成本演算法
- 演算法心得:高效演算法的奧祕演算法
- python中使用OpenCV畫線PythonOpenCV
- VC++畫動態曲線C++
- c# winform之繪畫及畫直曲線相關C#ORM
- 畫江湖之演算法篇【排序演算法】快速排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 快速排序演算法排序
- 開發高效演算法之初窺演算法
- 圖片轉繪畫效和繪畫軟體
- Unity3D畫直線、畫點外掛Vectrosity簡介Unity3DROS
- 齊姐漫畫:排序演算法(一)排序演算法
- 漫畫:什麼是LRU演算法?演算法
- 漫畫演算法筆記 最小棧演算法筆記
- canvas小畫板--(1)平滑曲線Canvas
- 使用python pylab庫 畫線Python
- 畫江湖之演算法篇【排序演算法】氣泡排序演算法排序
- 畫江湖之演算法篇【排序演算法】選擇排序演算法排序
- 畫江湖之演算法篇【排序演算法】插入排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 氣泡排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 選擇排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 插入排序演算法排序
- 漫畫:三種 “奇葩” 的排序演算法排序演算法
- 中心橢圓演算法畫圖C++演算法C++
- 漫畫演算法:什麼是 B 樹?演算法
- 漫畫演算法:最小棧的實現演算法