计算机图形实验一(中点画线、bresenham算法、改良的bresenham算法)matlab实现

一:直线的中点算法:

算法函数:DDA2.m

注意:在粘贴代码到matlab的时候,需要点击“保存”,将函数保存为.m文件(到matlab函数库),这样才能直接调用函数。

算法输入为直线的初始点坐标、结束点坐标和点的颜色

 
function DDA2(x1,y1,x2,y2,color)		%DDA算法
    dx=(x2-x1);
    dy=(y2-y1);
    step=max(abs(dx),abs(dy));
    deltax=dx/step;
    deltay=dy/step;
    x=x1;
    y=y1;
    hold on
 % 初始化一个电影矩阵
M = moviein(step);
    for i=1:step
        scatter(round(x),round(y),'.',color)    	  %绘出当前点
        x=x+deltax;                            		  %更新x
        y=y+deltay;                             	  %更新y
       axis equal;%将横轴纵轴的定标系数设成相同值
    % 调用getframe函数生成每个帧
    M(i) = getframe;
    end
   plot([x1,x2],[y1,y2])                       	  %直接绘制原线以对比
    ax1 = gca;
    ax1.XAxisLocation = 'origin';                  %将X坐标轴放在图形的中间
    ax1.YAxisLocation = 'origin';                  %将Y坐标轴放在图形的中间
    grid minor									   %添加网格
    hold off

代码段解释:因为我们老师要求:实验使用动画的形式展示算法的原理,所以在代码中使用了电影矩阵实现,核心代码还是算法的实现,如果需要不含动画的代码,可以参考:

DDA.m

function DDA(x1,y1,x2,y2,color)		%DDA算法
    dx=(x2-x1);
    dy=(y2-y1);
    step=max(abs(dx),abs(dy));
    deltax=dx/step;
    deltay=dy/step;
    x=x1;
    y=y1;
    hold on
    for m=1:step
        scatter(round(x),round(y),'.',color)    	  %绘出当前点
        a(round(x),round(y))=2;
        x=x+deltax;                            		  %更新x
        y=y+deltay;                             	  %更新y
    end
    comet([x1,x2],[y1,y2],0.5)                       	  %直接绘制原线以对比
    ax1 = gca;
    ax1.XAxisLocation = 'origin';
    ax1.YAxisLocation = 'origin';
    grid minor										  %添加网格
    hold off
end

直线的中点算法主函数:

(可以直接将下面的主函数代码粘贴到命令行窗口。直接运行)

(也可以保存为.m文件,这样每次运行的时候就不用再打一次代码了)我保存为了DDA2_main.m

clc
clear;
DDA2(0,0,100,75,'r')	%勾三股四弦五
DDA2(0,0,100,100,'k')%直线是正方形的对角线
DDA2(-10,-9,90,100,'b')%直线起始位置不在源点

注:如果使用的是不含动画的函数DDA,需要将主函数中的DDA2改成DDA

代码实现结果:

二:直线的bresenham算法:

算法函数:

(与DDA.m算法同理,需要将函数保存至matlab函数库中)

function Bresenham(x1,y1,x2,y2,color)		%Bresnham算法
    dx=x2-x1;
    dy=y2-y1;
    k=dy/dx;
    e=-0.5;
    x=x1;
    y=y1;
    hold on
    scatter(x,y,'.',color)
% 初始化一个电影矩阵
    step=dx;
    M = moviein(step);
    for i=1:dx
        scatter(x,y,'.',color)
            x=x+1;
            e=e+k;
        if e>=0
            y=y+1;
            e=e-1;
        end
         axis equal;%将横轴纵轴的定标系数设成相同值
    % 调用getframe函数生成每个帧
       M(i) = getframe;    
    end
    plot([x1,x2],[y1,y2])                       %绘制原线以对比
    ax1 = gca;
    ax1.XAxisLocation = 'origin';                  %将X坐标轴放在图形的中间
    ax1.YAxisLocation = 'origin';                  %将Y坐标轴放在图形的中间
    grid on                                %添加网格 
    hold off
    grid minor

主函数:

clc
clear;
Bresenham(0,0,100,75,'r')	%勾三股四弦五
Bresenham(0,0,100,100,'k')%直线是正方形的对角线
Bresenham(-9,-10,100,80,'b')%直线起始位置不在源点

注意:因为bresenham,需要分成两种情况也就是斜率小于1和斜率大于1,但是上述的函数只实现了斜率小于1的情况(这个也是我实验验收的时候,我才发现的,但是因为我设置的直线的起始点和结束点特殊,所以老师没有发现,嘻嘻,我也懒得改了,如果要改的话也很简单,使用相同的算法思想,只是将x和y互换位置就OK)

结果展示:

三:改良的bresnham算法

算法函数:

function InterBresenham(x1,y1,x2,y2,color)		%改良Bresnham算法
    dx=x2-x1;
    dy=y2-y1;
    e=-dx;
    x=x1;
    y=y1;
    hold on
    scatter(x,y,'.',color)
    for i=0:dx
            x=x+1;
            e=e+2*dy;
        if e>=0
            y=y+1;
            e=e-2*dx;
        end
        scatter(x,y,'.',color)
    end
    plot([x1,x2],[y1,y2])                       %绘制原线以对比
    grid minor
    hold off

主函数:

clc
clear;
InterBresenham(0,0,100,75,'r')	%勾三股四弦五
InterBresenham(0,0,100,100,'k')%直线是正方形的对角线
InterBresenham(-9,-10,100,80,'b')%直线起始位置不在源点

四:每种算法对应的函数

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值