当前位置:文档之家› 计算机图形学实验代码及截图

计算机图形学实验代码及截图

目录

实验一:OpenGL基础知识 0

实验二 OpenGL中的建模与变换 (1)

实验三 OpenGL中的光照 (4)

实验四 OpenGL中的拾取 (7)

实验五 OpenGL中的纹理映射 (10)

实验一:OpenGL基础知识

一、实验目的

1、建立Windows系统下的OpenGL实验框架。

2、学习理解OpenGL工作流程。

二、实验环境

⒈硬件:每个学生需配备计算机一台。

⒉软件:Visual C++;

三、实验内容

1、建立非控制台的Windows程序框架。

2、建立OpenGL框架。

3、建立OpenGL框架的类文件。

4、完善Windows框架。

5、理解程序间的相互关系。

四、实验要求

1、学习教材第2章的内容。

2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。

3、运行结果应该与教材中的相关实例相符。

4、编译第2章的框架代码,修改背景色、窗口标题。

五、程序设计提示

(略)

六、报告要求

1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。

2.报告中应书写主要源程序,且源程序中要有注释。

3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。

4.报告最后包含实验总结和体会。

实验二 OpenGL中的建模与变换

一、实验目的

1.学习配置OpenGL环境。

2.掌握在OpenGL中指定几何模型的方法。

3. 掌握OpenGL中的透视投影和正投影的设置方法,学会诊断投影问题导致的显示异常。

二、实验环境

⒈ 硬件:每个学生需配备计算机一台。

⒉ 软件:Visual C++;

三、实验内容

1.建立OpenGL编程环境

(注:Windows自带gl和glu,还需要安装glut库文件。)

(a)查看Windows自带的OpenGL文件。在文件夹c:\windows\system32下查看是否存在文件opengl32.dll和glu32.dll;在Visual Studio的安装目录Vc7\PlatformSDK\Include\gl下查看是否存在gl.h和glu.h;在Vc7\PlatformSDK\Lib 下是否存在opengl32.lib和glu32.lib。

(b)安装glut库。将文件glut.h复制到Visual Studio的安装目录Vc7\PlatformSDK\Include\gl下;将文件glut32.lib复制到Vc7\PlatformSDK\Lib下;将文件glut32.dll复制到c:\windows\system32下。

2.OpenGL几何建模

(a)建立基本的几何图元,指定图元的颜色,对图元进行平移、旋转、缩放变换。基本几何图元包括:

GL_LINES(线)、GL_LINE_STRIP(线带)、GL_LINE_LOOP(线环)、GL_TRIANGLES(三角形)、GL_TRIANGLE_STRIP(三角形带)、GL_TRIANGLE_FAN(三角形扇)、GL_QUADS(四边形)、GL_QUAD_STRIP (四边形带)、GL_POLYGON(多边形)。

(b) 设置合适的投影参数,分别用透视投影和正投影显示步骤(a)中指定的几何图元。

(c) 每按下鼠标左键一次,模型向右旋转一定角度。

(d) 按下ESC键,退出程序。

四、程序设计提示

1. main函数

功能:创建窗口;注册回调函数;主循环。

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow(”OpenGL中的建模与变换”);

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyboard);

glutMouseFunc(mouseFunc);

glutMainLoop();

return 0;

}

2. 初始化函数:

功能:设置清除所用的颜色;指定着色模型。

void init(void)

{

}

3. 键盘响应函数:

功能:按下ESC键时退出程序。

void keyboard(unsigned char key, int x, int y)

{

}

4. 鼠标响应函数

功能:按下鼠标左键时,改变旋转角度(或平移量、缩放系数)。

void mouseFunc(int button, int state, int x, int y)

{

}

5. 显示函数:

功能:指定几何模型;指定颜色;进行模型变换。

void display(void)

{

//清除颜色缓存

//指定颜色

//模型变换

//指定模型

//马上执行

}

6. reshape函数

功能:设置视口;窗口大小改变时,改变视域体,使窗口的宽高比与视域体的宽高比保持一致。

void reshape (int w, int h)

{

}

7. 包含头文件,定义全局变量

#include

#include

GLdouble angle = 0.0;

GLdouble translation = 0.0;

GLdouble scale = 1.0;

五、思考题

1.在reshape函数中,窗口改变时如果不同时改变视域体的宽高比,会产生什么效果?

2.近裁剪面与物体相交时,会产生什么效果?

六、报告要求

1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。

2.报告中应书写主要源程序,且源程序中要有注释。

3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。

4.报告最后包含实验总结和体会。

实验三 OpenGL中的光照

一、实验目的

1.理解光照模型。

2.掌握OpenGL中的光照编程方法。

3. 学会诊断OpenGL中的光照效果异常。

二、实验环境

⒈ 硬件:每个学生需配备计算机一台。

⒉ 软件:Windows操作系统+Visual C++;

三、实验内容

1.建模

利用glut函数指定两个球体模型,它们一左一右并列放置在原点两侧,设置合适的视域体进行观察。

2.定义光源属性

定义两个光源,分别设置它们的环境光、漫反射光和镜面反射光分量,设置两个光源的位置分别位于左侧球体的左前方和右侧球体的右前方;左侧的光源为红色,右侧的光源为绿色。

3. 定义球体的材质

4. 显示球体时,让左边的光源只照亮左边的球体,右边的光源只照亮右边的球体。

5. 按下ESC键,退出程序。

四、程序设计提示

1. main函数

功能:创建窗口;注册回调函数;主循环。

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow (“OpenG L中的光照”);

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyboard);

glutMainLoop();

return 0;

}

2. 初始化函数:

功能:设置清除所用的颜色;指定着色模型;设置材质;初始化光源参数;打开光照;打开深度测试。

void init(void)

{

}

3. 键盘响应函数:

功能:按下ESC键时退出程序。

void keyboard(unsigned char key, int x, int y)

{

}

4.显示函数:

功能:指定几何模型;指定颜色;进行模型变换。

void display(void)

{

//清除颜色缓存

//打开灯光0,关闭灯光1

//向左平移

//指定左侧球体

//打开灯光1,关闭灯光0

//向右平移

//指定右侧球体

//马上执行

}

5. reshape函数

功能:设置视口;窗口大小改变时,改变视域体,使窗口的宽高比与视域体的宽高比保持一致。

void reshape (int w, int h)

{

}

6. 包含头文件

#include

#include

五、思考题

1.若定义三个光源,光源0和光源1照在左侧球体上,光源1和光源2照在右侧球体上,如何实现?

2.在OpenGL中,要使光照效果正常,需要指定模型的法向量。在本实验中利用glut函数显示球体时,没有指定球体的法向量,你在实验中是否得到了正确的光照效果?请分析原因。

六、报告要求

1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。

2.报告中应书写主要源程序,且源程序中要有注释。

3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。

4.报告最后包含实验总结和体会。

实验四 OpenGL中的拾取

一、实验目的

1.理解OpenGL中的交互式编程方法。

2.掌握OpenGL中拾取的实现。

二、实验环境

⒈ 硬件:每个学生需配备计算机一台。

⒉ 软件:Windows操作系统+Visual C++。

三、实验内容

1.建模

利用glut函数定义两个球体模型,它们一左一右并列放置在原点两侧,设置合适的视域体进行观察。

2.拾取

将拾取函数作为鼠标响应的回调函数。在拾取函数中,建立拾取矩阵,在鼠标附近3×3的区域内选择对象,在鼠标左键按下时,判断哪一个球体被选中,还是都未被选中,并将选择缓存中的内容打印到屏幕上。

3. 设置颜色

左边球体未被选中时显示为红色,右边球体未被选中时显示为绿色,当其中任意一个被选中时,则以白色显示被选中的球体。

4. 按下ESC键,退出程序。

四、程序设计提示

1. main函数

功能:创建窗口;注册回调函数;主循环。

int main(int argc, char **argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow(“OpenGL中的拾取”);

init();

glutReshapeFunc(reshape);

glutDisplayFunc(display);

glutMouseFunc(pickRects);

glutKeyboardFunc(keyboard);

glutMainLoop();

return 0;

}

2. 初始化函数:

功能:设置清除所用的颜色;打开深度测试;指定着色模型。

void init(void)

{

}

3.鼠标响应函数

功能:按下鼠标左键时,在鼠标附近3×3的区域内进行拾取。如果选中左边的球体则select = 1,如果选中右边的球体则令select = 2,如果两个球体都未被选中,则select = 0。

void pickRects (int button, int state, int x, int y)

{

}

4. 显示函数:

功能:指定几何模型;指定颜色;如果当前处于“选择模式”,则设置合适的名称栈。

void display(void)

{

}

5. reshape函数

功能:设置视口;设置视域体。

void reshape (int w, int h)

{

}

6. 键盘响应函数

功能:按下ESC键时退出程序。

void keyboard(unsigned char key, int x, int y)

{

}

7. 包含头文件,定义全局变量

#include

#include

#include

Glint select = 0;

其中select用来标记选中哪一个物体,选中左边的球体时select = 1,选中右边的球体时select = 2,当两者都未被选中时select = 0。

五、思考题

1.如果在拾取时有多个物体被选中,怎样判断哪个物体处于最上面?

2.一个命中记录中的最小和最大深度值代表什么意义,怎样取出它们的值?

六、报告要求

1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。

2.报告中应书写主要源程序,且源程序中要有注释。

3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。

4.报告最后包含实验总结和体会。

实验五 OpenGL中的纹理映射

一、实验目的

1.理解纹理映射的基本原理。

2.掌握OpenGL中定义纹理映射的方法。

3. 学会诊断OpenGL中的纹理映射出现的异常。

二、实验环境

⒈ 硬件:每个学生需配备计算机一台。

⒉ 软件:Windows操作系统+Visual C++;

三、实验内容

1.构造栅格图像

建立一幅64×64像素的RGBA模式的图像,将R、G、B、A四个分量的值保存在一个64×64×4的三维数组里,其中A为α通道,图像如图1所示。

图1 图2

2.建模

利用glBegin(GL_QUADS)函数定义两个矩形,一左一右放置,并设置合适的视域体进行观察。

3. 将步骤1所生成的图像作为纹理,映射到步骤2所定义的两个矩形上,指定合适的纹理坐标,使得左边的矩形绘制得到的图像与图1一致,右边的矩形绘制结果如图2所示。

4. 按下ESC键,退出程序。

四、程序设计提示

1. main函数

功能:创建窗口;注册回调函数;主循环。

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize(500, 500);

glutInitWindowPosition(100, 100);

glutCreateWindow("OpenGL中的纹理映射");

init();

glutReshapeFunc(reshape);

glutDisplayFunc(display);

glutKeyboardFunc (keyboard);

glutMainLoop();

return 0;

}

2. 初始化函数:

功能:设置清除所用的颜色;指定着色模型;打开深度测试;构造栅格图像;创建纹理;打开纹理映射。

void init(void)

{

}

3. 键盘响应函数:

功能:按下ESC键时退出程序。

void keyboard(unsigned char key, int x, int y)

{

}

4. 显示函数:

功能:定义几何模型;绑定纹理;指定纹理坐标和几何坐标。

void display(void)

{

//清除颜色缓存和深度缓存

//绑定纹理

//指定模型顶点的纹理坐标和几何坐标

//马上执行

}

6. reshape函数

功能:设置视口;窗口大小改变时,改变视域体,使窗口的宽高比与视域体的宽高比保持一致。

void reshape (int w, int h)

{

}

7. 包含头文件,定义全局变量

#define ImageWidth 64

#define ImageHeight 64

static GLubyte Image[ImageHeight][ImageWidth][4];

static GLuint texName;

其中,ImageWidth为图像宽度,ImageHeight 为图像高度,Image为图像数据,texName为纹理名称。

五、思考题

如何给不同的物体映射不同的纹理图像?

六、报告要求

1.认真书写实验报告,字迹清晰,格式规范。报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。

2.报告中应书写主要源程序,且源程序中要有注释。

3.报告中应包含运行结果及结果分析。如调试通过并得到预期的效果,请注明‘通过’并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。

4.报告最后包含实验总结和体会。

实验2:

代码:#include

#include

GLdouble angle = 10.0;

void display()

{

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glBegin(GL_POLYGON);

glVertex2d(-0.5,-0.5);

glVertex2d(-0.5,0.5);

glVertex2d(0.5,0.5);

glVertex2d(0.5,-0.5);

glEnd();

glFlush();

}

void mouseFunc(int button,int state,int x,int y)

{

//旋转

if(state==GLUT_DOWN && button==GLUT_LEFT_BUTTON)

{

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

if(angle<360)

angle+=10;

else

angle-=360;

glRotatef(angle,1,1,2);

glutPostRedisplay();

}

}

void keyboard(unsigned char key,int x,int y)

{

if(key==27)

{

exit(-1);

}

}

void init()

{

glClearColor(0.0,0.0,0.0,0.0);

glColor3f(1.0,0.0,0.0);

}

void reshape(int w,int h)

{

glViewport(0,0,w,h);

}

int main(int argc,char **argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow("OpenGL中的建模与变换");

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyboard);

glutMouseFunc(mouseFunc);

glutMainLoop();

return 0;

}

截图:

点击旋转:

体会:

主要是我们在进行变换的时候,要注意glMatrixMode的设置,在进行投影变换的时候要设置为GL_PROJECTION,而当图形变换的时候要设置为GL_MODELVIEW模式。

实验3:

代码:

#include

#include

void display()

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glColor3f(1.0,1.0,1.0);

glEnable(GL_LIGHT0);

glDisable(GL_LIGHT1);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(-0.5,0,0);

glutSolidSphere(0.3,20,22);

glLoadIdentity();

glDisable(GL_LIGHT0);

glEnable(GL_LIGHT1);

glTranslatef(0.5,0,0);

glutSolidSphere(0.3,20,22);

glutSwapBuffers();

}

void keyboard(unsigned char key,int x,int y)

{

if(key==27)

{

exit(-1);

}

}

void init()

{

glClearColor(0.0,0.0,0.0,0.0);

GLfloat position0[4]={-10,10,-10,1};

GLfloat ambient0[4]={1,0,0,1};

glLightfv(GL_LIGHT0,GL_POSITION,position0);

glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);

GLfloat position1[4]={10,10,-10,1};

GLfloat ambient1[4]={0,1,0,1};

glLightfv(GL_LIGHT1,GL_POSITION,position1);

glLightfv(GL_LIGHT1,GL_AMBIENT,ambient1);

glEnable(GL_LIGHTING);

glEnable(GL_DEPTH_TEST);

}

void reshape(int w,int h)

{

glViewport(0,0,w,h);

}

int main(int argc,char **argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow("OpenGL中的光照");

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyboard);

glutMainLoop();

return 0;

}

截图:

体会:不知道为什么,右边的球体好像没有左边的光线效果,这点查询了很久还是不明白。

实验4:

#include

#include

#include

using namespace std;

GLint select = 0;

void drawObjects(GLenum mode)

{

if(mode == GL_SELECT)//绘制红色的小球

glPushName(1);

计算机图形学实验指导书(vc++版)

实验指导书 刘文涛 2013

目录 第一章图形学实验环境和要求 (4) 1.1 VC++实验环境 (4) 1.1.1 基本环境 (4) 1.1.1 开发图形程序的一般流程 (7) 1.1.3 基本绘图函数介绍 (11) 1.2 OpenGL (22) 1.2.1 OpenGL介绍 (22) 1.2.2 OpenGL开发环境 (24) 1.2.3 OpenGL函数 (24) 1.2.4 回调函数 (25) 1.2.4 一个典型OpenGL例程 (26) 1.3 实验要求 (29) 1.3.1 实验内容 (29) 1.3.2 实验方法 (29) 1.3.3 实验效果 (30) 第二章直线生成算法 (30) 2.1 实验原理 (30) 2.1.1 DDA算法 (30) 2.1.2 Bresenham算法 (30) 2.2 实验内容 (30) 2.3 参考示例程序 (30) 第三章圆和椭圆生成算法 (32) 3.1 实验原理 (32) 3.2 实验内容 (32) 3.3 参考示例程序1 (32) 3.4 参考示例程序2 (33) 第四章裁剪算法 (35) 4.1 实验原理 (35) 4.2 实验内容 (35) 4.3 示例程序 (35) 4.3.1 参考例子1 (35) 4.3.2参考例子2 (38) 第五章二维变换 (40) 5.1 实验原理 (40) 5.2 实验内容 (40) 5.3 示例程序 (40) 5.3.1参考例子1 (40) 第六章三维变换 (44)

6.1 实验原理: (44) 6.2 实验内容 (45) 6.3示例程序 (45) 第七章填充算法 (47) 7.1 实验原理: (47) 7.2 实验内容 (47) 7.3示例程序 (47) 第八章曲线曲面 (50) 8.1 实验原理 (50) 8.2 实验内容 (50) 8.3示例程序 (51) 8.3.1 参考例子(1) (51) 8.3.2 参考例子(2) (52) 8.3.3 参考例子(3) (54) 8.3.4 参考例子(4) (56) 第九章真实感图形绘制 (59) 9.1 实验原理 (59) 9.2 实验内容 (59) 9.3示例程序 (59) 9.3.1参考例子(1) (59) 9.3.2参考例子(2) (61) 9.3.3参考例子(3) (63) 第十章动画 (66) 10.1 实验原理 (66) 10.2 实验内容 (66) 10.3示例程序 (66) 10.3.1 参考例子 (66) 参考文献: (72)

计算机图形学实验报告

计算机图形学 实验报告 学号: 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++6.0。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。 (5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。 图1-2 信息程序基本 3.编辑菜单资源

计算机图形学实验

实验三 MFC画直线 最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮 助 第一步:构建MFC窗体 打开Visual C++ 6.0编译器新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC 窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。 第二步:编辑菜单项 选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目属性”对话框。ID:ID_DRAW_LINE;标明: DrawLine(&D),其它的为缺省。 第三步:建立消息命令 如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。 通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function…”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。 第四步:添加鼠标消息响应 打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、 WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。 第五步:添加响应代码 首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag; POINT m_pPrev; POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应 处添加如下代码: //建立好绘图的设备环境 CClientDC dc(this); OnPrepareDC(&dc);

计算机图形学实验三

太原工业学院实验报告

GetClientRect(&rect);//获得客户区的大小 pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系 pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围 pDC->SetViewportExt(rect.Width(),-rect.Height());//设置视区范围,x轴水平向右,y轴垂直向上 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//客户区中心为原点 CDC memDC;//内存DC CBitmap NewBitmap,*pOldBitmap;//内存中承载的临时位图 memDC.CreateCompatibleDC(pDC);//创建一个与显示pDC兼容的内存memDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 pOldBitmap=memDC.SelectObject(&NewBitmap);//将兼容位图选入memDC memDC.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,否则是黑色 memDC.SetMapMode(MM_ANISOTROPIC);//memDC自定义坐标系memDC.SetWindowExt(rect.Width(),rect.Height()); memDC.SetViewportExt(rect.Width(),-rect.Height()); memDC.SetViewportOrg(rect.Width()/2,rect.Height()/2); rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); DrawWindowRect(&memDC);//绘制窗口 if(PtCount>=1) { memDC.MoveTo(Round(P[0].x),Round(P[0].y)); memDC.LineTo(Round(P[1].x),Round(P[1].y)); } pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存memDC中的位图拷贝到显示pDC中 memDC.SelectObject(pOldBitmap);//恢复位图 NewBitmap.DeleteObject();//删除位图 } (2)绘制裁剪窗口 void CTestView::DrawWindowRect(CDC* pDC)//绘制裁剪窗口 { // TODO: Add your message handler code here and/or call default pDC->SetTextColor(RGB(128,0,255)); pDC->TextOut(-10,Wyt+20,CString("窗口")); CPen NewPen3,*pOldPen3;//定义3个像素宽度的画笔 NewPen3.CreatePen(PS_SOLID,3,RGB(255,128,0)); pOldPen3=pDC->SelectObject(&NewPen3); pDC->Rectangle(Wxl,Wyt,Wxr,Wyb); pDC->SelectObject(pOldPen3); NewPen3.DeleteObject(); }

计算机图形学OpenGL版实验1-4

实验1 OpenGL初识 一、实验目的: 熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。 二、实验内容: (1)了解和使用VC的开发环境,理解简单的OpenGL程序结构。 (2)掌握OpenGL提供的基本图形函数,尤其是生成点的函数。 三、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点,如图所示。下面对各行语句进行说明: 首先,需要包含头文件#include ,这是GLUT的头文件。 然后看main函数。int main(int argc, char *argv[]),这个是带命令行参数的main函数。这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍; 1)glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较固定,一般都是glutInit(&argc, argv)就行; 2) glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。更多信息,以后的实验教程会有讲解介绍; 3) glutInitWindowPosition,设置窗口在屏幕中的位置; 4) glutInitWindowSize,设置窗口的大小; 5) glutCreateWindow,根据前述设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口; 6) glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。(暂且这样理解); 7) glutMainLoop,进行一个消息循环。(现在只需知道这个函数可以显示窗口,并且等待窗口关闭后才会返回。) 在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用myDisplay 函数”。于是myDisplay函数就用来画图。观察myDisplay中的三个函数调用,发现它们都以gl开头。这种以gl开头的函数都是OpenGL的标准函数,下面对用到的函数进行介绍: 1) glClearColor(0.0, 0.0, 0.0, 0.0) :将清空颜色设为黑色(为什么会有四个参数?); 2) glClear(GL_COLOR_BUFFER_BIT):将窗口的背景设置为当前清空颜色; 3) glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标; 4) glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。 四、实验代码: # include void mydisplay(void)

计算机图形学实验报告及代码

计算机图形学实验报告及代码 第 1 章概述 一、教学目标 通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。 二、教学要求 1.了解计算机图形学的概念和研究内容; 2.了解本门课程的发展概况。 三、教学内容提要 1. 计算机图形学的研究内容 2. 计算机图形学发展概况 3. 计算机图形学特点和应用 4. 计算机图形学当前研究的课题 5. 计算机图形生成和输出的流水线 四、教学重点、难点及解决方法 本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。 五、课时安排 2学时 六、教学设备 多媒体 七、检测教学目标实现程度的具体措施和要求 通过课堂提问的方式来检测学生对基本概念的掌握程度。 八、教学内容 1.1 计算机图形学的研究内容 计算机图形学(Computer Graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。 计算机图形表现形式 (1).线条式(线框架图)

用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。 (2).真实感面模型图形 跑车靓照 计算机图形分类(空间) (1).二维图形(2D):在平面坐标系中定义的图形 (2).三维图形(3D):在三维坐标系中定义的图形 计算机图形产生方法 (1).矢量法(短折线法) 任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。 (2).描点法(像素点串接法) 每一曲线都是由一定大小的像素点组成 计算机绘图方式: (1)交互式绘图 允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。如AUTOCAD等 (2)被动式绘图 图形在生成过程中,操作者无法对图形进行操作和控制。如C语言绘图 图形的操作与处理方法(Picture Manipulation) 如图形的开窗、裁剪、平移、旋转、放大、缩小、投影等各种几何变换操作的方法及其 软件或硬件实现技术。 图形信息的存储,检索与交换技术:如图形信息的各种表示方法、组织形式、存取技术、图形数据库的管理、图形信息通信等。 人机交互及用户接口技术:如新型定位设备、选择设备的研究;

《计算机图形学》课内实验报告(实验一)

目录 一、实验题目 (1) 二、实验目的 (1) 三、实验内容 (1) 四、实验结果 (1) 五、实验体会或遇到问题 (2)

一、实验题目 VC++结合OpenGL的程序设计方法 二、实验目的 1.认识VC++6.0下MFC的基本实现方法; 2.掌握OpenGL的安装,使用与基本操作。 三、实验内容 1. 安装并使用VC++6.0 安装VC++6.0后并启动VC++6.0,然后新建工程,并重命名,生成可执行文件或MFC完成就可编写代码。 2. OpenGL的安装 OpenGL开放图形库,是一个三维计算机图形和模型库,是美国SGI公司为图形工作站开发的一种功能强大的三维图形开发包,在高级图形动画设计中表现十分突出,其安装要以VC++6.0或Java等编程语言为基础,在VC库文件中添加OpenGL专用库gl.lib,glut.lib,glaux.lib等,在头文件中添加gl.h, glut.h, glaux.h,并在系统目录(system32目录)下添加glut.dll,到glut32.dll, opengl32.dll等。这样外部环境已完成,在编写程序时再连结相应的库就可以正常使用VC++6.0结合OpenGL编写图形程序。 3.通过演示程序了解OpenGL的强大功能,同时了解编程方法。 四、实验结果 1、建立一个工程(工程名称:first program)并及一个文件(文件名:hello world.cpp)。

编写一个输出“hello world”的程序,编译运行。 生成可执行文件 2、(1) 将glut.h等所有头文件加入VC的相应文件夹中,即放入如下文件夹: C:\Program Files\Microsoft Visual Studio\VC98\Include\GL 将glut.dll等dll文件放到C:\WINDOWS\system32 将opengl32.lib等文件放到VC的的相应文件夹中,即放入如下文件夹:C:\Program Files\Microsoft Visual Studio\VC98\Lib 建立Win32的Console工程,在工程的设置中连接所有可能用到的静态库:opengl32.lib, glu32.lib; glaux.lib; glut32.lib; glut.lib。 实验源代码: // HighLevelShaders.c // OpenGL SuperBible, Chapter 21 // Demonstrates high-level shaders // Program by Benjamin Lipchak

计算机图形学实验报告实验2裁剪算法实验

一、实验目的: 直线段的裁剪:编码裁剪算法,中点分割裁剪算法。 二、实验内容: //BasicGraph.cpp //请将下列裁剪程序补充完整,并用注释说明是何种裁剪算法 void Encode (int x,int y,int *code,int XL,int XR,int YB,int YT) { //请将此程序补充完整 int c=0; if(xXR) c=c|RIGHT; if(yYT) c=c|TOP; (*code)=c; } //编码裁剪算法: void C_S_Line(POINT &p1,POINT &p2,int XL,int XR,int YB,int YT) { //请将此程序补充完整 int x1,x2,y1,y2,x,y,code1,code2,code; x1=p1.x; x2=p2.x; y1=p1.y; y2=p2.y; Encode(x1,y1,&code1,XL,XR,YB,YT); Encode(x2,y2,&code2,XL,XR,YB,YT); while(code1!=0||code2!=0) { if((code1&code2)!=0) return; code=code1; if(code1==0) code=code2; if((LEFT&code)!=0) {x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if((RIGHT&code)!=0) {x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);} if((BOTTOM&code)!=0) {y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if((TOP&code)!=0) {y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);} if(code==code1) {x1=x;y1=y;Encode(x,y,&code1,XL,XR,YB,YT);} else {x2=x;y2=y;Encode(x,y,&code2,XL,XR,YB,YT);} }

计算机图形学OpenGL版实验5-8

实验5 OpenGL模型视图变换 一、实验目的: 理解掌握OpenGL程序的模型视图变换。 二、实验内容: (1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换;(2)根据示范代码,尝试完成实验作业; 三、实验原理: 在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。 1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵。 2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换。如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向。在默认的情况下,照相机位于原点,指向Z轴负方向,朝上向量为(0,1,0)。 3.一般而言,display()函数包括:视图变换 + 模型变换 + 绘制图形的函数(如glutWireCube())。display()会在窗口被移动或者原来先遮住这个窗口的东西被一开时,被重复调用,并经过适当变换,保证绘制的图形是按照希望的方式进行绘制。 4.在调用glFrustum()设置投影变换之前,在reshape()函数中有一些准备工作:视口变换 + 投影变换 + 模型视图变换。由于投影变换,视口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。reshape()会在窗口初次创建,移动或改变时被调用。 OpenGL中矩阵坐标之间的关系:物理坐标*模型视图矩阵*投影矩阵*透视除法*规范化设备坐标——〉窗口坐标 (1)视图变换函数gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)设置照相机的位置。把照相机放在(0,0,5),镜头瞄准(0,0,0),朝上向量定为(0,1,0)朝上向量为照相机指定了一个唯一的方向。如果没有调用gluLookAt,照相机就设定一个默认的位置和方向,在默认情况下,照相机位于原点,指向Z轴的负方向,朝上向量为(0,1,0)glLoadIdentity()函数把当前矩阵设置为单位矩阵。 (2)使用模型变换的目的是设置模型的位置和方向 (3)投影变换,指定投影变换类似于为照相机选择镜头,可以认为这种变换的目的是确定视野,并因此确定哪些物体位于视野之内以及他们能够被看到的程度。除了考虑视野之外,投影变换确定物体如何投影到屏幕上,OpenGL提供了两种基本类型的投影,1、透视投影:远大近小;2、正投影:不影响相对大小,一般用于建筑和CAD应用程序中 (4)视口变换视口变换指定一个图象在屏幕上所占的区域 (5)绘制场景 四、实验代码: #include #include

中南大学计算机图形学作业代码

中南大学计算机图形学作业代码 您好,根据您的要求,以下是一个简单的计算机图形学作业代码,该代码使用Python编写,实现了简单的图形绘制和变换功能。代码共有1200多个字,希望能够帮助到您。 ```python import tkinter as tk class Graphics: def __init__(self): self.window = https://www.doczj.com/doc/d019187803.html, self.canvas = tk.Canvas(self.window, width=800, height=600) self.canvas.pack def draw_rectangle(self, x, y, width, height): self.canvas.create_rectangle(x, y, x+width, y+height) def translate(self, dx, dy): self.canvas.move("all", dx, dy) def scale(self, sx, sy): self.canvas.scale("all", 0, 0, sx, sy) def rotate(self, angle): self.canvas.rotate("all", angle)

def mainloop(self): self.window.mainloop #创建图形对象 graphics = Graphics #绘制一个矩形 graphics.draw_rectangle(100, 100, 200, 150) #平移图形 graphics.translate(50, 50) #缩放图形 graphics.scale(1.5, 1.5) #旋转图形 graphics.rotate(45) #运行主循环 graphics.mainloop ``` 以上代码使用Python的tkinter库创建了一个窗口并在窗口中绘制了一个矩形。然后,通过调用`translate`函数实现图形的平移,`scale`函数实现图形的缩放,`rotate`函数实现图形的旋转。最后通过调用 `mainloop`函数来运行图形界面的主循环。

计算机图形学实验(全)

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy);

xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ; gdriver = DETECT; initgraph(&gdriver , &gmode ,"C:\\TC20\\BGI"); DDALine(0,0,35,26,4); getch ( ); closegraph ( ); } Bresenham: #include #include void BresenhamLine(int x0,int y0,int x1,int y1,int color) { int x,y,dx,dy,e; dx=x1-x0; dy=y1-y0; e=-dx;x=x0;y=y0; while(x<=x1){ putpixel(x,y,color); x++; e=e+2*dy; if(e>0){ y++; e=e-2*dx; } } } main(){ int gdriver ,gmode ; gdriver = DETECT; initgraph(&gdriver , &gmode ,"c:\\TC20\\BGI"); BresenhamLine(0, 0 , 120, 200,5 ); getch ( ); closegraph ( ); }

计算机图形学实验报告-OpenGL基本使用

学生实验实习报告册 学年学期:2016-2017学年 春□√秋学期 课程名称:大学计算机基础 学生学院:通信与信息工程学院 专业班级: 学生学号: 学生姓名: 联系电话: 重庆邮电大学教务处印制

实验实习名OpenGL基本使用 指导教师秦红星考核成绩 课程名称计算机图形学A 课程编号 实验实习地点信息科技大厦S306 完成日期 学生姓名学生学号 学院专业广电与数字媒体类所在班级 教师评语 教师签名: 年月日 一、实验实习目的及要求 目的: 认识了解OpenGL的性质、功能 要求: 1.利用OpenGL绘制一个简单的场景:比如球体、正方体 2.加入灯光 3.实现交互操作:平移、缩放、旋转 二、实验实习设备(环境)及要求(软硬件条件) 采用Microsoft Visual C 2010生成环境并用C++编写程序 三、实验实习内容与步骤 内容: 背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。 步骤: 建立立体-->添加光照-->添加变换 1.先写“主函数”,在主函数中将窗口生成好。 2.在“自定义函数1”中对窗口进行清除、填色等操作。 3.在“自定义函数1”中设置点光源,设置光照的各种参数。 4.在“自定义函数1”中设置平移、缩放、旋转及各参数。 5.在“自定义函数2”中设置平移和缩放的循环。 6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。实现动画。 四、实验实习过程或算法(源程序、代码) #include

计算机图形学简单画图代码

软件:NetBeans 图形效果: 代码: package newpackage; import java.awt.*; import javax.swing.*; import java.awt.geom.*; import java.awt.image.*; import https://www.doczj.com/doc/d019187803.html,.URL; import java.io.*; import javax.imageio.*; import java.awt.event.*; import java.util.Calendar; import javax.swing.*; public class Hello2D extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("计算机图形学"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new Hello2D(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }

public void init() { JPanel panel = new Hello2DPanel(); getContentPane().add(panel); } } class Hello2DPanel extends JPanel implements ActionListener{ private BufferedImage image; AffineTransform rotH = new AffineTransform(); AffineTransform rotM = new AffineTransform(); AffineTransform rotS = new AffineTransform(); // AffineTransform zuq=new AffineTransform (); public Hello2DPanel() { setPreferredSize(new Dimension(1400,1000)); setBackground(Color.white); Timer timer=new Timer(500,this); timer.start(); URL url=getClass().getClassLoader().getResource("images/zuqiu.jpg"); try{ image=ImageIO.read(url); }catch(IOException ex) { ex.printStackTrace(); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2= (Graphics2D)g; g2.translate(100,100); g2.scale(0.5, 0.5); for (int i = 0; i < 12; i++) { g2.rotate(2*Math.PI/12); g2.fill3DRect(-3, -180, 6, 30, true); }

计算机图形学实验--橡皮筋技术(完整代码,准确无误)

计算机图形学实验-- 橡皮筋技术(完整代码, 准确无误) 本页仅作为文档封面,使用时可以删除 This document is for reference only-rar21year.March

计算机图形学上机实验报告 橡皮筋技术 计算机科学与技术学院 姓名: xxx 完成日期: 2010-12-7

实验:橡皮筋技术 一、实验目的与要求 实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法, 2.理解glut程序框架 3.理解窗口到视区的变换 4.理解OpenGL实现动画的原理 5.学会基于鼠标和键盘实现交互的实现方法 二、实验内容: 利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择 实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。 2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。 2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。 3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。 三、实验结果

图1.1 鼠标右键菜单 图1.2 绘制矩形

四、体会 1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础. 2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键盘灯交 互设备的实现,还有如何由初始生成元绘制分形物体。在这个过程中遇 到了很多问题,程序的调试也是困难重重,通过自己看书思考和老师、 同学的帮助最终完成了程序的调试,在这一过程中加深了对理论知识的 理解,以及理清了理论到实践转换的一点点思路,再一次体会到理论与 实践的结合的重要性,今后要多多提高提高动手能力。 五、源程序 橡皮筋技术程序清单: #include static GLsizei iMode=1; int winWidth=400,winHeight=300; //窗口的宽度和高度 int num=0,a[100],b[100],w1,h1,w2,h2; int iPointNum=0,x1,x2,y1,y2; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色 } void ChangeSize(int w,int h) { winWidth=w,winHeight=h; //保存当前窗口的大小 glViewport(0,0,w,h); //指定窗口显示区域

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

相关主题
文本预览
相关文档 最新文档