计算机图形学作品设计报告
计算机图形学实验报告模板
巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。
由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。
DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。
特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。
同时也熟练运用OpenGL基本的绘图函数。
p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。
特别是对于DDA,Bresenham和画圆算法。
其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。
而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。
而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。
而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。
另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。
计算机图形学作品设计报告
计算机图形学作品设计报告题目:用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。
计算机图形学第五次实验报告
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
计算机图形学设计报告
计算机图形学设计报告专业班级: .NET113 学号: 201107082000 姓名:吉祥草指导老师:杜俊俐中原工学院软件学院2013年6月18日目录项目一:图形转换的绘制(C#) (1)项目二:画图工具(JAVA) (6)项目三:红绿灯绘制(JAVA) (9)项目四:五子棋游戏(JAVA) (13)项目一名称:图形转换的绘制一、设计目的1、练习2D图形的绘制技术;2、练习2D图形的几何变换技术3、练习2D图形的填充技术二、设计内容编程实现五星红旗的绘制三、设计方案与实现1、设计中的基本绘图功能及绘图函数,设计的总体安排用C#语言编写的程序,首先用自己学的专业语言来编写2D图形的绘制以及转换的技术。
2、图形数据及确定开始为转变的图形总体是有无数个空心圆组成的,每个圆圆心是同一点,但每个圆有不同的半径。
圆的边缘设置是白色的,除了边缘就是绿色的。
它们的边缘间的距离相等。
转变后的图形是无数个空心正方形和一个实心的绿色圆组成。
正方形边缘的间距也是等长的。
3、设计流程(1)为便于确定复杂图形之位置,先找出中心点,将它视为圆心,先设置一个半径为150长的绿色实心圆,然后画白色的圆,其中半色空心圆,半径要依次累加相同的数字。
(2)转变后的图形也用相同方法,圆心,绿色实心圆的半径都相同。
不过不是设置白色的圆,而是白色的正方形,边长也要依次累加相同的数字。
四、设计结果转换前的图形转换后的图形(抓图)五、设计总结陈述在程序设计和调试中遇到的主要问题及解决过程,对所用的知识深入理解的作用,设计语言等相应功能的掌握和程序设计能力的提高以及经验和体会,分析并提出改进设想等。
在设计过程中,我们所学的C#知识基础是很重要的,基础弄通,即使不会框架,也可以有一份事情做。
同时在做此程序时,也发现了很多的问题,比如说知识的健忘,在做的时候竟然不知道该怎么编程。
这就在提醒我们要时时刻刻得学习,不要对自己在学习上的松懈。
并且C#相关的知识虽然有点杂,有点多,但多学有益,让你永远不会松懈,这使我能更上一层楼。
计算机图形学课程设计报告
一、设计内容与要求、设计题目算法实现时钟运动、总体目标和要求(1)目标:以图形学算法为目标,深入研究。
继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。
(2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
(3)开发环境:、设计要求内容:(1)掌握动画基本原理;(2)实现平面几何变换;功能要求:(1)显示时钟三个时针,实现三根时针间的相互关系;(2)通过右键菜单切换时钟背景与时针颜色;设计方案通过使用OpenGL提供的标准库函数,综合图形学Bresenham画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。
根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。
再根据OpenGL颜色模型定义当前颜色。
设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。
最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。
二、总体设计、过程流程图1(1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。
2、中点椭圆算法内容:(1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。
设置初始点(x0,y0)的位置为(0,r2);(2)计算区域1中央决策参数的初始值p = ry*ry - rx*rx*ry + 1/4*(rx*rx);(3)在区域1中的每个Xn为止,从n = 0 开始,直到|K|(斜率)小于-1时后结束;<1>如果p < 0 ,绘制下一个点(x+1,y),并且计算p = p + r2*r2*(3+2*x);<2>如果P >=0 ,绘制下一个点(x+1,y-1),并且计算(4)设置新的参数初始值;p = ry*ry(X0+1/2)*(X0+1/2) + rx*rx*(Y0-1) - rx*rx*ry*ry;(5)在区域2中的每个Yn 为止,从n = 0开始,直到y = 0时结束。
计算机图形学实验报告_2
计算机图形学实验报告学号:********姓名:班级:计算机 2班指导老师:***2010.6.19实验一、Windows 图形程序设计基础1、实验目的1)学习理解Win32 应用程序设计的基本知识(SDK 编程);2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。
4)学习MFC 类库的概念与结构;5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);6)学习使用MFC 的图形编程。
2、实验内容1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。
(可选任务)2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,Thisis my first SDI Application"。
(必选任务)3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。
定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。
3、实验过程1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,Thisis my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。
4、实验结果正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。
计算机图形学实验报告
计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
计算机图形学课程设计报告简单图形的绘制
《计算机图形学》课程设计报告学生:学号:学院:班级:题目: 简单图形的绘制职称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 绘制椭圆 (6)3.1.4 绘制抛物线 (6)3.2 图形的平移 (6)3.3 图形的旋转 (7)3.4 图形的缩放 (7)四、结果分析 (8)4.1 绘制直线、圆、椭圆、抛物线 (8)4.1.1 直线 (8)4.1.2 圆 (8)4.1.3 椭圆 (9)4.1.4 抛物线 (9)4.2 图形的平移 (9)4.3 图形的旋转 (10)4.4 图形的缩放 (12)五、总结 (11)六、课程设计心得体会 (15)参考文献 (16)源程序 (17)一、选题背景二、算法设计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 绘制抛物线根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。
计算机图形学实验报告
实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
计算机图形学报告
计算机图形学 (2017年秋季学期) Array实验报告系别:计算机科学与技术班级:姓名:学号:实验名称:2-真实感图形绘制总成绩:评语:日期:《计算机图形学》实验报告实验名称真实感图形绘制实验序号 2实验日期2017.12.13 实验人一、实验目的、要求与环境1.目的:通过实验,学生应掌握通过计算机程序进行真实感图形绘制的基本原理,特别是对三维显示对象进行纹理映射的基本方法,将理论和实际应用切实结合起来。
2.要求:对一个三维立方体进行旋转,对其6个不同的面进行6个不同图像的纹理映射,并进行投影变换与显示,分析增强后的视觉效果,提交实验报告。
3.环境:Windows 7操作系统Microsoft Visual Studio 2005OpenGL函数库4. 自带位图文件(换成你自己的图像文件):二、实验内容与步骤1. 准备相关图像文件。
2. 进行立方体各面图像与旋转速度的大体设计。
3.在Windows 7 操作系统上,打开Microsoft Visual Studio 2005,编写相关程序,完成程序主体框架结构。
4.编写六面体显示相关的程序代码。
2022-4-26 2/122022-4-26 3/12GL_RGB, width, height, 0,GL_RGB, GL_UNSIGNED_BYTE, pBitmapData ); 14.进行纹理映射的语句例句:glBegin( GL_QUADS );glTexCoord2f( 0.0, 0.0 ); glVertex3f( -2.0, -2.0, -2.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( -2.0, 2.0, -2.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 2.0, 2.0, -2.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 2.0, -2.0, -2.0 );glEnd()四、编译过程截图五、实验结果与分析(下面是一个例子,换上你自己的图)实验结果:2022-4-26 5/122022-4-26 6/122022-4-26 7/122022-4-26 8/122022-4-26 9/122022-4-26 10/122022-4-26 11/122022-4-26 12/12。
计算机图形学课程设计报告1
目录1、课程设计目的 (1)2、系统功能介绍 (1)3、程序代码和分析 (2)4、总结 (4)5、参考文献 (4)6.源程序 (4)计算机图形学课程设计报告1.课程设计目的本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
在学期期末时按课程要求进行运动,提高学生对计算机图形学知识的了解与运用技巧同时通过此次课程设计提高动手实践能力与学习分析能力这就是本次的课程设计的目的。
2.课程设计描述及要求此次课程设计的课题为利用VC++6.0和插件OPENGL制作三维模型。
本设计主要通过建立MFC工程,在工程里建立一个三维模型然后再进行旋转,飞行等运动,来建立一个动态的三维模型。
主要步骤如下:1:工程的建立2:三维模型的建立和映射3:三维模型的运动一:工程的建立1:系统配置。
先对机子安装VC++6.0.在建立工程前,本实验需要添加OPENGL 插件,故需要在Windows环境下安装GLUT步骤如下:1、将下载的压缩包解开,将得到5个文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。
把解压得到的glut.h放到这个文件夹。
3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。
4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)然后建立一个OpenGL工程测试这里以VisualStudio2005为例。
计算机图形学课程设计报告
计算机图形学课程设计报告设计课题:专业班级:学号:学生:指导教师:设计时间:中南林业科技大学涉外学院理工系计算机图形学课程设计任务书指导教师:廖宁教研室主任:2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。
课程设计任务书装订于设计计算说明书〔或论文〕封面之后,目录页之前。
目录一.设计目的……………………………………………………………二.设计要求……………………………………………………………1.构建根底类……………………………………………………2.构建直线类……………………………………………………3.构建变换类……………………………………………………4.构建填充类……………………………………………………5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计五.源程序六.程序运行效果图七.总结设计目的▪培养对图形建模、变换、投影、消隐、光照原理的理解和应用。
▪培养图形类的编程能力。
▪培养计算机图形学应用软件开发的能力。
设计要求深入研究计算机图形学的生成原理,设计算法实现具体的类。
1.构建根底类实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。
2.构建直线类实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现CACLine类绘制任意斜率的反走样颜色渐变直线。
3.构建变换类实现CTransForm完成二维和三维图形变换。
4.构建填充类实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进展深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。
5.构建光照类实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。
计算机图形学课程设计报告报告
一、设计容与要求1.1、设计题目算法实现时钟运动1.2、总体目标和要求(1)目标:以图形学算法为目标,深入研究。
继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。
(2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
(3)开发环境:Viusal C++ 6.01.3、设计要求容:(1)掌握动画基本原理;(2)实现平面几何变换;功能要求:(1)显示时钟三个时针,实现三根时针间的相互关系;(2)通过右键菜单切换时钟背景与时针颜色;1.4设计方案通过使用OpenGL提供的标准库函数,综合图形学Bresenham 画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。
根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。
再根据OpenGL颜色模型定义当前颜色。
设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。
最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。
二、总体设计2.1、过程流程图2.2、椭圆的中点生成算法1、椭圆对称性质原理:(1)圆是满足x 轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y 轴对称的,这样只需要计算原来的1/2点的位置;通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。
2、中点椭圆算法容:(1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。
设置初始点(x0,y0)的位置为(0,r2);(2)计算区域1中央决策参数的初始值p = ry*ry - rx*rx*ry + 1/4*(rx*rx);(3)在区域1中的每个Xn为止,从n = 0 开始,直到|K|(斜率)小于-1时后结束;<1>如果p < 0 ,绘制下一个点(x+1,y),并且计算p = p + r2*r2*(3+2*x);<2>如果P >=0 ,绘制下一个点(x+1,y-1),并且计算p = p + r2*r2*(3+2*point.x) - 2*r1*r1*(y-1)(4)设置新的参数初始值;p = ry*ry(X0+1/2)*(X0+1/2) + rx*rx*(Y0-1) - rx*rx*ry*ry; (5)在区域2中的每个Yn为止,从n = 0开始,直到y = 0时结束。
计算机图形学课程设计报告——范文分析
《计算机图形学》课程设计报告题目名称:专业班级学号姓名指导教师年月日Solar System(太阳系)软件工程专业学生王洋指导老师李征[摘要]太阳系(Solar System)是以太阳为中心,和所有受到太阳重力约束的天体的集合体,主要包括太阳,八大行星,以及卫星.此课题模拟太阳系围绕太阳运转的模型,以太阳,八大行星和月球形成大致的体系结构,以VC6.0为平台用OpenGL基础知识实现从不同角度观测太阳系.关键词:OpenGL VC6.0 太阳系运转角度一、实验名称:Solar System(太阳系)二、实验的目的和要求:1.熟悉OpenGL基础函数2.通过程序模拟太阳系运行3.实现改变视角观测太阳系三、实验的环境:1.硬件环境:CPU Intel Pentium D ,1G内存2.软件环境:操作系统:Windows xp SP2编译软件及版本:vc6.0 OpenGL环境四、系统描述1.太阳太阳是恒星,能够自转,体积是太阳系中最大的,能够发光,处于太阳系中心位置.2.八大行星八大行星按与太阳距离从近到远分别为:水星,金星,地球,火星,木星,土星,天王星,海王星,各有各的大小,其中以木星最大,以各自不同的公转速度绕太阳运行,并自转.3.月球月球是围绕地球旋转的卫星.体积是系统中最小的,旋转周期比较快。
五. 理论基础:用windows api创建窗口,使用OpenGL绘制函数绘制球体,实现位图文件读取,并转换为纹理,使用系统时间控制球体转动,设置视点视角,通过改变视角从不同角度观测.所使用的计算机图形学理论基础:1.3D管道中的几何变换旋转矩阵行向量为该矩阵坐标系在原坐标系上的坐标,列向量为原坐标系的向量在本旋转矩阵坐标系上的坐标。
旋转是欧氏变换;旋转、放缩是线性变换;旋转、放缩、平移是仿射变换;旋转、放缩、平移、透视投影是射影变换。
线性变换在四维空间,仿射变换在三维空间,射影必须采用摄像坐标系,仿射变换是到自身的一类变换.齐次坐标系就是将一个原本是n维的向量用一个n+1维向量来表示。
计算机图形学 海报设计实验报告
图5
5.新建一个图层,得图层1,设置前景色的颜色值为d5a329,按Alt+Delete键用前景色填充选区,按Ctrl+D键取消选区,得到如图6的效果。
图6
6.设置前景色的颜色为白色,在工具箱中选择“横排文字工具”,并在其选项中设置适当的字体与字号,在画布的上方输入如图所示的文字,得到相应的文字图层“PIANO”,如图7所示。
图1
2.在工具箱中选择“渐变工具”,在其选项条中选择“线性渐变”按钮,并单击选项条上的渐变显示框,设置弹出的“渐变编辑器”对话框如图2所示。
图2
3.从图像的下方向上方绘制渐变,得到如图3所示的效果。
图3
4.在工具箱中选择“椭圆选框工具”,在画布的正中心绘制一条如图4所示的椭圆选区,按shift+F6键应用“羽化”命令,在弹出的对话框中设置“羽化半径”为150,如图5所示。
图7
7.设置“PIANO”为“仿斜体”命令,效果如图8所示。
图8
8.为使边缘看上去不生硬,在边缘绘制一些气泡,如图9所示。
图9
9. 在“载入画笔”命令中,打开我们的素材1,如图10。
图10
10.调节图像大小并使用“移动工具”将其移到画布的正下方,直到得到如图11的效果。
图11
11.用“画笔工具”中的气泡画笔,用气泡连接气泡文字和酒杯,如图12所示。
图12
12.给画布的上方和下方绘制黑色边框,如图13所示。
图13
13.打开素材2,将其移到画布的左上角,如图14所示。
图14
14.在画布的最下方用“横排文字工具”输入如图所示的文字。并在杯子上绘制气泡。最终效果如图15所示。
图15
四、实验总结:
通过本次实验,我觉得自己有很大的收货:
计算机图形学课程设计报告报告实验报告
《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham 算法实验3:椭圆中点Bresenham 算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
计算机图形学课程设计实习报告
实验零? Visual C++ 2005绘图系统地点:土木楼B401机房时间:星期三下午节次:第三大节一、实验目的:1. 了解Visual C++ 2005绘图的基本概念2. 了解Visual C++ 2005绘图环境3. 掌握用Visual C++ 2005设计绘图项目的基本步骤4. 掌握用Visual C++ 2005绘图的基本命令二、实验内容:实验内容1:创建绘图应用程序主框架实验内容2:应用程序编译运行实验内容3:设置菜单项并生成消息响应函数实验内容4:SetPixel绘图三、实验步骤:实验内容1:创建绘图应用程序主框架步骤:1.创建一个工作目录D:\MyProject2.启动Visual Studio 20053.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++”->“MFC”,模版选择“MFC应用程序”。
在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。
4.单击“确定”按钮。
5.单击“下一步”按钮。
6.在“应用程序类型中”,选择“单文档”类型。
7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。
实验内容2:应用程序编译运行运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:1.生成解决方案点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。
2.调试运行程序点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。
结果如下:生成Release解决方案步骤如下:1.生成解决方案点击“生成-〉批生成”。
2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。
3.查看目录,sample.exe是Release版,单击即可以运行。
运行结果:实验内容3:设置菜单项并生成消息响应函数1.弹出菜单设计器双击“资源视图”中的“Menu”展开文件夹,双击“IDR_MAINFRAME”,弹出菜单设计器。
计算机图形学实验报告
实验内容:通 过实验掌握光 照模型的原理 和实现方法, 了解不同光照 模型对物体表 面光照效果的
影响。
纹理映射
定义:将纹理图像映射到三维物 体表面的过程
方法:根据物体表面的几何形状, 将纹理图像按照一定的规则和算 法进行拉伸、扭曲和拼接等操作, 最终覆盖在物体表面
添加标题
添加标题
添加标题
添加标题
提高编程能力
熟练使用相关编程语言和工 具
掌握计算机图形学的基本原 理和算法
学会分析和解决图形学中的 问题
提高编程技巧和解决问题的 能力
02
实验内容
图形渲染流程
加载场景和模型 设置相机和光源 几何着色器处理顶点数据 光栅化着色器生成像素数据
OpenGL基本操作
创建窗口:使用OpenGL创建 窗口,设置渲染上下文
熟悉图形渲染流程
了解图形渲染的 基本原理和流程
掌握图形渲染的 关键技术和技巧
熟悉图形渲染的 应用场景和优势
Hale Waihona Puke 掌握图形渲染的 未来发展方向和 趋势
掌握OpenGL的使用
学习OpenGL的基本概念和原理 掌握OpenGL的编程接口和开发流程 理解OpenGL在计算机图形学中的应用和优势 学会使用OpenGL进行基本的图形渲染和交互操作
目的:增加物体的表面细节和真 实感
应用:游戏开发、电影制作、虚 拟现实等领域
03
实验过程
实验环境搭建
安装操作系统: 选择适合的操
作系统,如 Windows或
Linux
安装开发工具: 安装所需的集
成开发环境 (IDE)和编
译器
安装图形库: 安装OpenGL、
DirectX或其 他的图形库
计算机图形学实验报告三
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
计算机图形学实验报告
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学作品设计报告题目:用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。