现在的位置: 首页 > 综合 > 正文

生成直线的DDA算法

2013年12月10日 ⁄ 综合 ⁄ 共 1383字 ⁄ 字号 评论关闭

数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。

 

一、直线DDA算法描述:

  设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得

= m =直线的斜率 (2-1)

  可通过计算由x方向的增量x引起y的改变来生成直线:

xi+1=xi+x (2-2)
yi+1=yi+y=yi+x·m (2-3)

  也可通过计算由y方向的增量y引起x的改变来生成直线:

yi+1=yi+y (2-4)
xi+1=xi+x=xi+y/m (2-5)

  式(2-2)至(2-5)是递推的。

二、直线DDA算法思想:

  选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(x=1),然后利用式(2-1)计算另一个方向的增量(y=x·m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(xi+1,yi+1)经取整后送到显示器输出,则得到扫描转换后的直线。

  之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。

  另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。

三、直线DDA算法实现:

  1、已知直线的两端点坐标:(x1,y1),(x2,y2)
  2、已知画线的颜色:color
  3、计算两个方向的变化量:dx=x2-x1
               dy=y2-y1
  4、求出两个方向最大变化量的绝对值:
               steps=max(|dx|,|dy|)
  5、计算两个方向的增量(考虑了生成方向):
               xin=dx/steps
               yin=dy/steps
  6、设置初始象素坐标:x=x1,y=y1
  7、用循环实现直线的绘制:
    for(i=1;i<=steps;i++)
    { putpixel(x,y,color);/*在(x,y)处,以color色画点*/
     x=x+xin;
     y=y+yin;
    } 

四、直线DDA算法演示:

        略

五、直线DDA算法特点:

  该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。

 

六、直线DDA算法程序:

  下面给出考虑不同斜率、不同方向直线的DDA画线算法程序:

       

void LineDDA(int x1,int y1,int x2,int y2)
{
	float x, y, dx, dy;
	int steps,i;
	if(abs(x2-x1)>=abs(y2-y1))
	{
		steps = abs(x2-x1);
	}
	else
	{
		steps = abs(y2-y1);
	}

	dx=(float)(x2-x1)/steps;
	dy=(float)(y2-y1)/steps;
	x=(float)(x1);
	y=(float)(y1);
	
    for(i=0;i<=steps; i++)
    {
		glPointSize(2);
		glBegin (GL_POINTS);
		glColor3f (1.0f, 0.0f, 0.0f);
        glVertex2i ((int)(x+0.5),(int)(y+0.5));
		glEnd ();

        x+=dx;
		y+=dy;
    }
}

 

抱歉!评论已关闭.