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

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

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

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

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

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

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

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

三、设计过程程序预处理:包括头文件的加载,常量的定义以及全局变量的定义#include "stdafx.h"#include "GraDesign.h"#include "GraDesignDoc.h"#include "GraDesignView.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//******自定义全局变量int type = -1;CPoint point1;CPoint point2;CPoint temp[2];CPoint remember;int i = 0;///////////////////////////////////////////////推荐IT学长淘宝日用品店530213//////////////////////////////// CGraDesignViewIMPLEMENT_DYNCREATE(CGraDesignView, CView)BEGIN_MESSAGE_MAP(CGraDesignView, CView)//{{AFX_MSG_MAP(CGraDesignView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_COMMAND(line, Online)ON_COMMAND(rectangle, Onrectangle)ON_COMMAND(ellipse, Onellipse)ON_COMMAND(polygon, Onpolygon)ON_COMMAND(fill, Onfill)ON_WM_RBUTTONDOWN()ON_COMMAND(tobig, Ontobig)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()////////////////////////////推荐IT学长淘宝日用品店530213/////////////////////////////////////////////////// CGraDesignView construction/destructionCGraDesignView::CGraDesignView(){// TODO: add construction code here}CGraDesignView::~CGraDesignView(){}BOOL CGraDesignView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CGraDesignView drawingvoid CGraDesignView::OnDraw(CDC* pDC){CGraDesignDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CGraDesignView printingBOOL CGraDesignView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CGraDesignView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add extra initialization before printing}void CGraDesignView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CGraDesignView diagnostics#ifdef _DEBUGvoid CGraDesignView::AssertValid() const{CView::AssertValid();}void CGraDesignView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CGraDesignDoc* CGraDesignView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraDesignDoc)));return (CGraDesignDoc*)m_pDocument;}#endif //_DEBUG推荐IT学长淘宝日用品店530213画直线:RunLine函数绘制任意斜率的直线,并且添加反走样算法,通过OnLButtonDown,OnLButtonUp函数记录鼠标的点击位置//************画线函数***********************void CGraDesignView::RunLine(CPoint CP0, CPoint CP1){CDC *pDC=GetDC();CPoint p,t;int x,y;double e,k,e1;x=CP1.x-CP0.x;//斜率无穷if(x==0){if(CP0.y>CP1.y){t=CP0;CP0=CP1;CP1=t;}p=CP0;while(p.y<CP1.y+1){pDC->SetPixelV(p,RGB(0,0,0));p.y++;}}else{y=CP1.y-CP0.y;k=double(y)/double(x);//斜率0至1if(k>=0 && k<1){//比较两个点中X轴坐标的大小if(CP0.x>CP1.x){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;//画反走样k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=k;while(p.x<CP1.x+1){e1=1-e;//反走样画两个像素点pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x,p.y+1,RGB(e1*255,e1*255,e1*255));p.x++;e=e+k;if(e>=1){e--;p.y++;}}}//斜率大于1if(k>=1){if(CP0.y>=CP1.y){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=1/k;while(p.x<CP1.x+1){e1=1-e;pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x+1,p.y,RGB(e1*255,e1*255,e1*255));p.y++;e=e+1/k;if(e>=1){e--;p.x++;}}}//斜率-1至0if(k<0 && k>-1){if(CP0.x>CP1.x){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=k;while(p.x<CP1.x+1){e1=1-e;pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x,p.y-1,RGB(e1*255,e1*255,e1*255));p.x++;e=e-k;if(e>=1){e--;p.y--;}}}//斜率小于等于-1if(k<=-1){if(CP0.y<CP1.y){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=-1/k;while(p.y>CP1.y-1){e1=1-e;pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x+1,p.y,RGB(e1*255,e1*255,e1*255));p.y--;e=e-1/k;if(e>=1){e--;;p.x++;}}}}}推荐IT学长淘宝日用品店530213void CGraDesignView::Onrectangle(){type = 2;}画矩形:利用画线功能通过实现RunRectangle函数画出矩形//***************画矩形函数****************************void CGraDesignView::RunRectangle(CPoint CP0, CPoint CP1){CDC *pDC=GetDC();CPoint CP2,CP3;//0 1 在同一对角线,2和1在垂直方向,0 3在竖直方向CP2.x=CP1.x;CP2.y=CP0.y;CP3.x=CP0.x;CP3.y=CP1.y;//**********利用前面的功能画4条边************************** RunLine(CP0,CP2);RunLine(CP0,CP3);RunLine(CP1,CP2);RunLine(CP1,CP3);}void CGraDesignView::Onellipse(){type = 3;}画椭圆:利用画线功能通过实现RunEllipse函数画出椭圆//***************画椭圆函数****************************void CGraDesignView::RunEllipse(CPoint CP0, CPoint CP1){CDC *pDC=GetDC();CRect rect;GetClientRect(&rect);pDC->SetMapMode(8);pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg((CP0.x+CP1.x)/2,(CP0.y+CP1.y)/2);////////////////建立坐标轴//////////////////////double a,b,d,d2,a2,b2;CPoint p,p0;int endx,endy;a=abs(CP0.x-CP1.x)/2;b=abs(CP0.y-CP1.y)/2;a2=a*a;b2=b*b;endx=(int)(a2/sqrt(a2+b2));d=b2-b*a2+0.25*a2;p.x=0;p.y=(long)b;if(CP0.y == CP1.y){RunRectangle(CP0,CP1);}else{while(p.x<endx){pDC->SetPixelV(p,RGB(0,0,0));pDC->SetPixelV(p.x,-p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,-p.y,RGB(0,0,0));if(d>=0){d=d+2*b2*p.x-2*a2*p.y+3*b2+2*a2;p.y--;}else {d=d+2*b2*p.x+3*b2;}p.x++;}d2=b2*(p.x+0.5)*(p.x+0.5)+a2*(p.y-1)*(p.y-1)-a2*b2;while(p.y>=0){pDC->SetPixelV(p,RGB(0,0,0));pDC->SetPixelV(p.x,-p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,-p.y,RGB(0,0,0));p.y--;if(d2<0){d2=d2+2*b2*p.x-2*a2*p.y+2*b2+3*a2;p.x++;}else{d2=d2-2*a2*p.y+3*a2;}}}}void CGraDesignView::Onpolygon(){type = 4;}void CGraDesignView::Onfill(){type = 5;}画多边形:利用画线功能通过鼠标左键函数OnLButtonDown取点,用鼠标右键函数OnRButtonDown实现回到原点CPoint temp[2];CPoint remember;int i = 0;//多边形1if(4 == type){i++;temp[i%2] = point;if(1==i) { remember = temp[i]; return; }RunLine(temp[i%2],temp[(i+1)%2]);}//画多边形,按鼠标右键结束,并自动连接起始点,数据清零RunLine(temp[i%2],remember);i=0;temp[0].x=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=dc.GetPixel(p);if(r != RGB(255,255,255)) continue;dc.SetPixelV(p,RGB(0,255,0));r=dc.GetPixel(p.x+1,p.y);if(r == RGB(255,255,255) && r!=RGB(0,255,0)){stack[top].x=p.x+1;stack[top].y=p.y;top++;}r=dc.GetPixel(p.x-1,p.y);if(r == RGB(255,255,255) && r!=RGB(0,255,0)){stack[top].x=p.x-1;stack[top].y=p.y;top++;}r=dc.GetPixel(p.x,p.y+1);if(r == RGB(255,255,255)&& r!=RGB(0,255,0)){stack[top].x=p.x;stack[top].y=p.y+1;top++;}r=dc.GetPixel(p.x,p.y-1);if(r == RGB(255,255,255) && r!=RGB(0,255,0)){stack[top].x=p.x;stack[top].y=p.y-1;top++;}}}void CGraDesignView::Ontobig(){type = 6;}推荐IT学长淘宝日用品店5302131.需求分析本程序将实现多功能画板的功能:1,画线功能,而且画的线要具备反走样功能。

合集下载

计算机图形学课程设计

计算机图形学课程设计

《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年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。

计算机图形学课程设计报告

计算机图形学课程设计报告

计算机图形学课程设计报告LT二、总体设计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时结束。

<1>如果P>0的情况下,下一个目标点为(x,y-1),并且计算p = p - 2rx*rx*(Yn+1) + rx*rx;<2>如果p<=0的情况下,下一个目标点为(x+1,y-1),并且计算p = p - 2rx*rx*Y(n+1) + 2ry*ry*(Xn+1)+rx*rx;(6)更具对称性原理计算其他3个象限的坐标。

(7)急速拿出中心位置在(x1,y1)的位置x = x + x1; y = y + y1;2.3、直线的Bresenham算法原理这种生成直线的算法与数值微分法类似,每次迭代在增量最大方向上均走一步,其方向由增量的正负而定;另一方向上是否也走,取决于计算出来的误差项,误差项所记录的方向同最大增量方向垂直。

计算机图形学-期末课程设计

计算机图形学-期末课程设计

图形学课程设计报告题目:系别:班级:学号:姓名:指导老师:目录诚信说明......................................................................................................... 错误!未定义书签。

目录 .. (1)一、项目描述 (2)1.1项目的目的 (2)二、项目需求 (2)2.1需求分析 (2)2.2功能描述 (2)三、项目设计 (3)3.1直线扫描算法 (3)3.1.1 DAA扫描线算法 (3)3.1.2 中点扫描线算法 (3)3.1.3 Bresenham扫描线算法 (3)3.2圆的扫描算法 (4)3.2.1 中点画圆扫描算法 (4)3.2.2 Bresenham画圆扫描算法 (4)3.3种子填充算法 (4)3.4图形的基本几何变换算法 (4)3.4.1平移 (4)3.4.2旋转 (5)3.4.3伸缩 (5)3.5 Bezier曲线算法 (5)四、项目效果 (5)五、项目总结 (10)六、参考文献 (11)七、附录 (11)一、项目描述1.1项目的目的通过本次课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形基本几何变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。

1.掌握图形学直线扫描算法:DDA,中点扫描线算法,Bresenham扫描线算法2.掌握图形学画圆扫描算法:中点画圆算法和Bresenham扫描算法3.掌握简单的几何图形的填充算法:种子填充和扫描线填充算法4.掌握简单图形的基本几何变换:平移,旋转和伸缩5.掌握Bezier曲线的生成算法6.熟悉并掌握vc6.0中的MFC使用方法7.掌握C/C++语言编程方法8.在学习基础上设计一个基于MFC的画图软件1.2项目内容在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的画图设计工具也越来越多,类似CAD和CDM及Photoshop的画图软件和图片处理软件的发展也日新月异,因此产生了制作一个类似的画图软件;而且通过制作该程序还能更好的学习图形学编程知识。

计算机图形学课设(含所有程序图文)

计算机图形学课设(含所有程序图文)

计算机图形学课程设计报告系(院):计算机科学学院专业班级:信计11102姓名:吴家兴学号:201106262指导教师:严圣华设计时间:2014.6.16 - 2014.6.26设计地点:10教机房(此处目录根据自己情况可以调整改动)一、课程设计目的 ................................................. 错误!未定义书签。

二、课程设计具体要求..................................... 错误!未定义书签。

三、需求分析与总体设计 ..................................... 错误!未定义书签。

四、详细设计与实现[含关键代码和实现界面] ... 错误!未定义书签。

五、小结......................................................................................... 错误!未定义书签。

一、课程设计目的计算机图形学课程设计是验证、巩固和补充课堂讲授的理论知识的必要环节,通过上机实验,培养学生的自学能力、动手能力、综合运用知识解决实际问题的能力。

要求学生运用计算机图形学理论与技术设计、编写、调试程序并撰写课程设计报告。

二、课程设计具体要求1.独立完成设计并撰写课程设计报告。

2.在规定时间将程序和设计报告用附件(信计111X班XXX 图形学课设报告.RAR)发送到274548837@,并上交纸质打印稿(A4纸10页左右)。

3. 课程设计报告内容包括:(1)列出设计者姓名及本人详细信息、所用开发工具;(2)程序的基本功能介绍;(3)程序实现步骤和关键算法的理论介绍;(4)关键源代码实现说明。

(不要打印全部源程序!)(5)程序运行界面截图(3幅左右)(6)课设总结和自我评价。

4.《计算机图形学》课程的知识结构体系:(1)课设为期两周:总学时为40学时,2学分(2)学生必须完成二维线画图元和二维填充图元两个大功能。

计算机图形学课程设计

计算机图形学课程设计

皮球运动动画一、设计方案圆皮球从某竖直高度以横向速度抛出,落地,弹起,最终静止。

设弹起后所能上升的高度为上一次最大高度的4/5,实现运动轨迹动画。

整个设计包括两个方面,一是掌握动画的基本原理,二是圆的绘制。

动画是将静止的画面变为动态的艺术。

实现由静止到动态,主要是靠人眼的视觉残留效应。

利用人的这种视觉生理特性可制作出具有高度想象力和表现力的动画影片。

动画中的皮球要用到中点画圆算法画圆,void MidCircle(int x0, int y0, int r)定义圆心的坐标和圆半径,用mLight.Ir, mLight.Ig, mLight.Ib来定义圆的颜色,glClearColor定义显示框的背景颜色,int cx=100,cy=300,cr=20定义圆开始运动时的水平位置,垂直高度和体积大小,glClearColor定义显示框的背景颜色,int windowswidth = 1000,windowshight = 500定义显示框的宽度和高度。

void Init()用来初始化,void myDisplay()用来显示,glLoadIdentity()为加载身份,void RenderScene(void)为渲染现场,void TimerFunction(int value)为计时器功能。

二、程序流程图floatmo;VectorN;theta<0alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;alpha<0intx,y,deltax,deltay,d;x<yglEnd();d<0glVertex2i(x+x0,y+y0);NOd+=deltax; intx,y,deltax,deltay,d; i=-xi<=xi++i=-yi<=yi++mColor=Phong(x0,y0,r,i+x0,y +y0); WHILEmColor=Phong(x0,y0,r,i+x0,x +y0);glClear(GL_COLOR_BUFFE R_BIT);glViewport(0,0,(GLsizei)w,(G Lsizei)h);glClear(GL_COLOR_BUFFE R_BIT); floatt=0,vv,s,hv;h>1cy-cr>0&&cx+cr<windowswi flag==1Multit=sqrt(2*h/g);YESflag=1;glutInit(&argc,argv); return0;三、程序清单#include <GL/glut.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#define NO_LIGHT 1#define LIGHT 2bool bLight = false;struct Vector{float fx, fy, fz;};struct Color{float Ir, Ig, Ib;/*定义皮球的颜色*/};float KaIa;float Kd, n;Vector H,light;Color mLight, mColor;int cx=100,cy=300,cr=20;/*定义皮球开始运动时的水平位置,下落高度和体积大小*/int windowswidth = 1000,windowshight = 500;/*定义显示框的宽度和高度*/int xstep=0,ystep=0,flag=10,up=0;float vh =4,g=9.8,h=cy;void Init(){float mo;Vector eye;mLight.Ir = 200;mLight.Ig =20;mLight.Ib =200;/*定义皮球的颜色*/KaIa=100;Kd = 0.7;n = 20;light.fx=0.10;light.fy=0.50;light.fz = sqrt(1-(light.fx*light.fx)-(light.fy*light.fy));eye.fx=1;eye.fy=0;eye.fz=1;H.fx=light.fx+eye.fx;H.fy=light.fy+eye.fy;H.fz=light.fz+eye.fz;mo=sqrt(H.fx*H.fx+H.fy*H.fy+H.fz*H.fz);H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);glClearColor(1.0, 1.0, 1.0, 0.0);glShadeModel(GL_SMOOTH);}Color Phong(int x0, int y0, int r, int x, int y){Vector N;float z,alpha,theta,Ks;Ks=1.0-Kd;z=sqrt((float)(r*r-(x-x0)*(x-x0)-(y-y0)*(y-y0)));N.fx=(x-x0)*1.0/r;N.fy=(y-y0)*1.0/r;N.fz = z*1.0/r;theta = N.fx * light.fx + N.fy * light.fy + N.fz * light.fz;if(theta<0)theta=0;alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;if(alpha<0)alpha=0;mColor.Ir=KaIa+mLight.Ir*Kd*theta+mLight.Ir*Ks*pow(alpha,n);mColor.Ig=KaIa+mLight.Ig*Kd*theta+mLight.Ig*Ks*pow(alpha,n);mColor.Ib=KaIa+mLight.Ib*Kd*theta+mLight.Ib*Ks*pow(alpha,n);return mColor;}void MidCircle(int x0, int y0, int r) /*中点画圆算法定义圆的圆心坐标和半径*/ {int x,y,deltax,deltay,d;x = 0;y = r;deltax = 5;deltay = 5-r-r;d = 1-r;glColor3f (1.0f, 1.0f, 1.0f); glBegin(GL_POINTS); glVertex2i (x+x0,y+y0); glVertex2i (-x+x0,y+y0); glVertex2i (-x+x0,-y+y0); glVertex2i (x+x0,-y+y0); glVertex2i (y+y0, x+x0); glVertex2i (y+y0, -x+x0); glVertex2i (-y+y0, -x+x0); glVertex2i (-y+y0, x+x0);while(x<y){if(d<0){d += deltax;deltax += 2;deltay += 2;x++;}else{d += deltay;deltax += 2;deltay += 4;x++;y--;}glVertex2i (x+x0,y+y0);glVertex2i (-x+x0,y+y0);glVertex2i (-x+x0,-y+y0);glVertex2i (x+x0,-y+y0);glVertex2i (y+y0, x+x0);glVertex2i (y+y0, -x+x0);glVertex2i (-y+y0, -x+x0);glVertex2i (-y+y0, x+x0);}glEnd();}void MidCircleLight(int x0, int y0, int r) {int x,y,deltax,deltay,d;x = 0;y = r;deltax = 3;deltay = 5-r-r;d = 1-r;int i=0;glBegin(GL_POINTS);{for( i=-x;i<=x;i++){mColor=Phong(x0,y0,r,i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-y+y0);}for(i=-y;i<=y;i++){mColor=Phong(x0,y0,r,i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-x+y0);}while(x<y){if(d<0){d += deltax;deltax += 2;deltay += 2;x++;}else{d += deltay;deltax += 2;deltay += 4;x++;y--;}for(i=-x;i<=x;i++){mColor=Phong(x0,y0,r,i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-y+y0);}for(i=-y;i<=y;i++){mColor=Phong(x0,y0,r,i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-x+y0);}}}glEnd();}void myDisplay() /*用此函数来显示*/{glClear(GL_COLOR_BUFFER_BIT);glColor3f (0.0f, 0.0f, 1.0f);MidCircleLight(cx, cy, cr);glFlush();}void Reshape(int w, int h) /*加载身份*/{glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);}void RenderScene(void) /*渲染现场*/{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0.0f, 0.0f);/*清空命令缓冲区并交换帧缓存*/glutSwapBuffers();}void TimerFunction(int value) /*定义计时器功能*/ {/*处理到达窗口边界的球形,使之反弹*/float t=0,vv,s,hv;if (h>1){if(cy-cr>0 && cx+cr<windowswidth && up == 0) {t =sqrt(2*h/g);vv = g*t/5;/*hv = 0.5*g*g*t;s= vh*t;*/cx += vh;cy -= vv;}else if(cy-cr<=0){flag = 1;up =1 ;}if(flag == 1){h=4.0/5.0*h;flag = 0 ;}printf("%d,%d,%d,%d\n",up,flag,h,cy-cr);if(cy-cr<=h && up == 1){t = sqrt(2*h/g);vv = sqrt(2*g*h)/8;/*hv= vv*t - 0.5*g*t*t;s = vh *t;*/cy +=vv;cx +=vh;}else if(cy-cr>=h){up = 0 ;}/*用新坐标重新绘图*/glutPostRedisplay();glutDisplayFunc(myDisplay);glutTimerFunc(33,TimerFunction, 1);}}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(windowswidth,windowshight );glutCreateWindow("Ball bouncing");Init();glutDisplayFunc(RenderScene);glutTimerFunc(33, TimerFunction, 1);glutReshapeFunc(Reshape);glutMainLoop();return 0;}四、程序运行结果及分析效果图1效果图2效果图3效果图4皮球从某一高度处水平抛出,落地后立即弹起,弹起的最大高度为上一次高度的4/5。

计算机图形学课程设计报告交互式绘图系统

课程设计报告课程名称计算机图形学课题名称交互式绘图系统专业计算机科学与技术班级学号姓名指导教师刘长松曹燚2012年10 月9 日湖南工程学院课程设计任务书课程名称计算机图形学课题交互式绘图系统专业班级学生姓名学号指导老师刘长松曹燚审批任务书下达日期2012年9月15 日任务完成日期2012 年10月9 日一、设计内容与设计要求1.设计内容:用橡皮法实现交互式绘图系统。

2.设计要求:在屏幕上可以选择不同的命令、来实现不同基本图形的绘制。

完成橡皮筋直线,橡皮筋圆,橡皮筋矩形框,多边形裁剪和3阶B样条曲线的作图,且要有比较友好的界面。

3.算法提示:首先在屏幕上画出菜单和绘图窗口,显示鼠标。

点击相应菜单,点击鼠标,移动鼠标,获取鼠标移动相对位置,画出相应图形。

相关变量定义:#define _MOUSE鼠标#define CIRCLE 1圆#define LINE 2直线#define RECTANGLE 3矩形#include "stdio.h"#include "string.h"#include"graphics.h"#include"math.h"#include <dos.h>union REGS inreg,outreg;struct SREGS sr;相关函数:void meun(int x,int y,char *str){setcolor(8);outtextxy(x+5,28,str);setcolor(15);line(x,22,x,40);line(x,22,y,22);setcolor(8);line(x,40,y,40);line(y,22,y,40);}void drawwindows()画窗口{setbkcolor(7); /*7*/setcolor(8);rectangle(0,20,640,460);rectangle(0,0,640,20);setfillstyle(1,1);floodfill(1,1,8);rectangle(0,460,640,480);setfillstyle(1,15);floodfill(1,461,8);setcolor(RED);outtextxy(10,468,"Finished By XuYuanFei."); setcolor(15);line(0,41,640,41);line(0,459,640,459);setcolor(8);line(0,42,640,42);setcolor(15);rectangle(610,3,630,17);setfillstyle(1,7);floodfill(611,4,15);setcolor(8);line(610,17,630,17);line(630,3,630,17);line(611,4,628,16);line(611,16,628,4);rectangle(2,44,635,459);setcolor(15);rectangle(3,45,634,458);line(611,3,628,15);line(611,15,628,3);meun(5,55,"line");meun(65,165,"rectangle");meun(175,250,"circle");meun(260,330,"Bezer");meun(340,400,"Cut");}int _cut()裁剪void mycircle(double x,double y,double r)画圆{double i;for(i=0.0;i<360.0;i=i+4)line(x+r*cos((i+1)/360*3.1415*2),y+r*sin((i+1)/360*3.1415*2),x+r*cos((i+4.0)/360*3.1415*2),y+ r*sin((i+4.0)/360*3.1415*2));}void _Bezer(int a[3],int b[3],int m)Beizier曲线void DisplayMouse()显示鼠标{inreg.x.ax=1;int86(0x33,&inreg,&outreg);}void CloseMouse()关闭鼠标{inreg.x.ax=2;int86(0x33,&inreg,&outreg);}union REGS DisplayMouseStatus()显示鼠标状态{inreg.x.ax=3;int86(0x33,&inreg,&outreg);return outreg;}void GetMouseXY(int *x,int *y)得到鼠标位置{DisplayMouse();outreg=DisplayMouseStatus();*x=outreg.x.cx;*y=outreg.x.dx;}响应相应函数void _mytreat(int oldx,int oldy,int x,int y){if(num==1){if(flag==LINE){line(px,py,oldx,oldy);line(px,py,x,y);}if(flag==CIRCLE){mycircle(px,py,sqrt((double)((px-oldx)*(px-oldx)+(py-oldy)*(py-oldy))));mycircle(px,py,sqrt((double)((px-x)*(px-x)+(py-y)*(py-y))));}if(flag==RECTANGLE){rectangle(px,py,oldx,oldy);rectangle(px,py,x,y);}}}二、进度安排第 3 周星期一8:00——12:00星期二8:00——12:00星期三8:00——12:00星期四8:00——12:00星期五8:00——12:00第 4 周星期一8:00——12:00附:课程设计报告装订顺序:封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。

计算机图形学课程设计报告简单图形的绘制

《计算机图形学》课程设计报告学生:学号:学院:班级:题目: 简单图形的绘制职称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 绘制抛物线根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。

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

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.利用坐标矩阵变换表示出三个球体之间的关系,即:地球绕着太阳转,月亮绕着地球转。

图形学课设报告

武汉工业学院《计算机图形学》课程设计题目:绘制三次Bezier曲线,三次B样条曲线和Cantor图指导老师:刘文涛姓名:庞璐学号:070505129院(系):计算机与信息工程系专业:软件工程完成日期: 2010年1 月4 日一.课题题目介绍设计任务9:1)给定下图所示的四个控制点:P0=(228,456),P1=(294,247),P2=(452,123),P3=(705,197)。

分别绘制三次Bezier曲线和三次B样条曲线。

2)使用VC编程,在窗口中一次绘制n=0~5的所有Cantor图。

二.整体功能及设计1)主模块:Bezier,B样条,cantor集算法的实现。

2)响应模块:a.Bezier,B样条,cantor集的鼠标响应;b.Bezier,B样条,cantor集的菜单和提示对话框响应。

c. Bezier,B样条,cantor集的快捷按钮响应。

3)附加功能模块:曲线颜色的选择。

算法描述:Bezier曲线功能描述:点击相应菜单,弹出提示对话框,继而可以实现鼠标取点,绘出Bezier 曲线和B样条曲线;选择cantor集菜单在弹出的对话框中输入n的值,随即绘出cantor集图形。

三.编程实现1.属性和方法的定义:class CMy070505129View : public CView{protected: // create from serialization onlyCMy070505129View();DECLARE_DYNCREATE(CMy070505129View)// Attributesbool mousestate;//鼠标状态标志CPoint cp[4];//顶点int i;//控制多边形顶点int m;//判断函数int MaxX,MaxY;//屏幕x和y的最大坐标int n;//递归深度COLORREF ccolor;//设置颜色值public:CMy070505129Doc* GetDocument();// Operationsvoid DrawBezier();//Bezier函数void DrawByangtiao();//B样条函数void Cantor(double,double,double,double,int);//cantor函数2.头文件:#include "stdafx.h"#include "070505129.h"#include "070505129Doc.h"#include "070505129View.h"#include "Bezier.h"#include "Byangtiao.h"#include "Cantor.h"#define ROUND(x) int(x+0.5)//四舍五入3.方法实现:CMy070505129View::CMy070505129View(){//部分数据初始化mousestate=false;i=0;cp[0].x=0;cp[0].y=0;cp[1].x=0;cp[1].y=0;cp[2].x=0;cp[2].y=0;cp[3].x=0;cp[3].y=0;}void CMy070505129View::DrawBezier()//Bezier函数{CClientDC dc(this);//设备上下文double t=0.0;//Bezier算法实现while(t<1.0){doubleptx=((-(t*t*t))+3*t*t-3*t+1)*(double)cp[0].x+(3*t*t*t-6*t*t+3*t)*(double)cp[1].x+(( -(3*t*t*t))+3*t*t)*(double)cp[2].x+t*t*t*(double)cp[3].x;doublepty=((-(t*t*t))+3*t*t-3*t+1)*(double)cp[0].y+(3*t*t*t-6*t*t+3*t)*(double)cp[1].y+(( -(3*t*t*t))+3*t*t)*(double)cp[2].y+t*t*t*(double)cp[3].y;dc.SetPixel((int)(ptx+0.5),(int)(pty+0.5),ccolor);//ccolor为颜色变量t+=1/10000.0;//步长}}void CMy070505129View::DrawByangtiao()//B样条函数{CClientDC dc(this);//设备上下文double t=0.0,x,y;//局部变量t为步长,x,y为每次曲线相应的点dc.MoveTo(cp[0]);//绘制四个控制点组成的四条线for(int i=1;i<4;i++){dc.LineTo(cp[i]);}//B样条算法实现while(t<1.0){double F0=(-(t*t*t)+3*t*t-3*t+1)/6.0;double F1=(3*t*t*t-6*t*t+4)/6.0;double F2=(-3*(t*t*t)+3*t*t+3*t+1)/6.0;double F3=t*t*t/6.0;x=cp[0].x*F0+cp[1].x*F1+cp[2].x*F2+cp[3].x*F3;y=cp[0].y*F0+cp[1].y*F1+cp[2].y*F2+cp[3].y*F3;dc.SetPixel((int)(x+0.5),(int)(y+0.5),ccolor);//ccolor为颜色变量t+=1/1000.0;//步长}}void CMy070505129View::Cantor(double ax,double ay,double bx,double by,int x)//cantor函数{double cx,dx,cy,dy;//cantor中间点座标CClientDC dc(this);//设备上下文if(x==0){dc.MoveTo(ROUND(ax),ROUND(ay+MaxY/2));dc.LineTo(ROUND(bx),ROUND(by+MaxY/2));return;}//递归cx=ax+(bx-ax)/3;cy = ay ;Cantor(ax,ay,cx,cy,x-1);dx=ax+2*(bx-ax)/3;dy = by ;Cantor(dx,dy,bx,by,x-1);}void CMy070505129View::OnBezier()//菜单响应函数{// TODO: Add your command handler code heremousestate=true;//重新设制鼠标状态CBezier bezier;//定义对话框类对象bezier.DoModal();//响应m=1;//标记值,双击时调用相应的函数Invalidate();}void CMy070505129View::OnByangtiao()//菜单响应函数{// TODO: Add your command handler code heremousestate=true;//重新设制鼠标状态CByangtiao Byangtiao;//定义对话框类对象Byangtiao.DoModal();//响应m=2;//标记值,双击时调用相应的函数Invalidate();}void CMy070505129View::OnLButtonDown(UINT nFlags, CPoint point)//单击获取控制点函数{if(mousestate){//获取x坐标cp[i].x=point.x;//获取y坐标cp[i].y=point.y;//存四个控制点放入cp[4]if(i<4)i++;elsemousestate=false;}CView::OnLButtonDown(nFlags, point);}void CMy070505129View::OnBUTTONBezier()//Bezier快捷按钮函数{//重新绘制Invalidate();//重新设制鼠标状态mousestate=true;//标记值,双击时调用相应的函数m=1;}void CMy070505129View::OnBUTTONByangtiao()//B样条快捷按钮函数{// TODO: Add your command handler code hereInvalidate();//重新绘制mousestate=true;//重新设制鼠标状态m=2;//标记值,双击时调用相应的函数}void CMy070505129View::OnLButtonDblClk(UINT nFlags, CPoint point) //双击{// TODO: Add your message handler code here and/or call default//鼠标状态mousestate=false;//调用画Bezier函数if(m==1)DrawBezier();//调用画B样条函数if(m==2)DrawByangtiao();CView::OnLButtonDblClk(nFlags, point);}void CMy070505129View::Oncantor()//Cantor集菜单响应函数{// TODO: Add your command handler code here//定义对话框类对象CCantor cantor;//设备上下文CClientDC dc(this);//响应cantor.DoModal();n=cantor.m_n;//立即重绘屏幕RedrawWindow();//获取屏幕最大x,y值CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;MaxY=Rect.bottom;//调用Cantor算法实现函数Cantor(0,0,MaxX,0,n);}void CMy070505129View::OnMENUITEMcolor()//颜色菜单响应函数{// TODO: Add your command handler code here//定义对颜色对话框类对象CColorDialog color;color.m_cc.rgbResult=ccolor;color.DoModal();//得到用户选择的颜色ccolor=color.GetColor();}四.使用说明点击相应菜单,弹出提示对话框,单击”ok”键,使用鼠标单击四下取点,双击绘出Bezier曲线或B样条曲线;或者单击选择单击图形按钮随即单击鼠标四下,双击绘出Bezier曲线或B样条曲线。

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