计算机图形学学习1:直线DDA算法的实现

我们需要解决的问题:

给定直线两端点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)的直线
在这里插入图片描述

发布了65 篇原创文章 · 获赞 29 · 访问量 6490

猜你喜欢

转载自blog.csdn.net/qq_41617848/article/details/104514134