计算机图形实验二(圆的bresenham中点算法、圆的bresenham圆弧算法,椭圆的中点算法)matlab

本文详细介绍了Bresenham算法在圆和椭圆绘制中的实现过程,包括中点算法和圆弧算法。通过示例代码展示了如何使用该算法进行8对称和4对称的圆点绘制,并提供了椭圆的中点算法,强调了椭圆绘制时a>b的重要性。这些算法在图形处理和计算机图形学中有着广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:圆的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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值