当前位置:文档之家› 基本图元的生成算法

基本图元的生成算法

基本图元的生成算法一、实验目的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);//设置裁剪窗口大小elsegluOrtho2D(0,300*(GLfloat)w/(GLfloat)h,0,300);}a) 显示窗口改变前 b)显示窗口变大后未修改前的初始源程序参考如下:/*my first program.cpp*/#include <glut.h>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<steps; k++){Setpixel(round(x), round(y),color);x += xIncrement; y += yIncrement;}}提示:使用学过的画点函数替换setpixel(round(x), round(y),color)函数。

图2-24、读懂Bresenham直线生成算法伪代码,并修改伪代码,使之变成可行的OpenGL代码,验证Bresenham直线生成算法。

要求在函数void Bresenham_Circle_Algorithm(int cx, int cy, int radius)中写出自己的Bresenham画圆法代码。

思考选做:5、DDA算法来绘制N多边形。

用n多边形逼近圆,最小多边形为3角形。

将自己的代码写在函数NSidedPolygon(int n, int cx, int cy,int radius)里,使用DDA算法来绘制N多边形(不要使用OpenGL绘制多边形的函数)。

我们知道OpenGL画点功能为:glBegin(GL_Points);glVertex2f(x,y);glEnd();由于n多边形有n条边,所以必须画n条直线。

将画直线的代码写在函数 DrawLine(int x1, int y1, int x2, int y2)中,考虑n多边形的n条直线是各个方向,即有斜率|k|>=1的情况,又有斜率|k|<1的情况,你可以使用学过的画直线方法,如DDA算法。

阅读样本程序,参见circle-algorithm.cpp:附:样本程序circle-algoritm.cpp#include <glut.h>#include <stdio.h>#include <stdlib.h>#include <math.h>// set some initial parameters, such as the center of the circle(cx,cy), the radius of the circle,int cx=150,cy=150,radius=80;void DDA_Line(int x1,int y1,int x2,int y2);void Bresenham_DrawLine(int x1,int y1,int x2,int y2);void NSidedPolygon(int n, int cx, int cy, int radius);void Display(void);void Reshape(int w, int h);int main(int argc, char** argv){glutInit(&argc, argv);glutInitWindowPosition(0, 0);glutInitWindowSize(window_width, window_height); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutCreateWindow("Circle Generation Algorithm"); glutDisplayFunc(Display);glutReshapeFunc(Reshape);glutMainLoop();return 0;}void Display(void){/* YOUR CODE HERE */glutSwapBuffers();}void Reshape(int w, int h){glMatrixMode(GL_PROJECTION);glLoadIdentity();glViewport(0, 0, w, h);gluOrtho2D(0, w, 0, h);// glutPostRedisplay();}void DDA_Line(int x1,int y1,int x2,int y2);{/* YOUR CODE HERE */}void Bresenham_DrawLine(int x1,int y1,int x2,int y2); {/* YOUR CODE HERE */}void NSidedPolygon(int n, int cx, int cy, int radius) {/* YOUR CODE HERE */}。

相关主题