一、实验目的和要求
- 熟悉光栅图形学中的相关直线扫描算法;
- 采用DDA直线扫描算法绘制一条线段,直线由离散点组成;
- 应用OpenGL绘制直线。
二、实验内容
- 选定DDA直线扫描算法;
- 完善相应计算点的算法代码,利用该代码算出直线上所有的点。
- 用OpenGL函数将点连接起来形成直线绘制直线。
三、实验过程及代码
#include <GL/glut.h>
#include <stdlib.h>
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
}
void drawpixel(int x, int y, int z) //此为一个画点的函数
{
glBegin(GL_POINTS);
glViewport(0, 0, 500, 500); //指定在窗口中的位置。0,0为左下角窗口的位置,500,500为宽度和高度
glVertex3d(x, y, 0);
glEnd();
glFlush();
}
void DDALine(int x0, int y0, int x1, int y1)
{
int x;
GLfloat Nx, Ny, y; //x,y的点的个数
int dx, dy, quantity; //dx是x0-x1的x的总增量,dy是y0-y1的y的总增量,quantity为点的数量
float k;
dx = x1 - x0;
dy = y1 - y0;
k = dy / dx;
if (abs(dx) > abs(dy)) //通过绝对值判断谁为先变
{
quantity = abs(dx);
}
else
{
quantity = abs(dy);
}
Nx = (GLfloat)dx / (GLfloat)quantity; //x方向上的单位增量
Ny = (GLfloat)dy / (GLfloat)quantity; //y方向上的单位增量
for (x = x0, y = y0; x <= x1; x++)
{
x = int(x + Nx);
y = y + Ny;
drawpixel(x, int(y + 0.5), 0);
}
}
void display(void) //生成直线的函数
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0); //红色
DDALine(100, 150, 300, 100);
glFlush();
}
void main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow("DDA算法-学号姓名");
init();
glutDisplayFunc(display);
glutMainLoop();
}
四、实验运行结果截图