中點bresenham演算法畫線

2021-08-09 06:51:52 字數 1621 閱讀 9058

要求:

使用中點bresenham演算法繪製任意斜率的直線。可用滑鼠左鍵繪製直線(左鍵按下點為起點,彈起點為終點)

新建mfc專案

畫線需要滑鼠響應,所以在view類中新增onlbuttonup和onlbuttondown來進行滑鼠訊息的處理

方法:滑鼠右擊檢視類(如cmymouseview),選擇「add windows message handler…」,彈出事件處理函式列表視窗

從左邊事件訊息列表中選擇「wm_lbuttondown」,然後單擊「add and edit」按鈕,即加入滑鼠左鍵按下事件函式,並要求編輯事件處理程式。

編輯onlbuttonup和onlbuttondown函式

void cmyview::onlbuttondown(uint nflags, cpoint point) 

void cmyview::onlbuttonuponlbuttonup(uint nflags, cpoint point) 

cview::onlbuttonup(nflags, point);

}

在view 類中新建乙個drawline(cdc *pdc, cpoint p0, cpoint p1, colorref clr)函式cpoint型別的p0,p1變數來實現中點bresenham演算法

void cmyview::drawline(cdc *pdc, cpoint p0, cpoint p1, colorref clr)

for(p=p0;p.y

pdc->setpixelv(round(p.x),round(p.y),clr);}}

else

d=1-0.5*k;

for(p=p0;p.y

else

d+=1

; }}

if(0.0

<=k && k<=1.0)

d=0.5-k;

for(p=p0;p.x

else

d-=k;}}

if(k>=-1.0 && k<0.0)

d=-0.5-k;

for(p=p0;p.x

else

d-=k;}}

if(k

d=-1-0.5*k;

for(p=p0;p.y

else

d-=1

; }}}

p0=p1;

}

有幾個注意點:

round函式需要自己實現,但原本函式實現應該是

double

round(double val)

這樣的,但是setpixelv(round(p.x),round(p.y),clr)中前兩個引數都是int型別,而round()返回值是double

因此在開始加#define round(d) int(floor(d+0.5)) 巨集定義即可

Bresenham畫線演算法

bresenham畫線演算法 bresenham演算法是計算機圖形學領域使用最廣泛的直線掃瞄轉換演算法。仍然假定直線斜率在0 1 之間,該方法類似於中點法,由乙個誤差項符號決定下乙個象素點。演算法原理如下 過各行各列象素中心構造一組虛擬網格線。按直線從起點到終點的順序計算直線與各垂直網格線的交點,然...

Bresenham 畫線演算法

bresenham 畫線演算法是由 bresenham 提出的一種精確而有效的光柵線生成演算法,該演算法僅僅使用了 整數的增量來實現的。bresenham 演算法將對整形引數的符號檢測,整形引數的值比於實際險段之間的偏量。bresenham 演算法內容 對於直線方程 y kx b a 0 斜率 1 ...

Bresenham 畫線演算法

bresenham 畫線演算法是由bresenham提出的一種精確而有效的光柵線生成演算法,該演算法僅僅使用了 整數的增量來實現的。bresenham演算法將對整形引數的符號檢測,整形引數的值比於實際險段之間的偏量。bresenham演算法內容 對於直線方程 y kx b a,0 斜率 1 時候的演...