DDA直线算法

**

这次我们要学的是直线的生成算法。

**
简单来说就是画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这过程也称为直线光栅化。

直线光栅化,首先我们要保证三个特点:

  1. 连续性

  2. 粗细、亮度要均匀

  3. 像素逼近待画直线

直线的生成算法
步骤:
先要确定像素序列→确定像素点的坐标

我们先来看看最常见的方法:
DDA算法(数字微分分析式算法)

1、首先设(x1, y1)和(x2, y2)分别为所求直线的起点和终点坐标
然后分别设x的增量和y的增量
dx=(x2-x1)
dy=(y2-y1)

2、dy为y的增量,dx为x的增量,那么直线的斜率m为在这里插入图片描述
然后又因为直线中每一点坐标可由前一点坐标变化一个增量(Dx,Dy),所以我们又可以得到:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、接着,我们要比较x2- x1和y2 - y1,选择其中较大者,作为点前进的方向(假设x2- x1较大)
取该方向上的增量为一个像素单位(Dx=1)
然后利用公式计算另一个方向的增量(Dy=Dx·m=m)。
通过递推公式,把每次计算出的
点
经取整后输出,则可生成直线。

接着我们来看下代码:

#include <graphics.h>      // 就是需要引用这个图形库
#include <conio.h>
void DDA(int x1,int y1,int x2,int y2);
void main()
{
    initgraph(500, 500);   //窗口大小

	DDA(0,0,300,500);

    getch();               // 按任意键继续
    closegraph();          // 关闭图形界面
}

void DDA(int x1,int y1,int x2,int y2)
{
	double m=0.0;

	int dx=x2-x1;
	int dy=y2-y1;
	double x=0.0,y=0.0;
	
	if(dx!=0)
	{
		m=(double)dy/dx;
		if(m<=1)
		{
			y=(double)y1;
			for(x=(double)x1;x<=x2;x++)
			{
				putpixel((int)x,(int)y+0.5,WHITE);
				y+=m;
			}
		}
		else
		{
			x=x1;
			m=1/m;
			for(y=y1;y<=y2;y++)
			{
				putpixel((int)x+0.5,y,WHITE);
				x+=m;
			}
		}
	}
	else
	{
		x=x1;
		for(y=y1;y1<=y2;y++)
		{
			putpixel(x,y,WHITE);
		}
	}
}
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页