光栅图形学之直线段扫描算法(中点画线法之matlab代码)

中点画线法实现直线段扫描算法——MATLAB代码解析
本文介绍了如何使用MATLAB实现中点画线法进行直线段扫描,详细讲解了四种不同斜率情况下的处理方式,并提供了对应的MATLAB代码示例。同时,文中还总结了MATLAB编程的一些特点和注意事项。

说明:本文章系作者学习资料整理,不完善的地方请大家指正,谢谢!

function  midpointline(x0,x1,y0,y1)  

% MIDPOINTLINE函数利用中点画线法进行直线段的扫描。
% MIDPOINTLINE函数根据给定的两个整数点坐标(X0,Y0)和
% (X1,Y1),确定在这两点之间应选取的整数坐标点。
% 输出的是一个画出了各整数点的图像。DY=Y1-Y0;DX=X1-X0;
% 直线方程Y=KX+B,可以化为F(X,Y)=DX*Y-DY*X-B*DX,我们根据% 

点和直线的关系,y的系数必须大于0,可知当F(X,Y)=0,点在% 

直线上;F(X,Y)>0,点在直线上方;F(X,Y)<0,点在直线下方
% ;我们令D0=F(X,Y),通过判断D0的正负,从而判断点和直线的

% 关系。若中点在直线上方,那么就选中点下方的整数点,否则

% 选上方的整数点。
% 对于直线段的扫描算法中点画线法可以分四种情况讨论,当直

% 线斜率0<k<=1时,沿着x轴,x每次增加步长1,y的值根据判断

% ,是否加1;当-1<k<=0沿着x轴,x每次增加步长1,y的值
% 根据判断,是否减1.当斜率k>1和k<=-1时,同理;
% D1和D2是在D0为正或负情况下的增量。 
%我在次讨论的前提是x1>x0


   dx = x1-x0  , dy = y1-y0;
   x=x0 , y=y0;
   axis([0 15 0 15 ]);
   set(gca,'xtick',0:1:15);
   set(gca,'ytick',0:1:15);
   grid on;hold on;
   plot(x,y,'o');
 %第一种情况
   if(dy/dx > 0& dy/dx <= 1)
        d0=dx-2*dy,d1 = -2*dy,d2 = 2*(dx - dy);
        while (x<x1)
           if(d0 >=0)
              x=x+1;d0 = d0+d1;
              elseif(d0 < 0)
              x=x+1;y=y+1;d0=d0+d2;
          end
          hold on;
          plot(x,y,'o');
      end
  end

%第二种情况

   if dy/dx >= -1&dy/dx <= 0

        d0 = -dx - 2*dy, d1 = -2*(dx+dy), d2 = -2*dy;

        while(x < x1)

            if(d0 > 0) 

               x=x+1; y=y-1; d0 =d0+d1;

            elseif(d0 <= 0)
            x=x+1; d0 =d0+d2;
           end

           hold on;
          plot(x,y,'o');
       end
   end
%第三种情况
   if(dy/dx > 1)
      d0 = 2*dx - dy,d1 = 2*(dx - dy), d2=2*dx;
      while (y < y1)
          if(d0 >0) 

              x=x+1;y=y+1;d0 =d0+d1;
         elseif(d0 <= 0)
              y=y+1; d0 =d0+d2;
        end
        hold on;
        plot(x,y,'o');
     end
 end
%第四种情况
  if (dy/dx < -1)
     d0 = -2*dx - dy,d1 = -2*dx, d2 = -2*(dx+dy);
     while (y > y1)
          if(d0 > 0)
             y=y-1;d0 =d0+d1;
         elseif(d0 <= 0)
             y=y-1; x=x+1; d0 =d0+d2;
        end
        hold on;
        plot(x,y,'o');
     end
  end
小结:
(1)在matlab中不用声明数据类型,matlab默认的数据类型是双精度的double类型。
(2)在matlab中不存在++,+=等数学运算符,并且不存在大写字母。
(3)在matlab中if-end,while-end,for-end,switch-end等

控制流语句需要一一严格对应。
(4)在matlab中以%开头的行,称为注释行。
(5)在matlab中生成单元网格的命令可以用:
axis([0 15 0 15 ]);          %建立直角坐标系,并设定最值
set(gca,'xtick',0:1:15);  %设定x轴的水平间隔
set(gca,'ytick',0:1:15);  %设定y轴的水平间隔
grid on;                         %将坐标轴单元格网化
在命令set中,参数gca表示取当前坐标轴,即由命令axis设定的
。xtick表示以指定的间隔划分坐标轴
(6)hold on命令保证图像不重绘,即在已经画过的图像上继续
画。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值