auxInitWindow (\//初始化窗口,设置标题 myinit ();
auxMainLoop(display);
//循环运行display过程,display由用户编写 return(0); }
3、程序说明
每个函数的具体含义在程序注释中已作了叙述,不再多说。
OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如:glColor3f(),字母f指明要使用浮点数。字母前的数字指明参数个数或指明二维还是三维,如:glVertex2f()是要设置二维的点。
OpenGL采用的是状态机的方式,用户设定一种状态,程序照此运行。如:glBegin(GL_LINES)设定画线状态(GL_LINES是OpenGL已定义好的常量),glColor3f()设定绘图所用颜色。 我们关注的是display()函数,它是我们真正绘图的地方。
函数glColor3f()以RGB方式设置颜色,格式为:glColor3f(red, green, blue),每种颜色值在(0.0, 1.0)之间。为了能显示更多的颜色,最好把系统设置成16位真彩色模式。 函数glVertex2f(x, y)设置二维顶点。
main()函数中的几个aux前缀函数是OpenGL提供的辅助库,用以初始化窗口,大家不必深究,
函数glBegin(UINT State)、glEnd()是最基本的作图函数,下面对它作一介绍。 如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:
GL_POINTS
画点
GL_LINES 画线,每两个顶点(Vertex)为一组 GL_LINE_STRIP 画线,把若干个顶点顺次连成折线 GL_LINE_LOOP 画线,把若干个顶点顺次连成封闭折线 GL_TRIANGLES 画三角形,每三个顶点为一组 GL_QUADS 画四边形,每四个顶点为一组 GL_POLYGON
试一试。
程序可以有多组glBegin()、glEnd()并列的形式,如:
... ...
画多边形
还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS_STRIP 等等。大家可以把每一种状态都
glBeing(GL_LINES);
5
......
glEnd();
glBeing(GL_QUADS);
... ...
glEnd(); ... ...
除了上述的基本图元外,函数glRectf(x1, y1, x2, y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。
glColor3f (0.0f, 0.0f, 1.0f); glRectf(10.0f, 10.0f, 50.0f,50.0f);
6
实验二 二维基本图元的生成
一、实验学时 2学时 二、实验类型 设计型实验 三、实验目的和要求
1、掌握二维基本图元直线段生成的DDA算法,中点算法; 2、掌握二维基本图元圆弧生成的中点算法; 3、掌握对线型线宽的属性的控制。 四、实验内容 1、编程实现DDA、中点算法生成直线
2、中点扫描转换生成圆、椭圆 五、建立工程步骤
1、新建一个项目。
选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。
2、为项目添加文件
为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\\program files\\Microsoft Visual Studio\\vc98\\lib目录中。
选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。
点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。
增量法画直线
void CALLBACK dda(void) {
int x1=10; int x2=400; int y1=10; int y2=500; int k,i;
float x, y, dx, dy; k = abs(x2-x1); if (abs(y2-y1)>k) k = abs(y2-y1); dx = (float)(x2-x1)/k; dy = (float)(y2-y1)/k; x = (float)x1; y = (float)y1;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//开始画一根白线
//清除缓存
glBegin(GL_LINES); //设置颜色为白色
//设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角 for(i = 0; i 7 { glVertex2f((int)(x), (int)(y)); glVertex2f((int)(x+dx), (int)(y+0.5+dy)); //g.drawLine((int)(x+.5f), (int)(y+.5f), (int)(x+.5f), (int)(y+.5f)); x = x+dx; y = y+dy; glColor3f (1.0f, 1.0f, 1.0f); } glEnd(); //画线结束 glFlush (); //绘图结束 } //中点法画直线 //void CALLBACK bresenham(Graphics g, int xs, int ys, int xe, int ye) void CALLBACK bresenham(void) { int xs=10; int xe=400; int ys=10; int ye=500; int i; int dx = xe-xs; int dy = ye-ys; int e = 2*dy-dx; int x = xs; int y = ys; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除缓存 glBegin(GL_LINES); //开始画一根白线 glColor3f(1.0f, 1.0f, 1.0f); for( i= 0;i < dx; i++) { glVertex2f((int)(x), (int)(y)); if(e>=0) { y=y+1; e=e-2*dx; } x=x+1; e=e+2*dy; glVertex2f((int)(x), (int)(y)); //画点(x, y) glColor3f (1.0f, 1.0f, 1.0f); } glEnd(); //画线结束 glFlush (); //绘图结束 } 8 //中点法画圆 //void bresenham_arc(Graphics g,int radius) void CALLBACK bresenham_arc(void) { int radius= 200; int x,y,d; x = 0; y = radius; d = 3-2*radius; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除缓存 glBegin(GL_LINES); //开始画一根白线 glColor3f(1.0f, 1.0f, 1.0f); while (x < y) { glVertex2f((int)(x), (int)(y)); if(d<0) d=d+4*x+6; else { d=d+4*(x-y)+10; y--; } x++; glVertex2f((int)(x), (int)(y)); glColor3f (1.0f, 1.0f, 1.0f); } glColor3f (1.0f, 1.0f, 1.0f); if(x == y) { glVertex2f((int)(x), (int)(y)); glVertex2f((int)(x), (int)(y)); } glEnd(); //画线结束 glFlush (); //绘图结束 } // //主过程: // 初始化Windows的窗口界面 // 并初始化OpenGL场景,绘图 int main(int argc, char** argv) { auxInitDisplayMode (AUX_RGB); //初始化显示模式,采用RGB彩色系统。 auxInitPosition (0, 0, 400, 850); //初始化窗口位置、大小 auxInitWindow (\//初始化窗口,设置标题 myinit (); //auxMainLoop(dda); //auxMainLoop(bresenham); 9