计算机图形学实验指导精.docx

上传人:b****8 文档编号:9754807 上传时间:2023-02-06 格式:DOCX 页数:47 大小:473.52KB
下载 相关 举报
计算机图形学实验指导精.docx_第1页
第1页 / 共47页
计算机图形学实验指导精.docx_第2页
第2页 / 共47页
计算机图形学实验指导精.docx_第3页
第3页 / 共47页
计算机图形学实验指导精.docx_第4页
第4页 / 共47页
计算机图形学实验指导精.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

计算机图形学实验指导精.docx

《计算机图形学实验指导精.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验指导精.docx(47页珍藏版)》请在冰豆网上搜索。

计算机图形学实验指导精.docx

计算机图形学实验指导精

 

 计算机图形学

实验指导书

 

计算机科学与信息工程学院

目录

实验一 OpenGL程序设计…………………………………………..3

实验二 二维基本图元的生成……………………………………….7

实验三 二维图元的填充……………………………………………13

实验四 二维图形的几何变换……………………….…………..….18

实验五裁剪…………………………………………………………..23

实验六 自由曲线…………………………………………………..26

实验七 造型技术…………………………………………………..27

实验八 交互式技术………………………………………………..32

实验九 真实感图形的绘制………………………………………..37

计算机图形学实验指导

 一、实验目的

1、培养学生动手编程解决实际问题的能力。

2、训练学生分析问题和调试程序的能力。

3、锻炼学生撰写科技实验论文的能力。

  二、实验要求

1、问题分析

充分地分析和理解问题本身,弄清要求做什么,用什么算法。

2、程序设计

(1)根据所采用的算法,设计数据结构,画出流程图并编程。

(2)最后准备调试程序的数据及测试方案。

3、上机调试

(1)对程序进行编译,纠正程序中可能出现的语法错误。

(2)调试前,先运行一遍程序看看究竟将会发生什么。

(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。

4、整理实习报告

  三、实验报告

1、实验内容:

采用的算法名称

2、问题描述:

包括目标、任务、条件约束描述等。

3、设计:

数据结构设计和核心算法设计。

主要功能模块的输入,处理(算法框架)和输出。

4、测试范例:

测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。

5、心得:

包括程序的改进设想,经验和体会。

6、程序清单:

源程序,其中包括变量说明及详细的注释。

实验一 OpenGL程序设计

一、实验学时2学时

二、实验类型学习型实验

三、实验目的和要求

初步了解OpenGL程序设计结构;了解OpenGL的基本数据类型、核心函数及辅助函数的使用。

四、实验内容

1、综述

这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是VisualC++,它对OpenGL提供了完备的支持。

OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。

2、在VC中新建项目

∙新建一个项目。

选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32ConsoleApplication项,然后填入你自己的Projectname,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。

∙为项目添加文件

为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:

glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:

\programfiles\MicrosoftVisualStudio\vc98\lib目录中。

选中菜单Project->AddToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link->Object/libraryModules即可。

点击工具条中NewTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。

#include

#include

#include

#include

//初始化OpenGL场景

voidmyinit(void)

{

glClearColor(0.0,0.0,0.0,0.0);//将背景置成黑色

glShadeModel(GL_FLAT);//设置明暗处理

}

//用户的绘图过程

voidCALLBACKdisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

//清除缓存

glBegin(GL_LINES);//开始画一根白线

glColor3f(1.0f,1.0f,1.0f);

//设置颜色为白色

//设置第一根线的两个端点,请注意:

OpenGL坐标系的原点是在屏幕左下角

glVertex2f(10.0f,50.0f);

glVertex2f(110.0f,50.0f);

glColor3f(1.0f,0.0f,0.0f);

//设置颜色为红色

//设置第二根线的两个端点

glVertex2f(110.0f,50.0f);

glVertex2f(110.0f,150.0f);

glEnd();//画线结束

glFlush();//绘图结束

}

//

//主过程:

//初始化Windows的窗口界面

//并初始化OpenGL场景,绘图

intmain(intargc,char**argv)

{

auxInitDisplayMode(AUX_RGB);

//初始化显示模式,采用RGB彩色系统。

auxInitPosition(0,0,400,150);//初始化窗口位置、大小

auxInitWindow("DisplayLists");//初始化窗口,设置标题

myinit();

auxMainLoop(display);

//循环运行display过程,display由用户编写

return(0);

}

3、程序说明

每个函数的具体含义在程序注释中已作了叙述,不再多说。

OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如:

glColor3f(),字母f指明要使用浮点数。

字母前的数字指明参数个数或指明二维还是三维,如:

glVertex2f()是要设置二维的点。

OpenGL采用的是状态机的方式,用户设定一种状态,程序照此运行。

如:

glBegin(GL_LINES)设定画线状态(GL_LINES是OpenGL已定义好的常量),glColor3f()设定绘图所用颜色。

main()函数中的几个aux前缀函数是OpenGL提供的辅助库,用以初始化窗口,大家不必深究,我们关注的是display()函数,它是我们真正绘图的地方。

函数glColor3f()以RGB方式设置颜色,格式为:

glColor3f(red,green,blue),每种颜色值在(0.0,1.0)之间。

为了能显示更多的颜色,最好把系统设置成16位真彩色模式。

函数glVertex2f(x,y)设置二维顶点。

 

函数glBegin(UINTState)、glEnd()是最基本的作图函数,下面对它作一介绍。

如上所述,OpenGL是一个状态机,glBegin(UINTState)可以设定如下状态:

 

GL_POINTS画点

GL_LINES画线,每两个顶点(Vertex)为一组

GL_LINE_STRIP画线,把若干个顶点顺次连成折线

GL_LINE_LOOP画线,把若干个顶点顺次连成封闭折线

GL_TRIANGLES画三角形,每三个顶点为一组

GL_QUADS画四边形,每四个顶点为一组

GL_POLYGON画多边形

还有GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_QUADS_STRIP等等。

大家可以把每一种状态都试一试。

程序可以有多组glBegin()、glEnd()并列的形式,如:

......

glBeing(GL_LINES);

......

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);

实验二 二维基本图元的生成

一、实验学时2学时

二、实验类型设计型实验

三、实验目的和要求

1、掌握二维基本图元直线段生成的DDA算法,中点算法;

2、掌握二维基本图元圆弧生成的中点算法;

3、掌握对线型线宽的属性的控制。

四、实验内容

1、编程实现DDA、中点算法生成直线

2、中点扫描转换生成圆、椭圆

五、建立工程步骤

1.在visualc++.net中使用opnengl,建立项目的步骤:

2、在visualc++中的建立控制台项目的步骤:

实验三 二维图元的填充

一、实验学时2学时

二、实验类型设计型实验

三、实验目的和要求

1、掌握二维图元填充的递归算法;

2、掌握二维图元填充的种子填充算法

四、实验内容

构造任意一个边界表示的多边形,假定该多边形内部是四连通的。

要求:

1、用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。

(参照教案进行)

2、用种子填充扫描线算法实现多边形内部的填充。

五、建立win32应用程序工程。

1、visualc++ 6.0下的界面

接下来,请按实验二中的方法给上面建立的空项目添加文件“recursion.cpp”,由于同学们初次接触WIN32编程,所以对于下文中很多代码可暂时不要求理解,重点了解红色代码。

递归算法源码如下:

//INCLUDES///////////////////////////////////////////////

#defineWIN32_LEAN_AND_MEAN//justsaynotoMFC

#include//includeallthewindowsheaders

#include//includeusefulmacros

//DEFINES////////////////////////////////////////////////

//definesforwindows

#defineWINDOW_CLASS_NAME"WINCLASS1"

#defineWINDOW_WIDTH400

#defineWINDOW_HEIGHT300

//GLOBALS////////////////////////////////////////////////

HWNDmain_window_handle=NULL;//globallytrackmainwindow

HINSTANCEhinstance_app=NULL;//globallytrackhinstance

voidBoundaryFill4(HDC,int,int,COLORREF,COLORREF);

//FUNCTIONS//////////////////////////////////////////////

LRESULTCALLBACKWindowProc(HWNDhwnd,

UINTmessage,

WPARAMwParam,

LPARAMlParam)

{

//thisisthemainmessagehandlerofthesystem

HDChdc;//handletoadevicecontext

HPENhnewpen;

HPENholdpen;

//whatisthemessage

switch(message)

{

caseWM_RBUTTONDOWN:

hdc=GetDC(hwnd);

hnewpen=CreatePen(PS_SOLID,1,RGB(0,255,0));

holdpen=(HPEN)SelectObject(hdc,hnewpen);

//构造多边形

MoveToEx(hdc,30,40,NULL);

LineTo(hdc,60,40);

LineTo(hdc,90,100);

LineTo(hdc,60,150);

LineTo(hdc,30,150);

LineTo(hdc,30,40);

SelectObject(hdc,holdpen);

DeleteObject(hnewpen);

ReleaseDC(hwnd,hdc);

return(0);

break;

caseWM_LBUTTONDOWN:

hdc=GetDC(hwnd);BoundaryFill4(hdc,LOWORD(lParam),HIWORD(lParam),RGB(0,255,0),RGB(255,0,0));

//releasethedc

ReleaseDC(hwnd,hdc);

return(0);

break;

caseWM_DESTROY:

{

//killtheapplication,thissendsaWM_QUITmessage

PostQuitMessage(0);

//returnsuccess

return(0);

}break;

default:

break;

}//endswitch

//processanymessagesthatwedidn'ttakecareof

return(DefWindowProc(hwnd,message,wParam,lParam));

}//endWinProc

//WINMAIN////////////////////////////////////////////////

intWINAPIWinMain(HINSTANCEhinstance,

HINSTANCEhprevinstance,

LPSTRlpcmdline,

intncmdshow)

{

WNDCLASSEXwinclass;//thiswillholdtheclasswecreate

HWNDhwnd;//genericwindowhandle

MSGmessage;//genericmessage

//firstfillinthewindowclassstucture

winclass.cbSize=sizeof(WNDCLASSEX);

winclass.style=CS_DBLCLKS|CS_OWNDC|

CS_HREDRAW|CS_VREDRAW;

winclass.lpfnWndProc=WindowProc;

winclass.cbClsExtra=0;

winclass.cbWndExtra=0;

winclass.hInstance=hinstance;

winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

winclass.hCursor=LoadCursor(NULL,IDC_ARROW);

winclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

winclass.lpszMenuName=NULL;

winclass.lpszClassName=WINDOW_CLASS_NAME;

winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);

//savehinstanceinglobal

hinstance_app=hinstance;

//registerthewindowclass

if(!

RegisterClassEx(&winclass))

return(0);

//createthewindow

if(!

(hwnd=CreateWindowEx(NULL,//extendedstyle

WINDOW_CLASS_NAME,//class

"ScanlineFillDemo",//title

WS_OVERLAPPEDWINDOW|WS_VISIBLE,

0,0,//initialx,y

WINDOW_WIDTH,//initialwidth

WINDOW_HEIGHT,//initialheight

NULL,//handletoparent

NULL,//handletomenu

hinstance,//instanceofthisapplication

NULL)))//extracreationparms

return(0);

//savemainwindowhandle

main_window_handle=hwnd;

while(GetMessage(&message,NULL,0,0))

{

//translateanyacceleratorkeys

TranslateMessage(&message);

//sendthemessagetothewindowproc

DispatchMessage(&message);

}//endwhile

//returntoWindowslikethis

return(message.wParam);

}//endWinMain

///////////////////////////////////////////////////////////

voidBoundaryFill4(HDChdc,intx,inty,COLORREFboundarycolor,COLORREFnewcolor)

{

COLORREFcolor;

color=GetPixel(hdc,x,y);

if((color!

=boundarycolor)&&(color!

=newcolor))

{

SetPixel(hdc,x,y,newcolor);

BoundaryFill4(hdc,x,y+1,boundarycolor,newcolor);

BoundaryFill4(hdc,x,y-1,boundarycolor,newcolor);

BoundaryFill4(hdc,x-1,y,boundarycolor,newcolor);

BoundaryFill4(hdc,x+1,y,boundarycolor,newcolor);

}

}

2、中建立Win32工程

更改项目中recursion.cpp文件代码:

1)声明函数

voidBoundaryFill4(HDC,int,int,COLORREF,COLORREF);

2)修改LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)函数中代码,把visualc++6.0介绍的recursion.cpp中的WndProc函数体复制即可。

3)在recursion.cpp文件末尾添加BoundaryFill4函数。

实验四 二维图形的几何变换

一、实验学时2学时

二、实验类型设计型实验

三、实验目的和要求

1、掌握二维图形的基本几何变换,如平移、旋转、缩放、对称、错切变换;

2、掌握OpenGL中模型变换函数,实现简单的动画技术。

四、实验内容

1、下面的代码采用GLUT库,实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动),请修改代码,实现矩形在窗口内沿着水平线匀速移动。

/*

*double.c

*Thisisasimpledoublebufferedprogram.

*Pressingtheleftmousebuttonrotatestherectangle.

*Pressingtherightmousebuttonstopstherotation.

*/

#include

#include

staticGLfloatspin=0.0;

voiddisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();

glRotatef(spin,0.0,0.0,1.0);

glColor3f(1.0,1.0,1.0);

glRectf(-10.0,-10.0,10.0,10.0);

glPopMatrix();

glutSwapBuffers();

}

voidspinDisplay(void)

{

spin=spin+2.0;

if(spin>360.0)

spin=spin-360.0;

glutPostRedisplay();

}

voidinit(void)

{

glClearColor(0.0,0.0,0.0,0.0);

glShadeModel(GL_FLAT);

}

voidreshape(intw,inth)

{

glViewport(0,0,(GLsizei)w,(GLsizei)h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

voidmouse(intbutton,intstate,intx,inty)

{

switch

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1