山东科技大学计算机图形学实验指导书Word文档格式.docx

上传人:b****2 文档编号:1474531 上传时间:2023-04-30 格式:DOCX 页数:33 大小:449.98KB
下载 相关 举报
山东科技大学计算机图形学实验指导书Word文档格式.docx_第1页
第1页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第2页
第2页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第3页
第3页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第4页
第4页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第5页
第5页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第6页
第6页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第7页
第7页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第8页
第8页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第9页
第9页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第10页
第10页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第11页
第11页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第12页
第12页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第13页
第13页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第14页
第14页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第15页
第15页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第16页
第16页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第17页
第17页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第18页
第18页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第19页
第19页 / 共33页
山东科技大学计算机图形学实验指导书Word文档格式.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

山东科技大学计算机图形学实验指导书Word文档格式.docx

《山东科技大学计算机图形学实验指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《山东科技大学计算机图形学实验指导书Word文档格式.docx(33页珍藏版)》请在冰点文库上搜索。

山东科技大学计算机图形学实验指导书Word文档格式.docx

gdiver,&

gmode,”C:

\\BC31\\BGI”);

//进行图形初始化,//图形卡的采用自动检//测模式,同时//假设BC系统安装在C盘的BC31子目//录下。

setcolor(4);

//设定当前前景色为红色

circle(300,300,100);

//以点(300,300)为圆心,100为半径画//圆周。

setcolor

(2);

//设定当前前景色为绿色

line(100,100,100,600);

//在点(100,100)和点(100,600)之间画一条//直线段,并和以下三句结合,画出长为//500宽为400的矩形。

line(100,500,500,500);

line(500,500,500,100);

line(500,100,100,100);

getch();

//从键盘上获取一个字符,在此表示暂停,供//操作者观察图形。

closegrap();

//关闭图形模式。

}

2.综合应用TurboC中图形库函数,进行图形设计与绘制

TurboC的库函数见附录A

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

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

(1)、在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作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。

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为前缀,并且函数名的最后一个字母指出所用的数据类型,如:

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

......

除了上述的基本图元外,函数glRectf(x1,y1,x2,y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。

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

glRectf(10.0f,10.0f,50.0f,50.0f);

1.通过实现三种直线和圆生成算法对算法原理加深理解。

2.熟悉TurboC开发环境,要求会对程序进行编辑,编译,调试(包括分步,断点设置等调试手段)。

在TurboC环境下实现三种直线生成算法。

1)对逐点比较法、DDA算法、Bresenham算法进行理解。

2)画出程序流程图;

3)编写程序的源程序;

4)编辑源程序并进行调试;

5)进行特殊模式的运行测试,并结合情况进行调整;

6)打印源程序或把源程序以文件的形式提交。

四、实验报告

1)按实验报告册格式书写实验报告;

2)提交源程序文件或打印件。

五、建立工程步骤

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

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

1.加深对填充算法的理解。

2.综合运用以前学过数据结构和算法设计知识。

在TurboC环境下实现扫描线种子填充算法和Y-X算法。

1)对扫描线种子填充算法和Y-X算法、编码裁剪算法、中点分割裁剪算法进行复习理解进行复习理解。

5)打印源程序或把源程序以文件的形式提交。

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

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

return(0);

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:

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

//createthewindow

(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(&

}//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)声明函数

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

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

2.

下面的程序绘制的是一个简单的太阳系,其中包括一个太阳和一颗行星,它们使用线框球体绘制函数实现。

当按下键盘“D”或“d”时,行星将实现自转;

按下键盘“Y”或“y”时,行星将绕太阳公转。

请同学们认真读懂每一段代码,然后试着修改这段程序,实现

1)将行星的中心倾斜;

2)给行星加上卫星。

GL/glut.h>

stdlib.h>

staticintyear=0,day=0;

voidinit(void)

voiddisplay(void)

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,1.0,1.0);

glPushMatrix();

 //glutWireSphere中第一、二、三个参数分别表示半径,经度线数、纬度线数

glutWireSphere(1.0,20,16);

/*drawsun*/

glRotatef((GLfloat)year,0.0,1.0,0.0);

glTranslatef(2.0,0.0,0.0);

glRotatef((GLfloat)day,0.0,1.0,0.0);

glutWireSphere(0.2,10,8);

/*drawsmallerplanet*/

glPopMatrix();

glutSwapBuffers();

voidreshape(intw,inth)

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

gl

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2