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