计算机图形学实验内容汇总.docx
- 文档编号:24889620
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:84
- 大小:664.58KB
计算机图形学实验内容汇总.docx
《计算机图形学实验内容汇总.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验内容汇总.docx(84页珍藏版)》请在冰豆网上搜索。
计算机图形学实验内容汇总
计算机图形学实验
肖加清
实验一图形学实验基础
一、实验目的
(1)掌握VC++绘图的一般步骤;
(2)掌握OpenGL软件包的安装方法;
(3)掌握OpenGL绘图的一般步骤;
(4)掌握OpenGL的主要功能与基本语法。
二、实验内容
1、VC++绘图实验
(1)实验内容:
以下是绘制金刚石图案。
已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。
N=3
N=4
N=5
N=10
N=30
N=50
(2)参考程序
//自定义的一个类
//此代码可以放在视图类的实现文件(.cpp)里
classCP2
{
public:
CP2();
virtual~CP2();
CP2(double,double);
doublex;
doubley;
};
CP2:
:
CP2()
{
this->x=0.0;
this->y=0.0;
}
CP2:
:
~CP2()
{
}
CP2:
:
CP2(doublex0,doubley0)
{
this->x=x0;
this->y=y0;
}
//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。
//在视图类的头文件(.h)里定义此函数
voidDiamond();
//在视图类的实现文件(.cpp)里实现此函数
voidCTestView:
:
Diamond()
{
CP2*P;
intN;
doubleR;
R=300;
N=10;
P=newCP2[N];
CClientDCdc(this);
CRectRect;
GetClientRect(&Rect);
doubletheta;
theta=2*PI/N;
for(inti=0;i { P[i].x=R*cos(i*theta); P[i].y=R*sin(i*theta); } for(i=0;i<=N-2;i++) { for(intj=i+1;j<=N-1;j++) { //其中ROUND函数需要自己实现,实现四舍五入的功能。 dc.MoveTo(ROUND(P[i].x+Rect.right/2),ROUND(P[i].y+Rect.bottom/2)); dc.LineTo(ROUND(P[j].x+Rect.right/2),ROUND(P[j].y+Rect.bottom/2)); } } delete[]P; } 2、OpenGL绘图 (1)以下是用OpenGL绘制茶壶的代码,请在OpenGL环境下运行,分析OpenGL程序的结构 #include #include #include #include //定义输出窗口的大小 #defineWINDOW_HEIGHT300 #defineWINDOW_WIDTH500 //用户初始化函数 voidmyninit(void); //窗口大小变化时的回调函数 voidCALLBACKmyReshape(GLsizeiw,GLsizeih); //每帧OpenGL都会调用这个函数,应该把显示代码放在这个函数中 voidCALLBACKdisplay(void); intwindow_width=WINDOW_WIDTH; intwindow_height=WINDOW_HEIGHT; //视点离物体的距离 floatdistance=3.6f; //初始化,此时为空,可以在这里进行初始化操作 voidmyinit(void) { } voidCALLBACKdisplay(void) { //设置清屏的颜色,并清屏和深度缓冲 glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //设置成模型矩阵模式 glMatrixMode(GL_MODELVIEW); //载入单位化矩阵 glLoadIdentity(); //坐标中心向Z轴平移-distance,这样使坐标中心位于视点前方 glTranslatef(0.0,0.0,-distance); //在坐标中心显示一个茶壶 auxWireTeapot(1.0); //等待现有的OpenGL命令执行完成 glFlush(); //交换前后缓冲区 auxSwapBuffers(); } voidCALLBACKmyReshape(GLsizeiw,GLsizeih) { if(! h)return; //这定视区 glViewport(0,0,w,h); //设定透视方式 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0,1.0*(GLfloat)w/(GLfloat)h,1.0,30.0); window_width=w; window_height=h; } //移近移远的回调函数 voidCALLBACKMoveNear(void) { distance-=0.3f; } voidCALLBACKMoveFar(void) { distance+=0.3f; } //主函数 intmain(intargc,char**argv) { //初始化OpenGL的显示方式 auxInitDisplayMode(AUX_DOUBLE|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); //开始OpenGL的循环 auxMainLoop(display); //结束程序 return(0); } 其运行结果如图所示: (2)OPENGL绘制矩形的简单例子 参考程序: #include voidInitial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION);//设置投影参数 gluOrtho2D(0.0,200.0,0.0,150.0); } voidDisplay(void) { glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口 glColor3f(1.0f,0.0f,0.0f);//设置当前的绘图颜色为红色 glRectf(50.0f,100.0f,150.0f,50.0f);//绘制一个矩形 glFlush();//处理所有的OpenGL程序 } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式 glutInitWindowSize(400,300);//设置窗口的尺寸 glutInitWindowPosition(100,120);//设置窗口的位置 glutCreateWindow("矩形");//创建一个名为矩形的窗口 glutDisplayFunc(Display);//设置当前窗口的显示回调函数 Initial();//完成窗口初始化 glutMainLoop();//启动主GLUT事件处理循环 return0; } 三、实验结果分析 实验二直线生成算法与用户接口与交互式技术 一、实验目的 1、掌握直线生成算法 (1)DDA算法 (2)Bresenham算法 2、掌握交互式技术 (1)鼠标 (2)键盘数字键、字母键、功能键和特殊键 3、实现拾取操作 二、实验内容 1、以下给出了DDA算法的C++代码,请参考用VisualC++实现Bresenham算法。 实现DDA画线程序 实验步骤: 1.建立一个DDALine的工程文件; 2.添加ddaline()成员函数 方法: 在工作区中选择CLASSVIEW类窗口,右击CDDAlineView类,选择“addmemberfunction…”,定义如下的成员函数: voidddaline(CDC*pDC,intx0,inty0,intx1,inty1,COLORREFcolor); 3.编写自定义的成员函数ddaline()程序 voidCDDALineView: : ddaline(CDC*pDC,intx0,inty0,intx1,inty1,COLORREFcolor) { intlength,i; floatx,y,dx,dy; length=abs(x1-x0); if(abs(y1-y0)>length) length=abs(y1-y0); dx=(x1-x0)/length; dy=(y1-y0)/length; x=x0+0.5;y=y0+0.5; for(i=1;i<=length;i++) { pDC->SetPixel((int)x,(int)y,color); x=x+dx;y=y+dy; } } 4.编写OnDraw()函数 voidCDDALineView: : OnDraw(CDC*pDC) { CDDALineDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO: adddrawcodefornativedatahere ddaline(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)); ddaline(pDC,100,400,400,100,RGB(0,255,255));} } 5.编译、调试和运行程序,查看程序结果。 2、以下是利于鼠标和字母键实现用户接口与交互式技术,请参照利用特殊键实现,写出其代码。 (1)OPENGL中利用鼠标实现橡皮筋技术的例子 #include intiPointNum=0;//已确定点的数目 intx1=0,x2=0,y1=0,y2=0;//确定的点坐标 intwinWidth=400,winHeight=300;//窗口的宽度和高度 voidInitial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); } voidChangeSize(intw,inth) { winWidth=w;winHeight=h; glViewport(0,0,w,h);//指定窗口显示区域 glMatrixMode(GL_PROJECTION);//设置投影参数 glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight); } voidDisplay(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(); } glutSwapBuffers();//交换缓冲区 } voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse) { 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-yMouse; glutPostRedisplay();//指定窗口重新绘制 } } if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN){ iPointNum=0; glutPostRedisplay(); } } voidPassiveMouseMove(GLintxMouse,GLintyMouse) { if(iPointNum==1){ x2=xMouse; y2=winHeight-yMouse; glutPostRedisplay(); } } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型 glutInitWindowSize(400,300); glutInitWindowPosition(100,100); glutCreateWindow("橡皮筋技术"); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize);//指定窗口在整形回调函数 glutMouseFunc(MousePlot);//指定鼠标响应函数 glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数 Initial(); glutMainLoop(); return0; } (2)OPENGL中利用键盘实现橡皮筋技术的例子 #include intiPointNum=0;//已确定点的数目 intx1=0,x2=0,y1=0,y2=0;//确定的点坐标 intwinWidth=400,winHeight=300;//窗口的宽度和高度 voidInitial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); } voidChangeSize(intw,inth) { winWidth=w;winHeight=h; glViewport(0,0,w,h);//指定窗口显示区域 glMatrixMode(GL_PROJECTION);//设置投影参数 glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight); } voidDisplay(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(); } glutSwapBuffers();//交换缓冲区 } voidPassiveMouseMove(GLintxMouse,GLintyMouse) { if(iPointNum==1){ x2=xMouse; y2=winHeight-yMouse; glutPostRedisplay(); } } voidKey(unsignedcharkey,intx,inty) { 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; } } intmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型 glutInitWindowSize(400,300); glutInitWindowPosition(100,100); glutCreateWindow("橡皮筋技术"); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize);//指定窗口在整形回调函数 glutKeyboardFunc(Key);//指定键盘响应函数 glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数 Initial(); glutMainLoop(); return0; } 3、以下OPENGL实现拾取操作的例子,请掌握实现拾取操作的方法。 #include #include"stdio.h" constGLintpickSize=32; intwinWidth=400,winHeight=300; voidInitial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); } voidDrawRect(GLenummode) { if(mode==GL_SELECT)glPushName (1);//压入堆栈 glColor3f(1.0f,0.0f,0.0f); glRectf(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); } voidProcessPicks(GLintnPicks,GLuintpickBuffer[]) { GLinti; GLuintname,*ptr; printf("选中的数目为%d个\n",nPicks); ptr=pickBuffer; for(i=0;i name=*ptr;//选中图元在堆栈中的位置 ptr+=3;//跳过名字和深度信息 ptr+=name-1;//根据位置信息获得选中的图元名字 if(*ptr==1)printf("你选择了红色图元\n"); if(*ptr==2)printf("你选择了绿色图元\n"); if(*ptr==3)printf("你选择了蓝色图元\n"); ptr++; } printf("\n\n"); } voidChangeSize(intw,inth) { winWidth=w; winHeight=h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight); } voidDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); DrawRect(GL_RENDER); glFlush(); } voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse) { GLuintpickBuffer[pickSize]; GLintnPicks,vp[4]; if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN){ glSelectBuffer(pickSize,pickBuffer);//设置选择缓冲区 glRenderMode(GL_SELECT);//激活选择模式 glInitNames();//初始化名字堆栈 glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glGetIntegerv(GL_VIEWPORT,vp); //定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 内容 汇总