计算机图形学-基于OpenGL的直线扫描程序
在OpenGL应用框架下实现画线算法,可以用DDA、中点方法或Bresenham算法。集成开发环境采用vs2013。
实验代码-DDA画线算法
#include <GL/glut.h>
#include <math.h>
#include <cstdio>
void init() //初始化函数
{
glClearColor(1.0, 1.0, 1.0, 0.0); //设置背景颜色
}
void DDALine() //DDA画线算法
{
int x0 = 0, y0 = 0, x1 = 5,y1 = 2;
int x;
float dx, dy, y, k;
dx = x1 - x0, dy = y1 - y0;
k = dy / dx, y = y0;
glClear(GL_COLOR_BUFFER_BIT); //清除颜色
glColor3f(1.0, 0.0, 0.0); //设置线条颜色
glPointSize(2); //设置线条大小
glBegin(GL_POINTS);
for (x = x0; x <= x1; x++)
{
GLfloat xi, yi;
//由于坐标系原因,将图像缩小0.1倍
xi = x*0.1;
yi = (int)(y + 0.5)*0.1;
glVertex2f(xi, yi); //开始画点
y = y + k;
}
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("DDA画线算法");
init();
glutDisplayFunc(&DDALine);
glutMainLoop();
return 0;
}
实验代码-Bresenham画线算法
#include <GL/glut.h>
#include <math.h>
#include <cstdio>
void init() //初始化函数
{
glClearColor(1.0, 1.0, 1.0, 0.0); //初始化背景颜色
}
void Bresenhamline() //Bresenham画线算法
{
int x0=0, y0=0, x1=5, y1=2;
int x, y, dx, dy,e;
dx = x1 - x0, dy = y1 - y0, e = -dx;
x = x0, y = y0;
glClear(GL_COLOR_BUFFER_BIT); //清除颜色
glColor3f(0.0, 0.0, 1.0); //线条颜色
glPointSize(2); //线条大小
glBegin(GL_POINTS);
for (int i = 0; i <= dx; i++)
{
//由于坐标系原因将图像缩小0.1倍
GLfloat xx = x*0.1;
GLfloat yy = y*0.1;
glVertex2f(xx, yy); //开始画点
x ++, e = e + 2*dy;
if (e > 0)
{
y++, e = e - 2*dx;
}
}
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("Bresenham画线算法");
init();
glutDisplayFunc(&Bresenhamline);
glutMainLoop();
return 0;
}