.计算机图形学课程设计报告设计课题:专业班级:学号:学生姓名:指导教师:设计时间:2018.12.06中南林业科技大学涉外学院理工系计算机图形学课程设计任务书指导教师:廖宁教研室主任: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类对物体实施光照。
开发环境Viusal C++ 6.0的MFC框架。
详细设计1.利用函数Ellipse画出人物的脸,并用给脸填充颜色。
再利用Ara画出人物的嘴巴。
CRect确定人物的眼睛,给眼睛填充颜色。
利用画笔画出人物的鼻子。
2.添加ddaline()成员函数,编写自定义的成员函数ddaline()程序,编写OnDraw()函数,画出人物的脚和脚趾。
3.添加星星star()成员函数,编写自定义的成员函数star()程序,确定五角星的位置、大小和颜色。
4.添加五环circle()成员函数,并利用colorcircle()函数给五环上色。
5.添加旗子flayA()、flayB()成员函数,确定旗杆的位置,用四点坐标设置旗子的范围,将星星和五环置于旗子中。
源程序// Yzg20166989View.cpp : implementation of the CYzg20166989View class//#include "stdafx.h"#include "Yzg20166989.h"#include "math.h"#include "Yzg20166989Doc.h"#include "Yzg20166989View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////// //////// CYzg20166989ViewIMPLEMENT_DYNCREATE(CYzg20166989View, CView)BEGIN_MESSAGE_MAP(CYzg20166989View, CView)//{{AFX_MSG_MAP(CYzg20166989View)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}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()/////////////////////////////////////////////////////////////////////// //////// CYzg20166989View construction/destructionCYzg20166989View::CYzg20166989View(){// TODO: add construction code here}CYzg20166989View::~CYzg20166989View(){}BOOL CYzg20166989View::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////// //////// CYzg20166989View drawingvoid CYzg20166989View::OnDraw(CDC* pDC){CYzg20166989Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereAfxGetMainWnd()->SetWindowText("20166989 尹志刚");graph(pDC,0,0);CRect rect(200,120,430,350);CRect rect1(250,195,275,220);CRect rect2(355,195,380,220);CBrush nBrush(RGB(0,255,255)),*pOldnBrush; pOldnBrush=pDC->SelectObject(&nBrush); pDC->Ellipse(200,120,430,350);pDC->SelectObject(pOldnBrush);CBrush Brush(RGB(0,0,0)),*pOldBrush; pOldBrush=pDC->SelectObject(&Brush); pDC->RoundRect(rect1,CPoint(200,200)); pDC->RoundRect(rect2,CPoint(200,200)); pDC->SelectObject(pOldBrush);CBrush mBrush(RGB(255,255,0)),*pOldmBrush; pOldmBrush=pDC->SelectObject(&mBrush); pDC->Arc(250,275,380,355,295,285,335,285); pDC->SelectObject(pOldmBrush);CPoint p1(305,295),p2(325,295);CPen Pen,*pOldPen;Pen.CreatePen(PS_SOLID,3,RGB(0,0,0));pOldPen=pDC->SelectObject(&Pen);pDC->MoveTo(p1);pDC->LineTo(p2);pDC->SelectObject(pOldPen);pDC->SetTextColor(RGB(0,0,255));pDC->TextOut(225,20,"同一个世界,同一个梦想");ddaline(pDC,225,305,225,450,RGB(255,0,0)); ddaline(pDC,405,305,405,450,RGB(255,0,0)); ddaline(pDC,225,450,225,460,RGB(0,0,0));ddaline(pDC,225,450,215,460,RGB(0,0,0));ddaline(pDC,225,450,235,460,RGB(0,0,0));ddaline(pDC,405,450,405,460,RGB(0,0,0));ddaline(pDC,405,450,395,460,RGB(0,0,0));ddaline(pDC,405,450,415,460,RGB(0,0,0));}/////////////////////////////////////////////////////////////////////// //////// CYzg20166989View printingBOOL CYzg20166989View::OnPreparePrinting(CPrintInfo* pInfo) {// default preparationreturn DoPreparePrinting(pInfo);}void CYzg20166989View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CYzg20166989View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////// //////// CYzg20166989View diagnostics#ifdef _DEBUGvoid CYzg20166989View::AssertValid() const{CView::AssertValid();}void CYzg20166989View::Dump(CDumpContext& dc) const{CView::Dump(dc);}CYzg20166989Doc* CYzg20166989View::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CYzg20166989Doc)));return (CYzg20166989Doc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////// //////// CYzg20166989View message handlersvoid CYzg20166989View::ddaline(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color){int length,i;double x,y,dx,dy;length=abs(x1-x0);if(abs(y1-y0)>length)length=abs(y1-y0);dx=(x1-x0)/length;dy=(y1-y0)/length;x=x0+0.5;y=y0+0.5;for(i=1;i<=length;i++){pDC->SetPixel((int)x,(int)y,color);x=x+dx;y=y+dy;}}void CYzg20166989View::flagA(CDC *pDC, int x, int y) {CBrushredBrush(RGB(0xFF,0,0)),yellowBransh(RGB(0xFF,0xff,0)),woodBrash(RGB(180,180,180)),*oldBrush;oldBrush=pDC->SelectObject(&redBrush);pDC->Rectangle(x+20,y+0,x+140,y+70);pDC->SelectObject(&woodBrash);pDC->Rectangle(x+15,y+0,x+20,y+100);pDC->SelectObject(&yellowBransh);pDC->SetPolyFillMode(WINDING);star(pDC,x+40,y+20,10);star(pDC,x+60,y+13,6);star(pDC,x+62,y+30,6);star(pDC,x+55,y+43,6);star(pDC,x+40,y+48,6);pDC->SelectObject(oldBrush);}void CYzg20166989View::flagB(CDC *pDC, int x, int y) {CBrushwoodBrash(RGB(180,180,180)),*oldBrush;pDC->Rectangle(x+85,y+0,x+205,y+70);oldBrush=pDC->SelectObject(&woodBrash);pDC->Rectangle(x+205,y+0,x+210,y+100);pDC->SelectObject(oldBrush);CPenp1(PS_SOLID,2,RGB(0x09,0x51,0xA0)),p2(PS_SOLID,2,RGB(0x05,0x05,0x05)),p3(PS_SOLID,2,RGB(0xFE,0x01,0x00)),p4(PS_SOLID,2,RGB(0xFC,0xFD,0x04)),p5(PS_SOLID,2,RGB(0x30,0xA0,0x2D));colorCircle(pDC,&p1,x+60+65,y+30,10);colorCircle(pDC,&p2,x+82+65,y+30,10);colorCircle(pDC,&p3,x+104+65,y+30,10);colorCircle(pDC,&p4,x+70+65,y+46,10);colorCircle(pDC,&p5,x+92+65,y+46,10);}void CYzg20166989View::star(CDC *pDC, int x, int y, int r) {CPoint stars[5];const double PI=3.1415926;double alpha=PI/10;double beta=2*PI/5;for(int i=0;i<5;i++) {stars[i].x=ceil(r*cos(i*beta+alpha))+x;stars[i].y=ceil(r*sin(i*beta+alpha))+y;}CPoint starx[5]={stars[0],stars[2],stars[4],stars[1],stars[3],};pDC->Polygon(starx,5);}void CYzg20166989View::colorCircle(CDC *pDC, CPen *pen, int x, int y, int r){CPen *old;old=pDC->SelectObject(pen);circle(pDC,x,y,r,FALSE);pDC->SelectObject(old);}void CYzg20166989View::circle(CDC *pDC, int x, int y, int r, BOOL fill){if (fill==TRUE) {CBrush newBrush,*oldBrush;newBrush.CreateSolidBrush(RGB(0X33,0X33,0X33));oldBrush=pDC->SelectObject(&newBrush);pDC->Ellipse(CRect(x-r,y-r,x+r,y+r));pDC->SelectObject(oldBrush);}else{pDC->Ellipse(CRect(x-r,y-r,x+r,y+r));}}void CYzg20166989View::graph(CDC *pDC, int x, int y) {flagA(pDC,x+360,y+42);flagB(pDC,x+40,y+44);}程序运行效果图总结通过课程设计项目的设计、开发、测试、总结和验收各阶段,深入理解计算机图形学课程中的理论和算法,学习计算机图形学相关类的编程技巧,初步掌握游戏开发的前期技能。