计算机网络实验指导书苏州大学文档格式.docx
《计算机网络实验指导书苏州大学文档格式.docx》由会员分享,可在线阅读,更多相关《计算机网络实验指导书苏州大学文档格式.docx(46页珍藏版)》请在冰点文库上搜索。
4整理实习报告
三、实验报告
1 实习内容:
采用的算法名称
2 问题描述:
包括目标、任务、条件约束描述等。
3 设计:
数据结构设计和核心算法设计。
主要功能模块的输入,处理(算法框架)和输出。
4 测试范例:
测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
5 心得:
包括程序的改进设想,经验和体会。
6 程序清单:
源程序,其中包括变量说明及详细的注释。
实验1OpenGL程序设计
实验目的
巩固计算机图形学和C语言程序设计的相关知识,初步了解通用图形软件包,了解常见的图元的生成方法,学会图形显示设备的初始化及其交互式图形生成的过程,锻炼程序调试的技巧。
实验学时
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<
windows.h>
GL/gl.h>
GL/glu.h>
GL/glaux.h>
//初始化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,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);
2).OpenGL基础库设置
•更改头文件(在视图类的头文件中引用gl\gl.hgl\glu.h)
•连接OpenGL库(工程——设置——General/UseMFCinaLibrary,Link/OpenGL32.libglu32.lib)
3).添加变量和函数
•添加变量并初始化
•CClientDC*MyDC;
•视图类的构造函数中MyDC=NULL;
•添加消息映射函数
•OnCreate()
•OnSize()
•OnDestroy()
4).在PreCreateWindow函数中将窗口的客户区设置为OpenGL能够支持的风格
cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
5).在OnCreate函数中
•定义像素存储格式
•PIXELFORMATDESCRIPTOR结构
•创建绘图上下文RC(RenderingContext)并使之当前化
•wglCreateContext()函数创建绘图上下文RC。
PIXELFORMATDESCRIPTORpfd=
{sizeof(PIXELFORMATDESCRIPTOR),//pfd的大小
1,//结构的版本号
PFD_DRAW_TO_WINDOW|//支持window
PFD_SUPPORT_OPENGL|//支持OpenGL
PFD_DOUBLEBUFFER,//双缓存
PFD_TYPE_RGBA,//RGBA颜色模式
24,//24位颜色深度缓存
0,0,0,0,0,0,//colorbitsignored
0,//noalphabuffer
0,//shiftbitignored
0,//不使用累积缓存
0,0,0,0,//accumbitsignored
32,//32位z缓冲
0,//不使用模板缓存
0,//noauxiliarybuffer
PFD_MAIN_PLANE,//选择主层面
0,//保留
0,0,0//layermasksignored
};
MyDC=newCClientDC(this);
//设置像素格式
intpixelFormat=ChoosePixelFormat(MyDC->
GetSafeHdc(),&
pfd);
SetPixelFormat(MyDC->
GetSafeDC(),pixelFormat,&
m_hRC=wglCreateContext(MyDC->
m_hDC);
wglMakeCurrent(MyDC->
GetSafeHdc(),m_hRC);
6).在OnSize函数中设置视场和视口
If(cy>
0)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,9.0);
glViewport(0,0,cx,cy);
7).在OnDestroy函数:
在OnDestroy成员中需要释放OnCreate成员中RC所占用的资源
HGLRCm_hRC;
m_hRC=wglGetCurrentContext();
wglMakeCurrent(NULL,NULL);
wglDeleteContext(m_hRC);
MyDC->
DeleteDC();
8)在OnEraseBKgnd中将原来的返回语句换成返回TRUE;
9).在OnDraw中根据当前的视点、视距、观看方向等参数,设置合适的OpenGL视景体属性,使用户能够看到预期的场景外观
glClearColor(1.0f,1.0f,0.0f,1.0f);
//背景为黄色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-6.0f);
//OpenGL绘制直线命令
glColor3f(1.0,0.0,0.0);
//设置当前颜色为红色
glVertex2f(0,0);
glVertex2f(1,1);
glColor3f(0.0,1.0,0.0);
//设置当前颜色为绿色
glVertex2f(0.2f,0.0f);
//
glVertex2f(1.2f,1.0f);
glFinish();
SwapBuffers(wglGetCurrentDC());
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);
......
glBeing(GL_QUADS);
除了上述的基本图元外,函数glRectf(x1,y1,x2,y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。
glColor3f(0.0f,0.0f,1.0f);
glRectf(10.0f,10.0f,50.0f,50.0f);
实验1使用通用图形软件包设计简单的交互式图形
实验环境
计算机、TurboC或其他C语言程序设计环境
学习型实验
2学时,必做实验。
实验内容
1、计算机中安装和配置TurboC程序设计环境;
2、了解TurboC的通用图形软件包的内容;
3、练习简单图元的生成(如直线、圆、长方形等)。
实验步骤
1、装和配置TurboC程序设计环境;
3、编写生成简单的图元的程序;
4、调试程序,运行程序并观看运行结果;
5、对运行结果进行分析。
分析与思考
1、为、什么已经调试好的程序在不同的目录下的TurboC程序设计环境中却不能运行?
2、如何使所生成的图元在屏幕中央显示?
实验2二维基本图元的生成
一、实验学时2学时
二、实验类型设计型实验
三、实验目的和要求
1、掌握二维基本图元直线段生成的DDA算法,中点算法;
2、掌握二维基本图元圆弧生成的中点算法;
3、掌握对线型线宽的属性的控制。
1、编程实现DDA、中点算法生成直线
2、中点扫描转换生成圆、椭圆
五、实验步骤
1)在VC中新建项目
2)添加菜单及相应的菜单命令函数(画线、画圆)
3)编码实现(参考书中相关代码);
五、建立工程步骤
1.在visualc++.net中使用opnengl,建立项目的步骤:
2、在visualc++中的建立控制台项目的步骤:
实验三二维图元的填充
1、掌握二维图元填充的递归算法;
2、掌握二维图元填充的种子填充算法
构造任意一个边界表示的多边形,假定该多边形内部是四连通的。
要求:
1、用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。
(参照教案进行)
2、用种子填充扫描线算法实现多边形内部的填充。
五、建立win32应用程序工程。
1.请在实验二中建立的项目基础上,添加填充的菜单项,建立相应的菜单命令寒暑,实现种子填充。
2.voidBoundaryFill4(HDC,int,int,COLORREF,COLORREF);
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);
}
1、visualc++6.0下的界面
接下来,请按实验二中的方法给上面建立的空项目添加文件“recursion.cpp”,由于同学们初
次接触WIN32编程,所以对于下文中很多代码可暂时不要求理解,重点了解红色代码。
递归算法源码如下:
//INCLUDES///////////////////////////////////////////////
#defineWIN32_LEAN_AND_MEAN//justsaynotoMFC
//includeallthewindowsheaders
windowsx.h>
//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);
break;
caseWM_LBUTTONDOWN:
hdc=GetDC(hwnd);
BoundaryFill4(hdc,LOWORD(lParam),HIWORD(lParam),RGB(0,255,0),RGB(255,0,0));
//releasethedc
caseWM_DESTROY:
//killtheapplication,thissendsaWM_QUITmessage
PostQuitMessage(0);
//returnsuccess
}break;
default:
}//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;
wincla