这学期刚刚接触图形学,发现图形学中涉及到了很多的算法,需要一一调理清楚,因此为了方便自的复习和学习,决定每学一个算法,就写下来,巩固一下学习的成果。
众所周知,屏幕的显示其实就是一个一个像素点,就是一个很大的矩阵,我们在这样的大矩阵中填入颜色信息,就形成了我们看到的图像。
我们这次要画的是直线,就是在给定初始点和终点的情况下,计算出直线上的像素点,然后在这些像素点上填上颜色,把直线画出来。
众所周知,屏幕的显示其实就是一个一个像素点,就是一个很大的矩阵,我们在这样的大矩阵中填入颜色信息,就形成了我们看到的图像。
我们这次要画的是直线,就是在给定初始点和终点的情况下,计算出直线上的像素点,然后在这些像素点上填上颜色,把直线画出来。
我们首先要看的是DDA算法:
如图所示,从起点逐步计算每个相邻点的坐标,具体做法是:
1、计算出最大的位移方向,就是比较 、 的绝对值大小,选择大的方向作为增量方向,该方向上每步增量为1或-1。( , =终点-起点)
2、根据1中的计算结果,我们能够得出在最大位移方向上需要增量多少次,即n=floor(max(,))。则另外一个方向上的增量为 或 (注意,这里是实数的除法,需要保留小数)
3、根据两个方向上的增量,从初始起点开始,画出直线。
在VC++6.0中的源码:
void Line::DrawPic(CDC *pDC)
{
int DeltaX,DeltaY;
int n;
//x、y方向上的增量值
double xinc,yinc;
//计算DeltaX和DeltaY
DeltaX = pe.x-ps.x;
DeltaY = pe.y-ps.y;
//判断哪个方向是最大位移方向
if (abs(DeltaX) > abs(DeltaY))
{
//取出长度
n = abs(DeltaX);
//确定最大位移方向上的增量+1或-1
if(DeltaX > 0)
{xinc=1;}
else
{xinc=-1;}
//计算另一个方向上的增量
yinc =(double) DeltaY / n;
}
else
{
//取出长度
n = abs(DeltaY);
//确定最大位移方向上的增量+1或-1
if(DeltaY > 0)
{yinc=1;}
else
{yinc=-1;}
//计算另一个方向上的增量
xinc =(double) DeltaX / n;
}
//开始画图
double x = ps.x;
double y = ps.y;
for(int i = 0;i < n;++i)
{
//填充像素块
pDC->SetPixel(x,y,RGB(0,0,0));
//每一步增量
x += xinc;
y += yinc;
}
}