Brsenham 直線演算法

2021-07-07 02:50:39 字數 1516 閱讀 8000

1.bresenham演算法的用途

電子裝置上的圖形是畫素化的,也就是說點的座標都是整數,當去繪製一條直線時,取樣點幾乎不可能同時都滿足橫縱座標都是整數,那麼這些點要怎麼去畫,直線要怎麼去畫,bresenham解決的就是如何在這樣的前提下劃線。

2.bresenham原理

取與某點最近的整點代替該點,巨集觀上看是這樣的:

黃色的線是真實的線,而紅色的點是運用bresenham演算法畫出來的點,可能大家會覺得畫出來的不是直線,但從肉眼看就是直線,因為畫素點間的距離太近,根本看不出這種區別,我的電腦螢幕的解析度是1366*768,長40cm左右,當採用這種解析度時,相鄰畫素點距離為40/1366=0.29mm,這是人眼無法分辨的,這樣導致最終畫出來的就是一條直線。

3.bresenham演算法

繪製(x0,y0),到(x1,y1)的直線,假設直線的斜率小於1(這很重要,保證了當x加1,y只有兩種取值),dx=x1-x0,dy=y1-y0,斜率m=(y1-y0)/(x1-x0),直線上有點(x,y+e),實際取點為(x,y),e為誤差,當x變為x+1時,需要判斷真實值y=y+e+m與y+0.5的關係,從而取值

e+m<0.5時,實際取值y=y,

e=e+m;

e+m>0.5時,y=y+1,

e=e+m-1;

為了消除小數,省去m的計算(m是小數也比較麻煩),含e和m的所有的式子乘以dx*2,並記2*e*dx=e,上述式子轉化為:

e+2dye=e+2dy;

e+2dy>dx,y=y+1,

e=e+2dy-2dx。

這樣繼續往下去點,便可把整條直線繪製出來。

對於更一般的直線,當dx或dy是小於零的時候,只需要把對應座標的++,改為--即可,對於|dy/dx|>1的情況,可以把y看成自變數,這樣可確保每次x只有兩個取值。

偽演算法為:

x=x0;

y=y0;

e=0;

plot(x,y);

for x0->x1

if(e+2dy>dx)

y++;

e=e+2dy-2dx;

else

e=e+2dy;

end if;

plot(x,y);

end for;

4.**實現(c++)

void draw_line (int start_x,int start_y,int end_x,int end_y)

else

if(dy>0)

else

dx2=dx<<1;

dy2=dy<<1;

if(dx>dy)

*buffer=0;

}//end index

lpddprimary ->unlock (null);}

else

*buffer=0;

}lpddprimary ->unlock (null);

}//end else

}

畫直線演算法

畫直線演算法 前段時間做了一下光柵直線生成演算法的研究,並且在vc下實現了dda 演算法 bresenham 演算法 對稱演算法 兩步演算法 及四步演算法。這裡給個總結,希望和大家交流。主要研究的演算法主要有 dda演算法 bresenham 演算法 對稱演算法 兩步演算法 及四步演算法,此外還對自...

直線掃瞄演算法

每次想寫點東西的時候,都不知道該寫點什麼,想起來在ai for game developer上看到使用bresenham演算法來做tile地形中的追逐和逃避演算法,正好可以寫點關於直線畫法的東西,這也是計算機圖形學中的基本圖元生成演算法了,還是比較簡單的。很多人都寫過,網上資料也很多,這裡也就不怕再...

直線裁剪演算法

此演算法 就是cyrus beck裁剪演算法 1.判斷dx,dy是否為零作相應的簡單處理,並返回 2.下面通過例子說明第2步的原理,現在先給出原理 如果p1p2與裁剪區域有交點,那麼p1p2與裁剪區域存在交集,使得交集中的任一元素t同時滿足下列不等式 xmin x1 dx t xmax 1 ymin...