计算机图形学中所有的绘制算法都是用离散的点尽可能的去逼近理想的图形,本篇为大家介绍常见的几种画线算法。
首先啰嗦一下大家都懂得直线方程,假设有直线:
x的增量,y的增量有这样的关系:
或
DDA(digital differential analyzer)数字微分分析仪算法
设直线的和,这里令,,该算法的思路如下:
若,则x从每次递增1,y从每次递增k,并且对y进行舍入处理(四舍五入或者其他舍入规则),直到x从递增到大于或等于;
若,则y从每次递增1,x从每次递增,并且对x进行舍入处理(四舍五入或者其他舍入规则),直到y从递增到大于或等于;
这样就能确定该直线上每一个点的x和y的像素坐标位置。
对应代码如下(不一定能用,主要体现算法逻辑思想,具体的实现包括细节可以有各种方式):
#include<stdlib.h>
#include<math.h>
inline int round(const float a){return int(a+0.5);}
void lineDDA(int x0,int y0,int x1,int y1)
{
int dx=x1-x0,dy=y1-y0;
int steps;//执行的迭代次数
if(fabs(dx)>fab(dy)) steps=fabs(dx);
else steps=fab(dy);
x_increment=float(dx)/steps;
y_increment=float(dy)/steps;
float x=x0,y=y0;
setPixel(round(x),round(y));
for(int k=0;k<steps;++k)//迭代绘制每个对应的点
{
x+=x_increment;
y+=y_increment;
setPixel(round(x),round(y));
}
}