利用Bresenham演算法畫圓和直線

2021-10-05 11:21:01 字數 3681 閱讀 5968

利用bresenham演算法,從零開始實現在矩陣中畫圓和直線,效果如下:

close all; clear all; clc

% create image reactangle:

img =

ones

(100

,200);

figure

('name'

,'original image'

)imshow

(img)

% draw line:

help bresenham_line

draw_value =0;

x1 =

80; y1 =20;

x2 =

20; y2 =60;

img =

bresenham_line

(img, x1, y1, x2, y2, draw_value)

;% draw circle:

help bresenham_circle

cx =

50; cy =50;

r =30

;img =

bresenham_circle

(img, cx, cy, r, draw_value)

;figure

('name'

,'after drawn'

)imshow

(img)

在上面**中,我分別寫了畫直線和畫圓的**,其中畫直線函式 「bresenham_line.m」 內容如下:

function [img]

=bresenham_line

(img, x1, y1, x2, y2, value)

%bresenham_line

(img, x1, y1, x2, y2, value)

, 在影象img上以(x1, y1)為起點,

%(x2, y2)為終點畫直線,value表示畫線的畫素值。

dx =

abs(x2 - x1)

;dy =

abs(y2 - y1)

;yy =

0if dx < dy

yy =1;

[x1, y1]

=swap

(x1, y1)

;[x2, y2]

=swap

(x2, y2)

;[dx, dy]

=swap

(dx, dy)

;end

if x2 - x1 >

0 ix =1;

else

ix =-1

;end

if y2 - y1 >

0 iy =1;

else

iy =-1

;end

cx = x1;

cy = y1;

n2dy = dy*2;

n2dydx =

(dy - dx)*2

;d = dy*

2- dx;

if yy ==

1while cx ~

= x2

if d <

0 d = d+ n2dy;

else

cy = cy + iy;

d = d + n2dydx;

endimg

(cy, cx)

= value;

cx = cx + ix;

endelse

while cx ~

= x2

if d <

0 d = d+ n2dy;

else

cy = cy + iy;

d = d + n2dydx;

endimg

(cx, cy)

= value;

cx = cx + ix;

endendend

function [a, b]

=swap

(a, b)

t = a;

a = b;

b = t;

end

畫圓函式 「bresenham_circle」 函式如下:

function [img]

=bresenham_circle

(img, xc, yc, r, value, is_fill)

%bresenham_circle

(img, xc, yc, r, is_fill, value)

, 在影象img上,以(xc,yc)為圓心,

%r為半徑畫圓, is_fill為0

(預設值),表示不填充,否則填充整個圓; value表示畫圓畫素值。

if nargin <

6 is_fill =0;

end[h, w]

=size

(img)

;if xc+r <

0|| xc-r >= w || yc+r <

0|| yc-r >= h

return

;end

x =0

;y = r;

d =3-2

*r;if is_fill ~=0

while x <= y

for yi = x : y

img =

draw_circle

(img, xc, yc, x, yi, value)

; end

if d <

0 d = d +

4*x +6;

else

d = d +4*

(x-y)+10

; y = y-1;

endx = x+1;

endelse

while x <= y

img =

draw_circle

(img, xc, yc, x, y, value)

;if d <

0 d = d +

4*x +6;

else

d = d +4*

(x-y)+10

; y = y-1;

endx = x+1;

endendend

function img =

draw_circle

(img, xc, yc, x, y, value)

img(xc+x, yc+y)

= value;

img(xc-x, yc+y)

= value;

img(xc+x, yc-y)

= value;

img(xc-x, yc-y)

= value;

img(xc+y, yc+x)

= value;

img(xc-y, yc+x)

= value;

img(xc+y, yc-x)

= value;

img(xc-y, yc-x)

= value;

end

注:可在matlab的命令列視窗輸入:help bresenham_line 或 help bresenham_circle 來列印函式使用說明。

參考:

Bresenham演算法畫圓

下面先簡要介紹常用的畫圓演算法 bresenham演算法 然後再具體闡述筆者對該演算法的改進。乙個圓,如果畫出了圓上的某一點,那麼可以利用對稱性計算餘下的七段圓弧 plot x,y plot y,x plot y,x plot x,y plot x,y plot y,x plot y,x plot ...

基於Bresenham演算法畫圓

bresenham演算法畫圓思想與上篇 bresenham演算法畫線段 思想是一致的 畫圓x 2 y 2 r 2 將他分為8個部分,如上圖 1.只要畫出1中1 8圓的圓周,剩下的就可以通過對稱關係畫出這個圓 x變化從0 r 那為什麼不採用從 r r呢,y sqrt r 2 x 2 dy dx x s...

中點Bresenham畫圓

這裡不仔細講原理,只是把我寫的演算法發出來,跟大家分享下,如果有錯誤的話,還請大家告訴我,如果寫的不好,也請指出來,一起討論進步。演算法步驟 1 輸入圓的半徑r。2 計算初始值d 1 r,x 0 y r。3 繪製點 x,y 及其在八分圓中的另外7個對稱點。4 判斷d的符號,若d 0,則先將d更新為d...