计算机图形学实验内容.pdf
《计算机图形学实验内容.pdf》由会员分享,可在线阅读,更多相关《计算机图形学实验内容.pdf(57页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、电脑图形学实验电脑图形学实验肖加清肖加清1实验一实验一图形学实验基础图形学实验基础一、实验目的实验目的(1)掌握 VC+绘图的一般步骤;(2)掌握 OpenGL 软件包的安装方法;(3)掌握 OpenGL 绘图的一般步骤;(4)掌握 OpenGL 的主要功能与基本语法。二、实验内容二、实验内容1 1、VC+VC+绘图实验绘图实验1实验内容:以下是绘制金刚石图案。已给出VC+参考程序,但里面有部分错误,请改正,实现以下列图案。N=3N=42N=5N=10N=303N=50(2)参考程序/自定义的一个类/此代码可以放在视图类的实现文件(.cpp)里class CP2public:CP2();vir
2、tual CP2();CP2(double,double);double x;double y;CP2:CP2()this-x=0.0;this-y=0.0;CP2:CP2()CP2:CP2(double x0,double y0)this-x=x0;this-y=y0;4/视图类的一个成员函数,这个成员函数可以放在OnDraw 函数里调用。/在视图类的头文件.h里定义此函数void Diamond();/在视图类的实现文件.cpp里实现此函数void CTestView:Diamond()CP2*P;int N;double R;R=300;N=10;P=new CP2N;CClientDC
3、 dc(this);CRect Rect;GetClientRect(&Rect);double theta;theta=2*PI/N;for(int i=0;iN;i+)Pi.x=R*cos(i*theta);Pi.y=R*sin(i*theta);for(i=0;i=N-2;i+)for(int j=i+1;j=N-1;j+)/其中 ROUND 函数需要自己实现,实现四舍五入的功能。dc.MoveTo(ROUND(Pi.x+Rect.right/2),ROUND(Pi.y+Rect.bottom/2);dc.LineTo(ROUND(Pj.x+Rect.right/2),ROUND(Pj.
4、y+Rect.bottom/2);delete P;2 2、OpenGLOpenGL 绘图绘图1以下是用 OpenGL 绘制茶壶的代码,请在 OpenGL 环境下运行,分析 OpenGL 程序的结构#include#include#include#include/定义输出窗口的大小#define WINDOW_HEIGHT 3005#define WINDOW_WIDTH 500/用户初始化函数void myninit(void);/窗口大小变化时的回调函数void CALLBACK myReshape(GLsizei w,GLsizei h);/每帧 OpenGL 都会调用这个函数,应该把显
5、示代码放在这个函数中void CALLBACK display(void);int window_width=WINDOW_WIDTH;int window_height=WINDOW_HEIGHT;/视点离物体的距离float distance=3.6f;/初始化,此时为空,可以在这里进行初始化操作void myinit(void)void CALLBACK display(void)/设置清屏的颜色,并清屏和深度缓冲glClearColor(0.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/设置成模
6、型矩阵模式glMatrixMode(GL_MODELVIEW);/载入单位化矩阵glLoadIdentity();/坐标中心向 Z 轴平移-distance,这样使坐标中心位于视点前方glTranslatef(0.0,0.0,-distance);/在坐标中心显示一个茶壶auxWireTeapot(1.0);/等待现有的 OpenGL 命令执行完成glFlush();/交换前后缓冲区auxSwapBuffers();void CALLBACK myReshape(GLsizei w,GLsizei h)if(!h)return;/这定视区glViewport(0,0,w,h);/设定透视方式g
7、lMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,1.0*(GLfloat)w/(GLfloat)h,1.0,30.0);window_width=w;window_height=h;6/移近移远的回调函数void CALLBACK MoveNear(void)distance-=0.3f;void CALLBACK MoveFar(void)distance+=0.3f;/主函数int main(int argc,char*argv)/初始化 OpenGL 的显示方式auxInitDisplayMode(AUX_D
8、OUBLE|AUX_RGB|AUX_DEPTH16);/设定 OpenGL 窗口位置和大小auxInitPosition(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);/打开窗口auxInitWindow(OpenGL的一个简单的例子!);/调用初始化函数myinit();/设定窗口大小变化的回调函数auxReshapeFunc(myReshape);/设定移动视点的回调函数auxKeyFunc(A,MoveNear);/按 A 键变大auxKeyFunc(a,MoveFar);/按 a 键变小/使 display 函数一直被调用auxIdleFunc(display);/开
9、始 OpenGL 的循环auxMainLoop(display);/结束程序return(0);其运行结果如下图:72 2OPENGLOPENGL 绘制矩形的简单例子绘制矩形的简单例子参考程序:#include void Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);/设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);/设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);void Display(void)glClear(GL_COLOR_BUFFER_BIT);/用当前背景色填充窗口glCol
10、or3f(1.0f,0.0f,0.0f);/设置当前的绘图颜色为红色glRectf(50.0f,100.0f,150.0f,50.0f);/绘制一个矩形glFlush();/处理所有的 OpenGL 程序int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/初始化窗口的显示模式glutInitWindowSize(400,300);/设置窗口的尺寸glutInitWindowPosition(100,120);/设置窗口的位置glutCreateWindow(矩形)
11、;/创建一个名为矩形的窗口glutDisplayFunc(Display);/设置当前窗口的显示回调函数8Initial();/完成窗口初始化glutMainLoop();/启动主 GLUT 事件处理循环return 0;三、实验结果分析三、实验结果分析实验二实验二 直线生成算法与用户接口与交互式技术直线生成算法与用户接口与交互式技术一、实验目的一、实验目的1、掌握直线生成算法1 DDA 算法2Bresenham 算法2、掌握交互式技术1鼠标2键盘数字键、字母键、功能键和特殊键3、实现拾取操作二、实验内容1 1、以下给出了、以下给出了 DDADDA 算法的算法的 C+C+代码,请参考用代码,请
12、参考用 Visual C+Visual C+实现实现 BresenhamBresenham 算法。算法。实现实现 DDADDA 画线程序画线程序实验步骤:1 建立一个 DDALine 的工程文件;2 添加 ddaline()成员函数方法:在工作区中选择 CLASSVIEW 类窗口,右击 CDDAlineView 类,选择“add memberfunction”,定义如下的成员函数:void ddaline(CDC*pDC,int x0,int y0,int x1,int y1,COLORREF color);3 编写自定义的成员函数ddaline()程序void CDDALineView:dd
13、aline(CDC*pDC,int x0,int y0,int x1,int y1,COLORREF color)int length,i;float x,y,dx,dy;length=abs(x1-x0);if(abs(y1-y0)length)length=abs(y1-y0);dx=(x1-x0)/length;dy=(y1-y0)/length;9x=x0+0.5;y=y0+0.5;for(i=1;iSetPixel(int)x,(int)y,color);x=x+dx;y=y+dy;4编写 OnDraw()函数void CDDALineView:OnDraw(CDC*pDC)CDDA
14、LineDoc*pDoc=GetDocument();ASSERT_V ALID(pDoc);/TODO:add draw code for native data hereddaline(pDC,100,100,400,100,RGB(255,0,0);ddaline(pDC,400,100,400,400,RGB(0,255,0);ddaline(pDC,400,400,100,400,RGB(0,0,255);ddaline(pDC,100,400,100,100,RGB(255,255,0);ddaline(pDC,100,100,400,400,RGB(255,0,255);ddal
15、ine(pDC,100,400,400,100,RGB(0,255,255);5编译、调试和运行程序,查看程序结果。2 2、以下是利于鼠标和字母键实现用户接口与交互式技术,请参照利用特殊键实现,写出其、以下是利于鼠标和字母键实现用户接口与交互式技术,请参照利用特殊键实现,写出其代码。代码。1OPENGL 中利用鼠标实现橡皮筋技术的例子#include int iPointNum=0;/已确定点的数目int x1=0,x2=0,y1=0,y2=0;/确定的点坐标int winWidth=400,winHeight=300;/窗口的宽度和高度void Initial(void)glClearCol
16、or(1.0f,1.0f,1.0f,1.0f);void ChangeSize(int w,int h)winWidth=w;winHeight=h;glViewport(0,0,w,h);/指定窗口显示区域glMatrixMode(GL_PROJECTION);/设置投影参数glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight);10void Display(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);if(iPointNum=1)glBegin(GL_LINE
17、S);/绘制直线段glVertex2i(x1,y1);glVertex2i(x2,y2);glEnd();glutSwapBuffers();/交换缓冲区void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)if(button=GLUT_LEFT_BUTTON&action=GLUT_DOWN)if(iPointNum=0|iPointNum=2)iPointNum=1;x1=xMouse;y1=winHeight-yMouse;else iPointNum=2;x2=xMouse;y2=winHeight-yMo
18、use;glutPostRedisplay();/指定窗口重新绘制if(button=GLUT_RIGHT_BUTTON&action=GLUT_DOWN)iPointNum=0;glutPostRedisplay();void PassiveMouseMove(GLint xMouse,GLint yMouse)if(iPointNum=1)x2=xMouse;y2=winHeight-yMouse;glutPostRedisplay();int main(int argc,char*argv)11glutInit(&argc,argv);glutInitDisplayMode(GLUT_D
19、OUBLE|GLUT_RGB);/使用双缓存及 RGB 模型glutInitWindowSize(400,300);glutInitWindowPosition(100,100);glutCreateWindow(橡皮筋技术);glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);/指定窗口在整形回调函数glutMouseFunc(MousePlot);/指定鼠标响应函数glutPassiveMotionFunc(PassiveMouseMove);/指定鼠标移动响应函数Initial();glutMainLoop();return 0;2O
20、PENGL 中利用键盘实现橡皮筋技术的例子#include int iPointNum=0;/已确定点的数目int x1=0,x2=0,y1=0,y2=0;/确定的点坐标int winWidth=400,winHeight=300;/窗口的宽度和高度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);/指定窗口显示区域glMatrixMode(GL_PROJECTION);/设置投影参数glLoadId
21、entity();gluOrtho2D(0.0,winWidth,0.0,winHeight);void Display(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);if(iPointNum=1)glBegin(GL_LINES);/绘制直线段glVertex2i(x1,y1);glVertex2i(x2,y2);glEnd();12glutSwapBuffers();/交换缓冲区void PassiveMouseMove(GLint xMouse,GLint yMouse)if(iPointNum=1)x2=xMou
22、se;y2=winHeight-yMouse;glutPostRedisplay();void Key(unsigned char key,int x,int y)switch(key)case p:if(iPointNum=0|iPointNum=2)iPointNum=1;x1=x;y1=winHeight-y;else iPointNum=2;x2=x;y2=winHeight-y;glutPostRedisplay();break;default:break;int main(int argc,char*argv)glutInit(&argc,argv);glutInitDisplay
23、Mode(GLUT_DOUBLE|GLUT_RGB);/使用双缓存及 RGB 模型glutInitWindowSize(400,300);glutInitWindowPosition(100,100);glutCreateWindow(橡皮筋技术);glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);/指定窗口在整形回调函数glutKeyboardFunc(Key);/指定键盘响应函数glutPassiveMotionFunc(PassiveMouseMove);/指定鼠标移动响应函数Initial();13glutMainLoop();r
24、eturn 0;3 3、以下、以下 OPENGLOPENGL 实现拾取操作的例子,请掌握实现拾取操作的方法。实现拾取操作的例子,请掌握实现拾取操作的方法。#include#include stdio.hconst GLint pickSize=32;int winWidth=400,winHeight=300;void Initial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);void DrawRect(GLenum mode)if(mode=GL_SELECT)glPushName(1);/压入堆栈glColor3f(1.0f,0.0f,0.0f);glR
25、ectf(60.0f,50.0f,150.0f,150.0f);if(mode=GL_SELECT)glPushName(2);/压入堆栈glColor3f(0.0f,1.0f,0.0f);glRectf(230.0f,50.0f,330.0f,150.0f);if(mode=GL_SELECT)glPushName(3);/压入堆栈glColor3f(0.0f,0.0f,1.0f);glRectf(140.0f,140.0f,240.0f,240.0f);void ProcessPicks(GLint nPicks,GLuint pickBuffer)GLint i;GLuint name,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 内容
限制150内