计算机图形学课程设计作品
- 格式:docx
- 大小:16.47 KB
- 文档页数:4
计算机图形学课程设计报告课题名称 直线和圆中点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.利用坐标矩阵变换表示出三个球体之间的关系,即:地球绕着太阳转,月亮绕着地球转。
计算机图形学课程设计立方体线框模型学院:资环学院班级:地科 2 班学号:************姓名:***立方体线框模型一、设计目的1.掌握矩阵乘法的编程实现;2.熟悉二维变换;3.掌握三维立体图形的绘制;4.掌握三维绕轴旋转几何变换矩阵;5.掌握使用点表构造立方体线框模型的方法;6.掌握立方体线框模型二维正交投影图的绘制方法;7.熟悉立方体线框模型二维正交投影图的旋转方法。
二、设计要求1、设计、定义包含齐次坐标的三维点类CP3;2、设计三维几何变换类实现立方体的旋转功能,定义表面类;3.设计三维坐标系0xyz的原点为立方体体心绘制立方体线框模型;4.设计双缓冲技术,先在MemDC中绘图,然后用BitBlt将图形复制到p DC中,同时禁止背景刷新;5.生成正多边形、绘制几何变换图形;6.使用定时器动态更新图形,让图形看起来是在转动。
三、设计原理立方体线框模型的顶点坐标为三维坐标,需要构造三维点类CP3来存储顶点坐标。
同时构造直线类Cline来绘制立方体线框模型的边线。
立方体线框模型围绕体心的旋转来使用旋转变换矩阵实现的。
立方体线框模型的正交投影其各个表面四边形。
四、设计方法1.三维变换。
定义了规范齐次坐标以后,三维图形的几何变换可以表达为图形顶点集合的规范化齐次坐标矩阵与某一变换矩阵相乘的形式。
用规范化齐次坐标表示的三维变换矩阵式一个4X4方阵。
立方体旋转变换的基本方法是把旋转变换矩阵作用到变换前的立方体顶点的规范化齐次坐标矩阵上,得到变换后新的立方体顶点的规范化齐次坐标矩阵。
2.正交投影。
立方体的三维坐标系Oxyz是x轴向右,y轴向上,z轴指向观察者。
绘制立方体在xOy面上的正交投影时,直接去z坐标为0。
3.双缓冲。
用双缓冲以及定时器控制图形转动。
立方体线框模型的顶点坐标为三维坐标,需要构造三维点类CP3来存储顶点坐标。
同时构造直线类Cline来绘制立方体线框模型的边线。
立方体线框模型围绕体心的旋转来使用旋转变换矩阵实现的。
《计算机图形学》课程设计报告学生姓名:学号:学院:班级:题目: 简单图形的绘制职称2015年7月1日目录目录 (I)一、选题背景 (1)二、算法设计 (2)2.1 绘制直线、圆、椭圆、抛物线 (2)2.1.1 绘制直线 (2)2.1.2 绘制圆 (2)2.1.3 绘制椭圆 (2)2.1.4 绘制抛物线 (2)2.2 三维几何变换 (2)三、程序及功能说明 (5)3.1 绘制直线、圆、椭圆、抛物线...... (5)3.1.1 绘制直线 (5)3.1.2 绘制圆 (5)3.1.3 绘制椭圆 (5)3.1.4 绘制抛物线 (6)3.2 图形的平移 (6)3.3 图形的旋转 (6)3.4 图形的缩放 (7)四、结果分析 (7)4.1 绘制直线、圆、椭圆、抛物线 (7)4.1.1 直线 (7)4.1.2 圆 (8)4.1.3 椭圆 (8)4.1.4 抛物线 (8)4.2 图形的平移 (9)4.3 图形的旋转 (10)4.4 图形的缩放 (11)五、总结 (10)六、课程设计心得体会 (14)参考文献 (15)源程序 (16)一、选题背景二、算法设计2.1 绘制直线、圆、椭圆、抛物线2.1.1 绘制直线通过两个点的坐标来绘制直线。
计算机图形学中二维图形在显示输出之前需要扫描转换,生成直线的算法一般有DDA 算法和中点算法。
2.1.2 绘制圆通过运用圆的参数方程cos ;sin x a r y b r θθ=+=+来绘制圆的图形,其中[0,2]θπ∈,(a,b )为圆心,r 为半径,运用参数方程,只需要确定半径的长度和圆心的位置,即可绘制出圆。
2.1.3 绘制椭圆通过运用椭圆的参数方程cos ;sin x a y b θθ==来绘制椭圆的图形,其中[0,2]θπ∈,是已知的变量,a ,b 分别为长半轴,短半轴,当确定a 和b 后,通过参数方程即可得到这个椭圆的方程。
2.1.4 绘制抛物线根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。
计算机图形学课程设计学院:计算机科学学院班级:学号:学生姓名:指导教师:2008年1月设计一一、课题说明用所学算法编写实现图形比例,移动,旋转变换的程序二、概要设计比例变换矩阵:移动变换矩阵:旋转变换矩阵:由于在640*480默认的显示模式下,原点(0,0)坐标在屏幕的左上角,左上角向右下角走,x 值增大,左上角向右上角走,y 值增大。
为了便于显示与理解,把原点定在(320,240)点。
则移动变换与旋转变换的矩阵就会改变。
旋转变换后,x 坐标变为:320+(x-320)*cos(a)-(240-y)*sin(a); y 坐标变为:240-(x-320)*sin(a)-(240-y)*cos(a)本程序通过一个三角形比例,移动,旋转变换演示比例,移动,旋转后的结果。
首先画出需要变换的三角形(通过给出三角形的三个顶点画出三角形),对三个三角形的顶点变换实现比例,移动,旋转变换操作。
三、源程序及注释#include <stdio.h>#include <graphics.h>/*加入c 图形库*/ #include <math.h>yidong(int dx,int dy)/*实现移动函数*/{moveto(320+dx,240-dy);lineto(420+dx,120-dy);lineto(450+dx,140-dy);lineto(320+dx,240-dy);/*变换三角形三个点的坐标实现移动变换*/}bilie(float Sx,float Sy) /*实现比例函数*/{moveto(320*Sx,240*Sy);lineto(420*Sx,120*Sy);lineto(450*Sx,140*Sy);lineto(320*Sx,240*Sy); /*变换三角形三个点的坐标实现比列变换*/}xuanzhuan(float a) /*实现旋转函数*/{float p;moveto(320,240);lineto(320+(420-320)*cos(a)-(240-120)*sin(a),240-(420-320)*sin(a)-(240-120)*cos(a));lineto(320+(450-320)*cos(a)-(240-140)*sin(a),240-(450-320)*sin(a)-(240-140)*cos(a));lineto(320,240); /*变换三角形三个点的坐标实现旋转变换*/}main(){int i,j;float X,Y,bx,by,a;int gdriver=DETECT,gmode; /*初始化显示模式参数*/initgraph(&gdriver,&gmode,""); /*初始化显示为默认的640*480、16色模式*/i=20;j=240;moveto(i,j);for(i=20;i<=620;i+=20) /*使用双循环画点函数画出表格中的纵坐标*/ lineto(i,240);i=320;j=20;moveto(i,j);for(j=20;j<=460;j+=20) /*使用双循环画点函数画出表格中的横坐标*/ lineto(320,j);moveto(320,240);lineto(420,120);lineto(450,140);lineto(320,240);/*画出需变换的三角形,其三个顶点分别为(320,240);(420,120) ;(450,140)*/printf("please input X,Y to move:");scanf("%f%f",&X,&Y); /*输入移动量*/yidong(X,Y);printf("please input bx,by to scale:");scanf("%f%f",&bx,&by); /*输入x方向,y方向缩放大小*/bilie(bx,by);printf("please input a to circumgyrate:");scanf("%f",&a); /*输入旋转角度,a为正,则逆时针旋转*/xuanzhuan(a);}四、运行结果移动(40,40)后的三角形原始三角形旋转45o后的三角x轴方向上缩小0.5倍后的三角形设计二一、课题说明编写一个AutoLISP程序,其功能是:画一个轴衬的两个视图,如图4所示。
计算机图形学计算机图形学》课程设计-(2015-- 2016 学年第二学期)学院专业班级学号学生姓名老师编写日期:目录真实感游戏场景绘制........................................... 3..一实验目的3...二实验内容3...三实验分工4...四理论基础4...1 雾化模型4...2 颜色模型5...3 光照模型6...4 纹理模型6...五系统描述1..3.1 墙壁、地面、箱子1..32 石柱、雪人1..43 玻璃球1..5.4 天空1..7.六心得体会1..9.七附录:程序源代码1..9计算机图形学真实感游戏场景绘制【摘要】本次课程设计绘制了一个真实感的三维场景,并实现场景漫游。
主要绘制了墙壁与地面、天空、石柱、箱子、玻璃球、雪人、雾等对象。
以Visual Studio2012为平台用OpenGL 基础知识实现此真实感场景的绘制。
一实验目的1.熟悉OpenGL 基础函数,并了解其用法。
2.通过程序模拟真实感游戏场景,掌握图形综合展示效果,基于专业背景,结合实验课内容与课程设计要求,使用OpenGL绘制简单的3D 真实感游戏场景,包括光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中的应用。
实验内容和效果光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中的应用,其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型以及环境光、漫反射、镜面反射等光照模型设置。
图1 游戏场景整体效果四理论基础1 雾化模型OpenGL 中提供了完整的雾化接口,我们只需要选择合适的雾气的混合因子、密度、颜色、起始位置等。
在OpenGL 中,雾的工作模式有两种:线性模式和指数模式。
这两种模式是根据雾的浓度变化来区分的。
在线性模式下,只需要提供一个距离视点的开始位置和结束位置。
从开始位置到结束位置之间,雾的浓度越来越高,浓度的变化和距离成正比。
在指数模式下,雾的浓度随着距离的增加呈指数增长。
计算机图形学课程设计学 院:计算机科学学院 班 级:学 号:学生姓名:指导教师:2008年1月设计一一、课题说明用所学算法编写实现图形比例,移动,旋转变换的程序二、概要设计比例变换矩阵:移动变换矩阵:旋转变换矩阵:由于在640*480默认的显示模式下,原点(0,0)坐标在屏幕的左上角,左上角向右下角走,x 值增大,左上角向右上角走,y 值增大。
为了便于显示与理解,把原点定在(320,240)点。
则移动变换与旋转变换的矩阵就会改变。
移动变换矩阵:旋转变换后,x 坐标变为:320+(x-320)*cos(a)-(240-y)*sin(a);y 坐标变为:240-(x-320)*sin(a)-(240-y)*cos(a)本程序通过一个三角形比例,移动,旋转变换演示比例,移动,旋转后的结果。
首先画出需要变换的三角形(通过给出三角形的三个顶点画出三角形),对三个三角形的顶点变换实现比例,移动,旋转变换操作。
三、源程序及注释#include <stdio.h> #include <graphics.h>/*加入c 图形库*/ #include <math.h>yidong(int dx,int dy)/*实现移动函数*/S x 0 0 0 S y 0 0 0 1 1 0 0 0 1 0 T x T y 1cos (a) sin (a) 0 -sin (a) cos (a) 0 0 0 11 0 00 1 0 T x -- T y 1{moveto(320+dx,240-dy);lineto(420+dx,120-dy);lineto(450+dx,140-dy);变换三角形三个点的坐标实现移动变换*/lineto(320+dx,240-dy);/*}实现比例函数*/bilie(float Sx,float Sy) /*{moveto(320*Sx,240*Sy);lineto(420*Sx,120*Sy);lineto(450*Sx,140*Sy);变换三角形三个点的坐标实现比列变换*/lineto(320*Sx,240*Sy); /*}实现旋转函数*/xuanzhuan(float a) /*{float p;moveto(320,240);lineto(320+(420-320)*cos(a)-(240-120)*sin(a),240-(420-320)*sin(a)-(240-120)*cos(a));lineto(320+(450-320)*cos(a)-(240-140)*sin(a),240-(450-320)*sin(a)-(240-140)*cos(a));变换三角形三个点的坐标实现旋转变换*/lineto(320,240); /*}main(){int i,j;float X,Y,bx,by,a;int gdriver=DETECT,gmode; /*初始化显示模式参数*/初始化显示为默认的640*480、16色模式 */ initgraph(&gdriver,&gmode,""); /*i=20;j=240;moveto(i,j);/*使用双循环画点函数画出表格中的纵坐标*/for(i=20;i<=620;i+=20)lineto(i,240);i=320;j=20;moveto(i,j);/*使用双循环画点函数画出表格中的横坐标*/for(j=20;j<=460;j+=20)lineto(320,j);moveto(320,240);lineto(420,120);lineto(450,140);lineto(320,240);/*画出需变换的三角形,其三个顶点分别为(320,240);(420,120) ;(450,140)*/printf("please input X,Y to move:"); scanf("%f%f",&X,&Y); /*输入移动量 */ yidong(X,Y);printf("please input bx,by to scale:"); scanf("%f%f",&bx,&by); /*输入x 方向,y 方向缩放大小 */ bilie(bx,by);printf("please input a to circumgyrate:"); scanf("%f",&a); /*输入旋转角度,a 为正,则逆时针旋转*/ xuanzhuan(a); }四、运行结果原始三角形移动(40,40)后的三角形旋转45o 后的三角x 轴方向上缩小0.5倍后的三角形设计二一、课题说明编写一个AutoLISP程序,其功能是:画一个轴衬的两个视图,如图4所示。
课程设计任务书题目:弹跳的彩球动画课程设计任务书及成绩评定目录一、摘要 (1)二、总体设计方案及主要设计原理 (2)1.功能实现 (2)2.流程图 (2)2.1函数qiu的流程图 (2)2.2绘制球体的程序流程图 (2)2.3主程序流程图 (4)3.主要算法 (4)三、源程序代码 (5)四、测试及分析 (10)五、结束语 (11)一、摘要本课题实现一个着色的三维小球在一定的空间内按照一条给定的轨道(正弦衰弱曲线)不断弹跳并同时翻滚。
控制键为按ESC退出程序,按“↑”键完成运动加速,使得三维小球加快弹跳速度;按“↓”键完成运动减速,使得三维小球减慢弹跳速度。
并且小球在屏幕中连续不断的按照给定的曲线函数跳动,且三维小球自身也要进行翻滚。
该程序的主要模块分为如下部分:操作控制部分:该部分主要是实现对屏幕的操作,达到功能要求中按“ESC”结束程序,按“↑”加快三维小球运动,按“↓”减慢三维小球的运动。
球体绘制部分:该部分实现三维小球的绘制,其具体的是对三维球体的形状、大小、经纬线、以及在三维球体中填充颜色。
球体运动轨迹控制部分:该部分是确定球体在屏幕上的运动轨迹,从而达到程序要求的功能。
通过该部分,我们可以任意的对球体的运动轨迹进行设定,使得三维小球的运动丰富多彩。
背景控制部分:通过该部分,我们可以设定三维小球在什么样的背景下运动,对颜色的组合,使得背景更加丰富,从而完善程序的运行界面,达到美观的作用。
二、总体设计方案及主要设计原理1.功能实现通过运行程序,我们看到该程序的功能我们已经基本实现,当我们在三维小球在屏幕中按照预先给定的曲线函数路线进行运动,当我们从键盘输入“↑”时三维小球就加速运动。
当我们从键盘输入“↓”时,椭球体减速运动,按下“ESC”键就退出程序,最终达到了功能要求的目的。
2.流程图2.1函数qiu的流程图如图1所示为函数qiu的流程图:图1:函数qiu的流程图2.2绘制球体的程序流程图如图2、图3示为程序绘制球体的流程图:图2:球体绘制程序流程图1图3:球体绘制程序流程图22.3主程序流程图图4:主程序流程图3.主要算法可用绘制三维曲面(规则曲面、参数方程为:x=Rsin(α)cos(β), y=Rsin(α)sin(β), z=Rcos(α),0≤α≤180,0≤β≤360)来设计球体的形状,用轴测图将它绘制到屏幕上,并对球面上的小方格进行填充,选择5—10个不同方位的球体图形用getimage()命令将它们的图象保存;对以后路径上的图形只需用命令Putimage()调出即可。
《计算机图形学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。