一:圆的bresenham中点算法
算法输入为圆的半径
function MB_circle( r )
d=1.25-r;
x=0;
y=r;
while(x<y)
plot(x,y,'.b','markersize',10);
axis equal;%将横轴纵轴的定标系数设成相同值
set(gca, 'XMinorGrid','on');%使网格线变得密一些
pause(0.1)
hold on
plot(y,x,'.b','markersize',10);
plot(y,-x,'.b','markersize',10);
plot(x,-y,'.b','markersize',10);
plot(-x,-y,'.b','markersize',10);
plot(-y,-x,'.b','markersize',10);
plot(-y,x,'.b','markersize',10);
plot(-x,y,'.b','markersize',10);
x=x+1;
grid on;
if d<=0
d=d+2*x+3;
else
d=d+2*(x-y)+5;
y=y-1;
end
end
首先将函数保存为.m函数,然后,运行的时候:直接在命令行窗口调用函数就OK。
结果展示:
二:圆的bresenham圆弧算法
算法函数:
算法输入为圆的半径
function bresenham_circle(r)
delta=2*(1-r);
limit=0;
x=0;
y=r;
while(y>=limit)
draw_circle1(x,y);
if(delta<0)
delta1=2*(delta+y)-1;
if (delta1<=1)
direction=1;
else
direction=2;
end
end
if(delta>0)
delta2=2*(delta-x)-1;
if delta2<0
direction=2;
else
direction=3;
end
end
if(delta==0)
direction=2;
end
switch(direction)
case 1
x=x+1;
delta=delta+2*x+1;
case 2
x=x+1;
y=y-1;
delta=delta+2*(x-y+1);
case 3
y=y-1;
delta=delta+(-2*y+1);
end
end
end
其中调用了画圆函数draw_circle1.m,如下:
function draw_circle1(x,y)
plot(x,y,'.b','markersize',10);
hold on;
plot(x,-y,'.b','markersize',10);
plot(-x,-y,'.b','markersize',10);
plot(-x,y,'.b','markersize',10);
axis equal;%将横轴纵轴的定标系数设成相同值
set(gca, 'XMinorGrid','on');%使网格线变得密一些
grid on;
pause(0.1)
end
从中点bresenham算法和bresenham的圆弧算法可以看出,中点算法画圆是8对称画法的,圆弧算法是4对称画法的。
结果展示:
三:椭圆的bresenham中点算法
算法函数:
function MB_elliptical(a,b)
x=a;
y=0;
taa=a*a;
t2aa=2*taa;
t4aa=2*t2aa;
tbb=b*b;
t2bb=2*tbb;
t4bb=2*t2bb;
t2bbx=t2bb*x;
tx=x;
d1=t2bbx*(x-1)+tbb/2+t2aa*(1-tbb);
while(t2bb*tx>t2aa*y)
draw_elliptical(x,y);
if d1<0
y=y+1;
d1=d1+t4aa*y+t2aa;
tx=x-1;
else
x=x-1;
y=y+1;
d1=d1-t4bb*x+t4aa*y+t2aa;
tx=x;
end
end
d2=t2bb*(x*x+1)-t4bb*x+t2aa*(y*y+y-tbb)+taa/2;
while(x>=0)
draw_elliptical(x,y);
if d2<0
x=x-1;
y=y+1;
d2=d2+t4aa*y-t4bb*x+t2bb;
else
x=x-1;
d2=d2-t4bb*x+t2bb;
end
end
注意:椭圆的a>b,所以设定的时候一定要设定a>b的数据(比如:a=50,b=40)