开发和运行环境
开发和运行环境为visual studio。使用OpenGL开放式图形库,使用的头文件为#include <GL/glut.h>。
算法的设计思想和实现技术
使用实现Bresenham直线光栅化算法,在此对该算法的原理进行阐述。
算法原理:假定直线的斜率k在0~1之间。此时,只需考虑x方向每次递增1个单位,决定y方向每次递增0或1。
设直线的当前点为(xi,y),对应的当前光栅点为(xi,yi),对于直线为k的直线,易知线上下一个点应该为(xi+1,yi+k),则直线的光栅点为(xi+1,yi)或者(xi+1,yi+1)其中yi是否加一取决于直线与它垂直方向最近的下光栅点的误差d,d的计算方法为
其中y+k为直线上xi+1位置对应的纵坐标,yi为xi处对应的纵坐标,如下图所示。
如图易知当d<0.5:下一个象素应取右光栅点(xi+1,yi)
当d≥ 0.5:下一个象素应取右上光栅点(xi+1,yi+1)
如果直线的(起)端点在整数点上,误差项d的初值:d0=0x坐标每增加1,d的值相应递增直线的斜率值k,即:d=d+k。一旦d≥ 1,就把它减去1,保证d的相对性,且在
0-1之间。
令e=d-0.5,关于d的判别式和初值可简化成:
e的初值e0= -0.5,增量亦为k;
e<0时,取当前象素(xi,yi)的右方象素(xi+1,yi);
e>0 时,取当前象素( xi,yi) 的右上方象素(xi+1,yi+1);
e=0时,可任取上、下光栅点显示。
据上,可将Bresenham直线光栅化算法简化概括为:
它引入动态误差e,当x方向每次递增1个单位,可根据e的符号决定y方向每次递增0或1。e<0,y方向不递增,e>0,y方向递增1,x方向每次递增1个单位,e = e + k。
因为e是相对量,所以当e>0时,表明e的计值将进入下一个参考点(上升一个光栅
点),此时须:e = e – 1。此时y将上升到下一个光栅处。
若可搞清楚上述原理,此时即可附上代码了
#include <GL/glut.h>
#include<math.h>
GLfloat pointsize = 1.0f;
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色为黑色
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
gluOrtho2D(0.0, 200.0, 0.0, 200.0);///*设定映射区域,参数为(minX,maxX,minY,maxY),(minX,minY为原点);(maxX, maxY)为右上角的点* /
}
void Bresenham_drawOneLine(GLint xs, GLint ys, GLint xe, GLint ye) {
GLint x = xs;
GLint y = ys;
GLint dx = xe - xs;
GLint dy = ye - ys;
GLfloat k = float(dy / dx);
GLfloat error