**
这次我们要学的是直线的生成算法。
**
简单来说就是画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这过程也称为直线光栅化。
直线光栅化,首先我们要保证三个特点:
-
连续性
-
粗细、亮度要均匀
-
像素逼近待画直线
直线的生成算法
步骤:
先要确定像素序列→确定像素点的坐标
我们先来看看最常见的方法:
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);
}
}
}