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...