计算机图形学课程设计作品

合集下载

111级计算机图形学课程设计

111级计算机图形学课程设计

计算机图形学课程设计报告课题名称 直线和圆中点Bresenham 算法小组成员林珊珊 0701 1307101118 王金韬 0701 1307101123陈文辉 0702 1307101215 周叶青 0702 1307101224院、系、部 数理系专 业 信息与计算科学 指导教师 林杰※※※※※※※※※ ※※ ※※ ※※ ※※※※※※※※※2007级学生计算机图形学课程设计目录1、课程设计目的 (2)2、课程设计描述及要求 (2)3、系统开发环境 (2)4、直线的Bresenham算法原理 (2)4.1中点Bresenham算法 (2)4.2该进的Bresenham算法 (5)5、圆的Bresenham算法原理 (7)6、程序运行结果 (9)7、总结 (11)8、参考资料 (11)9、附录 (11)计算机图形学课程设计报告1.课程设计目的本学期系统学习了计算机图形学的概论原理,在学期期末按课程要求进行实验。

通过实验,进一步理解和掌握中点算法、Bresenham 算法和二阶差分算法, 并掌握以上算法生成圆和直线等图形的基本过程,提高学生对计算机图形学的了解与运用技巧,同时通过此次课程设计提高动手实践能力与学习分析能力。

2.课程设计描述及要求 ●直线中点Bresenham 算法掌握中点Bresenham 算法绘制直线的原理,设计中点Bresenham 算法,编写Mbline()子函数,使用中点Bresenham 算法绘制斜率为0≦k ≦1的直线 ●圆中点Bresenham 算法掌握八分法中点Bresenham 算法绘制圆的原理,设计八分法绘制圆的中点Bresenham 算法,编写八分法绘制圆的CirclePoint(x,y)子函数,编写绘制整圆的Mbcircle()子函数,使用中点Bresenham 算法绘制圆心位于屏幕客户区中心的圆。

此次课程设计的课题为通过编程,实现圆和直线等基本图形的绘制。

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计《计算机图形学》课程设计报告VC++扫雷游戏的程序设计专业班级:小组成员:指导老师:日期:2012年12月24日1、需求分析本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。

该设计以V isual C++ 6.0为开发环境, Windows 7/XP为程序运行平台。

在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。

整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。

程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。

通过本课程设计,以便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。

2.总体设计2.1 功能概述扫雷游戏的游戏界面如图1所示。

在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。

图1游戏开始时,系统会在雷区中随机布下若干个地雷。

安放地雷的小方块称之为雷方块,其他的称之为非雷方块。

部署完毕后,系统会在其他非雷方块中填充一些数字。

某一个具体数字表示与其紧邻的8个方块中有多少雷方块。

玩家可以根据这些信息去判断是否可以鼠标点击方块,并把认为是地雷的方块打上标识。

当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。

在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。

游戏规则总结:●开始:按左键开始游戏,按按钮或菜单重新开始。

●左键:按下时,是雷则结束,非雷则显示数字。

●数字:代表此数字周围一圈八格中雷的个数。

●右键:奇次按下表示雷,偶数按下表示对上次的否定。

●结束:左键按到雷结束,找出全部雷结束。

在游戏开始后,雷区上方有两个计数器。

右边的计数器显示用户扫雷所花费的总时间,以秒为单位;左边的计数器显示当前还剩余多少个雷方块。

计算机图形学课程设计

计算机图形学课程设计

课程设计报告课程名称计算机图形学课题名称飘扬的旗帜专业计算机科学与技术班级计算机0502学号200503010203姓名蒋维琴指导教师刘长松2008年7 月10 日湖南工程学院课程设计任务书课程名称计算机图形学课题飘扬的旗帜专业班级计算机0502学生姓名蒋维琴学号200503010203指导老师刘长松审批任务书下达日期2008年6 月28 日任务完成日期2008 年7 月10 日一、设计内容与设计要求1.设计内容:飘扬的旗帜,要求该旗帜中有几何图形,旗帜不停地飘动,同时可断地移动,移动的路线可以随机,要求按ESC停止转动,按↑加快速度,按↓减慢速度。

2.设计要求:在屏幕上连续出现飘扬的旗帜,同时不断地在上、下、左、右移动;按↑加快移动速度,按↓减慢移动速度。

3.算法提示:可用自由曲线(Bezier曲线、或B样条曲线)或自由曲面(Bezier曲面、或B样条曲面)来设计旗帜的形状,并将坐标用数组保存;不断改变曲线或曲面的坐标值,可得到不同的曲线形状。

对三维曲面,还可用坐标变换来改变曲线的形状;对移动的路线可以选择一条规则曲线,用随机函数来产生它的起始值和幅度。

当旗帜移动到屏幕的两端时又产生一条新的确良曲线。

这样屏幕上用将产生了不同的移动曲线。

二、进度安排第18 周星期五8 时00分——12时00分星期五14 时30分——18时30分星期六8 时00分——12时00分附:课程设计报告装订顺序:封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。

正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。

正文总字数要求在5000字以上(不含程序原代码)。

目录一、主要功能 (1)二、功能模块的划分 (1)2.1画旗杆 (1)2.2画旗面 (1)2.3画五角星 (1)2.4飘动速度 (1)三、主要功能的实现 (2)3.1总体流程图 (2)3.2画旗面 (2)3.3画五角星 (3)四、程序调试 (4)4.1调试问题 (4)4.2调试结果 (5)五、总结 (5)六、附件: (6)源程序清单 (6)计算机科学与技术系课程设计评分表 (10)一、主要功能画一面红旗,包括旗杆、旗面、五角星。

计算机图形学课程设计

计算机图形学课程设计

《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年11 月15 日一、课程设计报告内容说明:1 、直线:1.1 点生成直线利用for 循环,用pDC->SetPixel(int x,int y,RGB(a,b,c))像素函数画出直线。

1.2 DDA :根据直线的微分方程来产生直线,即dy/dx=△y/△x=(12y y -)/(12x x -)=k其中(1x ,1y )、(2x ,2y )是直线的两个端点坐标。

DDA 算法的原理是增量法,即使x 和y 同时以很小的步长增长,每次增长量与x 和y 的一阶导数成正比。

直线的一阶导数是与△x 和△y 成正比的函数。

可以将x 和y 各递增ε△x 和ε△y 来产生线,ε是很小的量。

从当前画线任意点的位置(i x ,i y )上分别递增两个增量ε△x 和ε△y ,就可以得到直线增长的下一个(1+i x ,1+i y )的坐标位置公式如下1+i x =ix +ε△x1+i y =i y +ε△y1.3 金刚石将圆分为20份,利用直线生成的MoveTo 和LineTo 函数,使每个点与其他点相连。

展示图形为:点生成直线、数值微分法画直线、金刚石 2、曲线2.1 直角坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。

如:正弦曲线:参数方程如下 x_SIN=1000*t; y_SIN=1000*sin(t);极坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。

如:四叶图:参数方程如下r_SIYE=5000*sin(2*t); x_SIYE=r_SIYE*cos(t); y_SIYE=r_SIYE*sin(t);2.2 以实际工作中应用较多的参数样条曲线为例:参数样条曲线定义:给定n+1个控制点Pi (i =0,1,2,…,n ),n 次B 样条曲线段的参数表达式为: 。

依次用线段连接控制点Pi (i =0,1,2,…,n )组成的多边形称为B 样条曲线控制多边形。

计算机图形学作品设计报告

计算机图形学作品设计报告

计算机图形学作品设计报告题目:用VC++来制作一个五子棋的小游戏小组成员:徐毅____________________________二0一五年六月1 需求分析五子棋是传统的黑白棋之一,是非常经典的棋类,至今仍旧受到许多人的喜爱,但是如今网上有许多的五子棋小游戏,都只添加的人机对战的功能,而人机对战有一个无法忽视的缺点,就是程序都是实现写好的,电脑会主动拦截三点以上的棋路,但是利用这点摆连阵的话,赢过电脑会太简单,没有人人对战的实感,但很多五子棋小游戏在没有合适平台的情况下无法实现人人对战,所以我想开发一个能实现人人对战的五子棋小游戏2 总体设计首先,五子棋的游戏流程无非便是决定谁先落子,双方落子阶段,判定是否五子相连,如一方五子相连,则游戏结束,五子相连方胜利,因此,游戏类的结构图如下游戏结束3 详细设计首先是定义棋盘类,以下是棋盘的设计CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 // SetTimer(1,2000,NULL);for(i = 0 ; i<14; i++)for(j= 0 ;j <14 ;j++)board[i][j] = 2; // 初始化棋盘数组for(i = 0 ; i <14 ; i++) //对14列进行隔行扫描,for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;}count ++;}for(i = 0 ; i <14 ; i++) //对14行进行隔行扫描for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <10; i++) //对交叉的情况-东南-西北走向-进行扫描 for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;} count ++;}for(i = 0 ; i <10 ; i++) //对交叉的情况-东北-西南走向-进行扫描 for(j=13 ; j >= 4 ; j--){for( k = 0 ; k <5 ;k++){ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true;} count ++;}其中可以自己定义先后手的顺序,算法如下player = true;count = 0 ;m_board = new CBitmap;m_white = new CBitmap;m_black = new CBitmap;m_temp = new CBitmap;m_red = new CBitmap;// m_bitmap4 = new CBitmap;也可以用比权值大小的方法决定,算法如下pwin = false;cwin = false;player = true;over = false;computer = false;cgrade = 0 ;pgrade = 0 ;for(i = 0 ;i <14; i++)for(j = 0 ; j <14 ; j++){ ppgrade[i][j] = 0 ;ccgrade[i][j] = 0 ;}for(i=0 ; i <=1 ;i++)for(j=0 ; j<480 ; j++)win[i][j] = 0 ;count = 0 ;CDC thmem2 ; //thmem3CClientDC dc(this);thmem2.CreateCompatibleDC(&dc);thmem2.SelectObject(m_board);dc.BitBlt (0,0,320,320,&thmem2,0,0,SRCCOPY);Invalidate(false);}然后是落子阶段,算法如下void CMyDlg::Computer (){//以下函数时设置权值的功能,为计算机选择最佳的落子点做好准备for(i = 0 ; i<= 13 ; i++)for( j= 0 ; j <=13 ;j++){ppgrade[i][j] = 0 ;if(board[i][j] ==2)for(k=0 ; k <480 ; k++)if(ptable[i][j][k]){switch(win[0][k]){case 1:ppgrade[i][j] +=5;break;case 2:ppgrade[i][j] +=50;break;case 3:ppgrade[i][j] +=100;break;case 4:ppgrade[i][j] +=400;break;}}}for(i = 0 ; i<= 13; i++)for(j=0 ; j<=13;j++){ccgrade[i][j] = 0 ;if( board[i][j]==2)for(k=0 ; k <480 ; k++)if(ctable[i][j][k]){switch(win[1][k]){case 1:ccgrade[i][j] +=5;break;case 2:ccgrade[i][j] +=50;break;case 3:ccgrade[i][j] +=100;break;case 4:ccgrade[i][j] +=400;break;}}}if(start){//选择计算机开始落子的位子if( board[7][7] == 2){m = 7;n = 7;}else{m = 8 ;n = 8;}start = false;}else{for(i= 0 ; i<14 ; i++)for( j = 0 ; j<14;j++)if(board[i][j] ==2){//以下是选择计算机权值最大的点,和当时的权值if(ccgrade[i][j] >= cgrade){cgrade = ccgrade[i][j];mat = i;nat = j;}//以下是选择个人权值最大的点,和当时的权值if(ppgrade[i][j] >= pgrade){pgrade = ppgrade[i][j];mde = i;nde = j;}}//看计算机最大的值跟个人最大的值那个大,如果计算机大的话,那就进攻if(cgrade >= pgrade) //for attack;{m = mat;n = nat;}//否则的话那就防守else{m = mde;n = nde;}}cgrade = 0 ;pgrade = 0 ;board[m][n] = 1; //paste the computer chess in this position;ccount ++;if((ccount ==98 )&&(pcount ==98)){tie = true;over = true;}//跟人下好一个棋后所做的处理是一致的for( i= 0 ; i<480 ; i++){if(ctable[m][n][i]&&win[1][i] !=8 )win[1][i]++;if(ptable[m][n][i]){ptable[m][n][i] = false;win[0][i] = 8;}}player = true; //call the player to startcomputer = false;}而在落子阶段,每次落子都要扫描棋盘,有一方获胜则游戏结束void CMyDlg::dostep(){// TODO: Add your message handler code here and/or call defaultCDC thmem2 ; //thmem3CClientDC dc(this);thmem2.CreateCompatibleDC(&dc);// thmem3.CreateCompatibleDC(&dc);int ii,jj,kk;if(!over){if(computer)Computer();for(i=0 ; i<=1 ;i++)for(j=0 ; j<480 ; j++){if(win[i][j] == 5)// 看是否5子连书了,是的话,用红色的棋子显示以下,然后打出一句话if(i==0){ //人赢了pwin = true;over = true;for(ii= 0 ; ii <=13 ;ii++)for(jj = 0 ; jj <=13 ;jj++)if(ptable[ii][jj][j] == true){thmem2.SelectObject(m_temp);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject(m_red);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,SRCAND);}// MessageBox("恭喜你,你赢了");for(ii= 0 ; ii <10000 ; ii++)for(jj = 0 ; jj <30000 ; jj++);break;}else{//计算机赢了cwin = true;over = true;for(ii= 0 ; ii <=13 ;ii++)for(jj = 0 ; jj <=13 ;jj++)if(ctable[ii][jj][j] == true){thmem2.SelectObject (m_temp);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_red);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,SRCAND);}// MessageBox("你输了,要继续请重新开始");for(ii= 0 ; ii <10000 ; ii++)for(jj = 0 ; jj <15000 ; jj++);break;}if(over)break;}}//没有五子连书的情况的下,就简单的把子显示一下for(i = 0 ; i <=13 ; i++)for( j = 0 ; j<= 13 ; j++){if(board[i][j]==0){thmem2.SelectObject (m_temp);dc.BitBlt(j*20+25,i*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_black);dc.BitBlt (j*20+25,i*20+15,20,20,&thmem2,0,0,SRCAND);// m_byColour = white ;// UpdataData(FALSE);for(ii= 0 ; ii <1000 ; ii++)for(jj = 0 ; jj <1000 ; jj++);// dc.TextOut (50,400," 轮到你了");}if(board[i][j] == 1){thmem2.SelectObject (m_temp);dc.BitBlt(j*20+25,i*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_white);dc.BitBlt (j*20+25,i*20+15,20,20,&thmem2,0,0,SRCAND);m_byColour = black;// UpdateData();for(ii= 0 ; ii <1000 ; ii++)for(jj = 0 ; jj <1000 ; jj++);}}//人赢,打出这句话if(pwin){ MessageBox("你赢得了胜利");// dc.TextOut (50,360,"你赢了,按下restart键,重新开始!");// KillTimer(1);}// 计算机赢,打出这句话if(cwin){ MessageBox("你失败了");//dc.TextOut (50,360,"你输了,按下restart键,重新开始!");// KillTimer(1);}同时,可以自己改变光标的类型BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){CPoint point, pt;::GetCursorPos(&point);ScreenToClient(&point);if (point.y>=15 && point.x>=25 && point.y <= 315 && point.x <=325&& !over){::SetCursor(AfxGetApp()->LoadCursor(m_byColour ? IDC_BLACK_CURSOR:IDC_WHITE_CURSOR));return TRUE;}return CDialog::OnSetCursor(pWnd, nHitTest, message);}/*BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){// TODO: Add your message handler code here and/or call defaultreturn CDialog::OnSetCursor(pWnd, nHitTest, message);}*/觉得这一局已经不想玩了,可以重新开始void CMyDlg::Onrestart(){// TODO: Add your control notification handler code herefor(i = 0 ; i<14; i++)for(j= 0 ;j <14 ;j++)board[i][j] = 2;for(i = 0 ; i <14 ; i++)for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++)ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;}count ++;}for(i = 0 ; i <14 ; i++)for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <10; i++)for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;}count ++;}for(i = 0 ; i <10 ; i++)for(j=13 ; j >= 4 ; j--){for( k = 0 ; k <5 ;k++)ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true;}count ++;}4 源程序#include "stdafx.h"#include "五子棋.h"#include "五子棋Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifint board[14][14]; //棋盘数组BOOL ptable[14][14][480]; //人的所有可能的赢法数组BOOL ctable[14][14][480]; //计算机所有可能的赢法数组int ccgrade[14][14] ={0}; //计算机的权值数组int ppgrade[14][14] ={0}; //人的权值数组int cgrade,pgrade;int win[2][480]; // win[0][480]表示人在480中赢法的值,当他的一个值是5时表示他已经赢了// win[1][480]表示计算机在480中赢法的值,当他的一个值是5时表示他已经赢了int pcount,ccount;BOOL player,computer,start = true ,over , pwin, cwin, tie; //这里都时一些标记其中tie表示是否平局的标记int i,j,k,m,n,count;int mat,nat,mde,nde;char str[14];5 程序运行效果图初始界面失败界面胜利界面[参考文献][1]李继芳,王仁芳,柴本成,邹云兰,计算机图形学,清华大学出版社[2] 关于网络五子棋的需求分析/link?url=HrlLPxfvG8eSPt7Qa8kkTzGUkLUIi5RcOltOBe68Or5whrJ-lY 7mh48giibhD9_ZtwZTwk3COUxphU1FIY7ktys5_hpdBbvv3j86pfp-QJq[3] 关于五子棋的代码实现与应用/blog/959352[4] 简单版五子棋小游戏的核心算法/chenyujing1234/article/details/7472878。

计算机图形学课程设计透视投影图三视图

计算机图形学课程设计透视投影图三视图

计算机图形学程序课程设计题目:分别在四个视区内显示空间四面体的三视图、透视投影图。

学院:信息科学与技术学院专业:计算机科学与技术姓名:oc学号:oc电话:oc邮箱:oc目录一、设计概述(1)设计题目。

2(2)设计要求。

2(3)设计原理。

2(4)算法设计。

5(5)程序运行结果。

9二、核心算法流程图。

10三、程序源代码。

12四、程序运行结果分析。

24五、设计总结分析。

25六、参考文献。

26一.设计概述•设计题目计算机图形学基础(第二版)陆枫何云峰编著电子工业出版社P228-7.16:利用OpenGL中的多视区,分别在四个视区内显示图7-41所示空间四面体的主视图、俯视图、侧视图、透视投影图。

•设计要求设计内容:1. 掌握主视图、俯视图、侧视图和透视投影变换矩阵;2. 掌握透视投影图、三视图生成原理;功能要求:分别在四个视区内显示P228-图7-41所示空间四面体的主视图、俯视图、侧视图、透视投影图。

•设计原理正投影正投影根据投影面与坐标轴的夹角可分为三视图和正轴测图。

当投影面与某一坐标轴垂直时,得到的投影为三视图,这时投影方向与这个坐标轴的方向一致,否则,得到的投影为正轴测图。

1.主视图(V面投影)将三维物体向XOZ平面作垂直投影,得到主视图。

由投影变换前后三维物体上点到主视图上的点的关系,其变换矩阵为:Tv=Txoz= [1 0 0 0][0 0 0 0][0 0 1 0][0 0 0 1]Tv为主视图的投影变换矩阵。

简称主视图投影变换矩阵。

2.侧视图(W面投影)将三维物体向YOZ平面作垂直投影,得到侧视图。

为使侧视图与主视图在一个平面内,就要使W面绕Z轴正向旋转90°。

同时为了保证侧视图与主视图有一段距离,还要使W面再沿X方向平移一段距离x0,这样即得到侧视图。

变换矩阵为:Tv=Tyoz= [ 0 0 0 0 ][-1 0 0 0 ][ 0 0 1 0 ][-x0 0 0 1]Tv为主视图的投影变换矩阵。

计算机图形学课程设计完本

计算机图形学课程设计完本

1中文摘要本次课程设计采用OpenGL来完成。

OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。

OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

本次课程设计是在win7系统下VC++6.0中的win32环境中,通过使用OpenGL所提供的标准库函数,综合图形学里的坐标转换,投影变换,光照以及纹理等知识,实现一个简单的太阳系的运行状况。

该系统仅做演示使用,将只包括太阳,地球与月亮,并且不保证相关数据的设定准确性。

目录一、课程设计任务及要求 (1)二、需求分析 (1)三、系统设计 (1)四、详细设计 (3)4.1 初始化的设定 (3)4.2 光源的位置与观察位置的设定 (4)4.3 纹理映射的设置 (5)4.4 各星球球体的绘制 (7)4.5 星球公转轨道 (9)4.6 人机交互式的实现 (10)五、运行调试与分析讨论 (12)5.1 程序运行截图 (12)5.2 结果分析 (13)六、设计体会与小结 (14)七、参考文献 (16)一、课程设计任务及要求1.利用OpenGL创建太阳,地球,月亮三个球体。

2. 实现“月亮绕着地球转,地球绕着太阳转”。

3. 为太阳,地球,月亮附上不同的纹理。

4. 具有较好的动画效果,消除闪烁现象。

5. 其他功能的添加。

二、需求分析本次课程设计使用的编译软件为Visual C++ 6.0。

设计中通过调用OpenGL函数库以来完成太阳,月亮,地球的球体绘制与纹理的加载,通过矩阵的变换以实现星球的运动效果。

从而模拟出太阳系的运行效果动画。

在之后,加入星球的轨道轨迹,使得模拟系统3D效果更加明显。

并加入人机交互操作。

通过“q,w,e,s,a,d”键来调整观察视角,可以实现全方位对此系统进行观察,使系统具有一定的可操作性。

三、系统设计本次课题为:实现太阳系运行动画。

系统设计步骤为:1.太阳,地球,月亮三个球体的创建。

计算机图形学课程设计完本

计算机图形学课程设计完本

1中文摘要本次课程设计采用OpenGL来完成。

OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。

OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

本次课程设计是在win7系统下VC++6.0中的win32环境中,通过使用OpenGL所提供的标准库函数,综合图形学里的坐标转换,投影变换,光照以及纹理等知识,实现一个简单的太阳系的运行状况。

该系统仅做演示使用,将只包括太阳,地球与月亮,并且不保证相关数据的设定准确性。

目录一、课程设计任务及要求 (1)二、需求分析 (1)三、系统设计 (1)四、详细设计 (2)4.1 初始化的设定 (2)4.2 光源的位置与观察位置的设定 (3)4.3 纹理映射的设置 (3)4.4 各星球球体的绘制 (5)4.5 星球公转轨道 (7)4.6 人机交互式的实现 (8)五、运行调试与分析讨论 (9)5.1 程序运行截图 (9)5.2 结果分析 (10)六、设计体会与小结 (11)七、参考文献 (12)一、课程设计任务及要求1.利用OpenGL创建太阳,地球,月亮三个球体。

2. 实现“月亮绕着地球转,地球绕着太阳转”。

3. 为太阳,地球,月亮附上不同的纹理。

4. 具有较好的动画效果,消除闪烁现象。

5. 其他功能的添加。

二、需求分析本次课程设计使用的编译软件为Visual C++ 6.0。

设计中通过调用OpenGL函数库以来完成太阳,月亮,地球的球体绘制与纹理的加载,通过矩阵的变换以实现星球的运动效果。

从而模拟出太阳系的运行效果动画。

在之后,加入星球的轨道轨迹,使得模拟系统3D效果更加明显。

并加入人机交互操作。

通过“q,w,e,s,a,d”键来调整观察视角,可以实现全方位对此系统进行观察,使系统具有一定的可操作性。

三、系统设计本次课题为:实现太阳系运行动画。

系统设计步骤为:1.太阳,地球,月亮三个球体的创建。

2.利用坐标矩阵变换表示出三个球体之间的关系,即:地球绕着太阳转,月亮绕着地球转。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学V i s u a l c++版》考试作业报告题目:计算机图形学图形画板
专业:推荐IT学长淘宝日用品店530213
班级:推荐IT学长淘宝日用品店530213
学号:推荐IT学长淘宝日用品店530213
姓名:推荐IT学长淘宝日用品店530213
指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。

设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。

通过这次设计,要求在加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

二、设计内容推荐IT学长淘宝日用品店530213
设计一个图形画板,在这个图形画板中要实现:
1,画线功能,而且画的线要具备反走样功能。

2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。

3,可以对选中区域的图形放大,缩小,平移,旋转等功能。

三、设计过程
程序预处理:包括头文件的加载,常量的定义以及全局变量的定义
#include ""
#include ""
#include ""
#include ""
#include ""
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
=0;
temp[0].y=0;
temp[1].x=0;
temp[1].y=0;
CView::OnRButtonDown(nFlags, point);
填充:通过实现RunFill函数实现填充
CPoint stack[1000000];
void CGraDesignView::RunFill(CPoint point)
{
CPoint p;
int top;
COLORREF r;
CClientDC dc(this);
top=0;
stack[top]=point;
top++;
while(top!=0)
{
top--;
p=stack[top];
r=(p);
if(r != RGB(255,255,255)) continue;
(p,RGB(0,255,0));
r=+1,;
if(r == RGB(255,255,255) && r!=RGB(0,255,0))
{
stack[top].x=+1;
stack[top].y=;
top++;
}
r=,;
if(r == RGB(255,255,255) && r!=RGB(0,255,0))
{
stack[top].x=;
stack[top].y=;
top++;
}
r=,+1);
if(r == RGB(255,255,255)&& r!=RGB(0,255,0))
{
stack[top].x=;
stack[top].y=+1;
top++;
r=,;
if(r == RGB(255,255,255) && r!=RGB(0,255,0))
{
stack[top].x=;
stack[top].y=;
top++;
}
}
}
void CGraDesignView::Ontobig()
{
type = 6;
}
推荐IT学长淘宝日用品店530213
1.需求分析
本程序将实现多功能画板的功能:
1,画线功能,而且画的线要具备反走样功能。

2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。

3,可以对选中区
域的图形放大,缩小,平移,旋转等功能。

2.概要设计
RunLine(CPoint CP0, CPoint CP1) //反走样直线
RunRectangle(CPoint CP0, CPoint CP1) //矩形
RunEllipse(CPoint CP0, CPoint CP1) //椭圆
RunFill(CPoint point) //填充
OnLButtonDown(UINT nFlags, CPoint point) //鼠标左键
OnRButtonDown(UINT nFlags, CPoint point) //鼠标右键
3.详细设计
RunLine函数绘制任意斜率的直线,并且添加反走样算法,通过OnLButtonDown,OnLButtonUp函数记录鼠标的点击位置
利用画线功能通过实现RunRectangle函数画出矩形
利用画线功能通过实现RunEllipse函数画出椭圆
利用画线功能通过鼠标左键函数OnLButtonDown取点,用鼠标右键函数OnRButtonDown实现回到原点4.调试分析
仅画图功能初步实现,而放大,缩小,平移,旋转等功能依然无法实现。

5.用户使用说明
1、运行
2、选择功能面板上的类型
3、选择功能(画线,矩形,椭圆,多边形,填充)
4、在画板上画图
6.测试结果
1,直线:
2,矩形
3,椭圆
5,填充
7.附录
带注释的源程序。

如果提交源程序软盘,可以只列出程序文件名的清单。

四、课程设计体会
通过做这个画板设计实验,一方面把所学的知识整合到一起并通过画板表现出来,通过这次设计,实现对直线,矩形,多边形的绘制,还有通过自创类来实现消隐的功能,通过研究与合作,更熟练了用指针进行扫描来绘制这些图形,以及提高对这门课程的兴趣。

推荐IT学长淘宝日用品店530213。

相关文档
最新文档