一、相关定义
- 光栅化(转换):确定最佳逼近图形的像素集合,并指定属性写像素的过程。
- 走样:对图形进行光栅化的过程中,由于屏幕的空间分辨率有限,对于非水平,垂直,正45°的直线,因像素逼近误差,使所画的图形产生畸变的现象。
- 反走样:减少或者消除走样的技术。
- 对图形进行光栅化的过程中,只能在显示器所给定有限个的像素矩阵钟,确定最佳逼近于该直线的一组像素。
二、绘制直线的三个算法
5. 数值微分法(DDA)
(1)原理:知道直线的起点和终点以及斜率k,x向右端加1时,根据直线的斜截式公式y=kx+b计算出y,并四舍五入(round()函数)。
(2)计算量:一个乘法和一个加法,优化计算(3)DDA算法程序
#x的步长是1
void DDALine(int x0, int y0. int x1. int y1, int color)
{
int x;
float dx, dy,y,k;
dx = x1-x0;
dy = y1-y0;
k = dy/dx;
for(x =x0; x<=x1; x++)
{
drawopixel(x, int(y+0.5), color)
y = y+k;
}
}
优点:DDA算法本身是没有误差的,但是由于计算机硬件的原因,最后的y要四舍五入取整就有了偏差。
6. 中点画线法(计算了d值之后再去选取点)
原理:当x0移动一个步长,即x0+1时,计算出y0 和y0+1的终点,将中点坐标((x0+1), (y0+1-y0)/2 )带入直线的一般公式中计算出d值,d大于0选取y0, d小于0选取y0+1;
还可以采用增量算法来计算下个d值,当前的d>=0时,增量是a, 即下个d=d+a;当前的d<0时,增量是a+b,即d=a+b。
- Breshham算法