我们需要解决的问题:
给定直线两端点A(Xa,Ya),B(Xb,Yb),然后画出这个条直线。
首先介绍一个DDA算法(digital differential analyzer):
△x= xb - xa , △y=yb-ya。
设pi-1(xi-1,yi-1)点在AB直线上,若pi(xi,yi)点也在该直线上,则两直角三角形相似,设比例系数为ε,则小角形横、纵轴长为: εΔx, εΔy。
则pi点的坐标为:
(i=1,2,3,···,n)
下面确定ε的取值 :
根据公式写出直线上第1,2,3,···n,点的坐标,
特别是第n点的坐标,有 :
为使直线的第n点与直线的终点重合,令:
得n*ε=1, 则 ε=1/n,其中n为绘点的个数
但是,合理选择为(考虑到分辨率):
n=max{|△x|,|△y|}
为了逼近理想直线,可以对每点坐标进行四舍五入处理,即:
其中[ ]符号表示取小于括号内的最小整数值。
以下使用matlab画出使用DDA算法得到了直线:
function DDA_plot(x1,y1,x2,y2)
length=abs(x2-x1);
if abs(y2-y1)>length
length=abs(y2-y1);
end
dx=(x2-x1)/length;
dy=(y2-y1)/length;
x=x1+0.5*sign(dx);
y=y1+0.5*sign(dy);
xlist=[];
ylist=[];
xlist(1)=x;
ylist(1)=y;
for i=2:length
x=x+dx;
y=y+dy;
xlist(i)=x;
ylist(i)=y;
end
plot(round(xlist),round(ylist));
得到结果如下:输入(1,1,10,10),画出(1,1)到(10,10)的直线