实验一 实现改进Bresenham算法
一、目的
1. 了解直线生成基本原理和常用方法。
2. 掌握改进Bresenham算法的基本原理和步骤。
3. 使用C++、OpenGL编程实现如下内容:输入线段的起始点和终止点坐标位置,利用改进Bresenham算法交互式绘制直线段。
二、实验设备
编程语言:C++、OpenGL
实验环境:已安装相关编程环境的计算机1台。
三、算法原理
基本原理:每次在最大位移方向上走一步,而另一个方向上走还是不走取决于误差项的判断。
步骤:
在0≤k≤1情况下改进的Bresenham算法∶
(1)输入直线的两端点Po(Xo,yo)和P1(X,yi)。
(2)计算初始值△x、^y、e=-4x、X=x、y=yo。
(3)绘制点(x,y)。
(4) e更新为e+2△y
判断e的符号
若e>0,则(x.y)更新为(x+1,y+1),同时将e更新为e-24x;否则(x,y)更新为(x+1,y)。
(5)当直线没有画完时,重复步骤3和4。否则结束。
四、算法实现及结果分析
#include <gl/glut.h>
#include <math.h>
#include<iostream>
using namespace std;
void ProBresenham(int x0, int y0, int x1, int y1) //改进的Bresenham算法
{
int x, y, dx, dy, e;
dx = x1 - x0;
dy = y1 - y0;
e = -dx;
x = x0;
y = y0;
while (x <= x1) {
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
x++;
e = e + 2 * dy;
if (e > 0) {
y++;
e = e - 2 * dx;
}
}
}
void Display() //显示函数
{
int x0, y0, x1, y1;
glClear(GL_COLOR_BUFFER_BIT); //清空颜色堆栈
cout<<"请输入直线起点与终点坐标"<<endl;
cin >> x0 >> y0 >> x1 >> y1;
ProBresenham(x0, y0, x1, y1);//画直线
glFlush(); //清空缓冲区指令
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化显示模式
glutInitWindowSize(600, 600); //设置窗口尺寸
glutInitWindowPosition(200, 100); //设置窗口位置
glutCreateWindow("改进Bresenham算法"); //创建窗口
glutDisplayFunc(Display); //注册显示函数
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置背景颜色,完全不透明
glColor3f(1.0f, 0.0f, 0.0f); //设置画笔颜色
glMatrixMode(GL_PROJECTION); //设置投影
gluOrtho2D(0.0, 600, 0.0, 600); //设置投影区域
glutMainLoop(); //进入程序循环
return 0;