基本图元的生成算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本图元的生成算法
一、实验目的1、初步了解显示窗口与视区的关系2、掌握OpengGL点、直线、多边形的绘制3、掌握DDA直线生成算法。4、掌握Bresenham直线生成算法二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。
软件环境:操作系统:Windows XP。语言开发工具:VC6.0。
三、实验内容与要求
1、调出实验一的源代码运行,调整修改使得显示窗口大小改变时,绘制的矩形大小随之改变。如图2-1所示。提示:(1)在main函数里添加注册窗口变化函数glutReshapeFunc(myreshape); (放在glutMainLoop()之前)(2)在程序中添加窗口改变子函数,参数w,h为当前显示窗口的宽和高
void myreshape(GLsizei w, GLsizei h)
{
glViewport(0,0,w,h); //设置视区位置
glMatrixMode(GL_PROJECTION);//设置投影变换模式
glLoadIdentity(); //调单位矩阵,清空当前矩阵堆栈
if(w<=h)
gluOrtho2D(0,300,0,300*(GLfloat)h/(GLfloat)w);
//设置裁剪窗口大小
else
gluOrtho2D(0,300*(GLfloat)w/(GLfloat)h,0,300);
}
a) 显示窗口改变前 b)显示窗口变大后
未修改前的初始源程序参考如下:
/*my first program.cpp*/
#include
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区
glRectf(0,0,0.5,0.5);
glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的
OpenGL命令得到执行
}
void main(int argc, char** argv)
{
glutInit(&argc, argv); //初始化GLUT库
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //设置显示模式 glutInitWindowSize(100, 200);
glutCreateWindow("hello"); //创建窗口,标题为“hello”
glutDisplayFunc(display); //用于绘制当前窗口
glutMainLoop(); //表示开始运行程序,用于程序的结尾
}
2、自己参照讲义或教材按照自己的构思画二维平面图形, 修改样本程序
circle-algorithm.cpp将上面的矩形替换成自己构思的二维平面图形。注意顶点的顺序。
参考函数:
(1)、点绘制举例
glPointSize(2.0) //点的大小设置
glBegin(GL_POINTS);
glColor3f(1.0,1.0,1.0);
glVertex2f(-0.5,-0.5); //顶点
glColor3f(1.0,0.0,1.0);
glVertex2f(-0.5,0.5);
glColor3f(0.0,1.0,1.0);
glVertex2f(0.5,0.5);
glColor3f(1.0,1.0,0.0);
glVertex2f(0.5,-0.5);
glEnd()
(2)、直线/三角形/四边形绘制举例
glLineWidth(2.0);
glBegin(GL_LINES);
// glBegin(GL_LINE_STRIP);
// glBegin(GL_LINE_LOOP);
// glBegin(GL_TRIANGLES);
// glBegin(GL_TRIANGLE_STRIP);
// glBegin(GL_TRIANGLE_FAN);
// glBegin(GL_QUADS);
// glBegin(GL_TRIANGLE_STRIP);
glVertex2f(-0.5,0.5);
glVertex2f(-0.5,-0.5);
glColor3f(1.0,1.0,1.0);
glVertex2f(-0.5,0.5);
glColor3f(1.0,1.0,0.0);
glVertex2f(0.5,-0.5);
glEnd();
(3)、多边形举例
glBegin(GL_POLYGON);
glVertex2f(-0.5,0.5);
glVertex2f(-0.5,-0.5);
glColor3f(1.0,1.0,1.0);
glVertex2f(0,-0.5);
glColor3f(1.0,1.0,0.0);
glVertex2f(0.5,-0.5);
glVertex2f(0.5,0.5);
glEnd();
3、读懂DDA直线生成算法伪代码,并修改伪代码,使之变成可行的OpenGL
代码,验证DDA直线生成算法。
DDA直线生成伪代码
//x0,y0 表示直线的起始点, x1,y1表示直线的终止点,color表示直线的绘制颜色
void DDA_line(int x0, int y0, int x1, int y1,int color)
{
int dx = x1 – x0, dy = y1 – y0, k;
float xIncrement , yIncrement ,steps, x = x0, y = y0;
if (abs (dx) > abs (dy)) steps = abs (dx);
else steps = abs (dy);
xIncrement = (float) (dx) /steps;
yIncrement = (float) (dy) /steps;
for (k =0; k { Setpixel(round(x), round(y),color); x += xIncrement; y += yIncrement; } } 提示: 使用学过的画点函数替换setpixel(round(x), round(y),color)函数。