Bresenham画直线,任意斜率

  function DrawLineBresenham(x1,y1,x2,y2)
%sort by x,sure x1<x2.
if x1>x2
    tmp=x1;
    x1=x2;
    x2=tmp;
    tmp=y1;
    y1=y2;
    y2=tmp;
end
dx=x2-x1;
dy=y2-y1;
twoDy=2*dy;
twoDy_Dx=2*(dy-dx);
twoDx=2*dx;
twoDx_Dy=2*(dx-dy);
twoDxPlusDy=2*(dx+dy);
%branch 1: k>0 ?
%k>0 <=> dy>0

if dy>0  %k>0
    if dx==0   %if k==INF
        for i=y1:y2
            plot(x1,i,'*');
            hold('on');
        end
        return ;
    end
    %branch 2:k=INF
    
    %branch 3: k<1 <=> dy<dx
    if dy<dx   %k<1
          p=  twoDy-dx;
          plot(x1,y1,'*');
          hold('on');
          while x1<x2
               x1=x1+1;
               if(p<0)
                   p=p+twoDy;
               else
                   y1=y1+1;
                   p=p+twoDy_Dx;
               end
               plot(x1,y1,'*');
               hold('on');
          end
        
    elseif dy>dx  %k>1
          p =dy;
          plot(x1,y1,'*');
          hold('on');
          while y1<y2
              y1=y1+1;
              if p<0
                  p=p+twoDx;
              else
                  x1=x1+1;
                  p=p+twoDx_Dy;
              end
              plot(x1,y1,'*');
              hold('on');
              
          end
        
    
    else          %k==1
        
        for i=x1:x2
            plot(i,y1-x1+i,'*');
             hold('on');
        end
    end      

elseif dy<0  %k<0
    if dx==0   %if k==INF
        for i=y2:y1
            plot(x1,i,'*');
            hold('on');
        end
        return ;
    end
    if dx+dy>0 %-1<k<0
      p=twoDy+dx;
      plot(x1,y1,'*');
      hold('on');
      while x1<x2
         x1=x1+1;
         if p<0
             y1=y1-1;
             p=p+twoDxPlusDy;    
         else
             p=p+twoDy;
         end
         plot(x1,y1,'*');
         hold('on');
      end
    elseif dx+dy<0 %k>-1
        p=twoDx-dy;
        plot(x1,y1,'*');
        hold('on');
        while y1>y2
              y1=y1-1;
              if p<0
                  x=x+1;
                  p=p-twoDxPlusDy;
              else
                  p=p-twoDx;
                 
              end
              plot(x1,y1,'*');
              hold('on');
        end
        
    else %k==-1
        for i=x1:x2
            plot(i,y1+x1-i,'*');
             hold('on');
        end
        
    end
    
    
    

else     %k==0
 
       for i=x1:x2
            plot(i,y1,'*');
            hold('on');
        end
      
    
    
end
 
% y2=flag*y2;
% y1=flag*y1;
% dx=(x2-x1);
% dy=(y2-y1);
% d=[];
% d(1)=2*dy-dx;
% DoubleDy=2*dy;
% DoubleDy_x=2*(dy-dx);
% x=[];
% y=[];
% x(1)=x1;
% y(1)=y1;
% for i=2:10
%     x(i)=x(i-1)+1;
%     if d(i-1)<0
%         d(i)=d(i-1)+DoubleDy;
%         y(i)=y(i-1);
%     else
%         d(i)=d(i-1)+DoubleDy_x;
%         y(i)=y(i-1)+1;
%     end
% end
% grid on
% plot(x,y,'*');
% grid on
% hold on
% k1=(y2-y1)/(x2-x1);
% b=y2-k1*x2;
% x_a=x1:0.1:x2;
% y_a=k1*x_a+b;
% plot(x_a,y_a);
% title('Bresenham画直线算法');
end




原文地址:https://www.cnblogs.com/dengyaolong/p/3697213.html