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
04-30 07:52