资源描述
计算机图形学
课程设计报告
设计课题:
专业班级:
学 号:
学生姓名:
指引教师:
设计时间: .12.06
中南林业科技大学涉外学院理工系
计算机图形学 课程设计任务书
姓 名:
尹志刚
专 业:
计算机科学与技术
班 级:
16级 3班
指引教师:
廖宁
职 称:
课程设计题目:细脚怪
已知技术参数和设计规定:
所需仪器设备:
成果验收形式:课程设计报告(纸质)
程序运营效果图
参照文献:
时间
安排
指引教师: 廖宁 教研室主任:
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.0MFC框架。
详细设计
1. 运用函数Ellipse画出人物脸,并用给脸填充颜色。再运用Ara画出人物嘴巴。CRect拟定人物眼睛,给眼睛填充颜色。运用画笔画出人物鼻子。
2. 添加ddaline()成员函数,编写自定义成员函数ddaline()程序,编写OnDraw()函数,画出人物脚和脚趾。
3. 添加星星star()成员函数,编写自定义成员函数star()程序,拟定五角星位置、大小和颜色。
4. 添加五环circle()成员函数,并运用colorcircle()函数给五环上色。
5. 添加旗子flayA()、flayB()成员函数,拟定旗杆位置,用四点坐标设立旗子范畴,将星星和五环置于旗子中。
源程序
// Yzg6989View.cpp :implementation of the CYzg6989View class
//
#include "stdafx.h"
#include "Yzg6989.h"
#include "math.h"
#include "Yzg6989Doc.h"
#include "Yzg6989View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CYzg6989View
IMPLEMENT_DYNCREATE(CYzg6989View,CView)
BEGIN_MESSAGE_MAP(CYzg6989View,CView)
//{{AFX_MSG_MAP(CYzg6989View)
// 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 commands
ON_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()
/////////////////////////////////////////////////////////////////////////////
// CYzg6989View construction/destruction
CYzg6989View::CYzg6989View()
{
// TODO:add construction code here
}
CYzg6989View::~CYzg6989View()
{
}
BOOL CYzg6989View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO:Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CYzg6989View drawing
void CYzg6989View::OnDraw(CDC* pDC)
{
CYzg6989Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO:add draw code for native data here
AfxGetMainWnd()->SetWindowText("6989 尹志刚");
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));
}
/////////////////////////////////////////////////////////////////////////////
// CYzg6989View printing
BOOL CYzg6989View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CYzg6989View::OnBeginPrinting(CDC* /*pDC*/,CPrintInfo* /*pInfo*/)
{
// TODO:add extra initialization before printing
}
void CYzg6989View::OnEndPrinting(CDC* /*pDC*/,CPrintInfo* /*pInfo*/)
{
// TODO:add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CYzg6989View diagnostics
#ifdef _DEBUG
void CYzg6989View::AssertValid() const
{
CView::AssertValid();
}
void CYzg6989View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CYzg6989Doc* CYzg6989View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CYzg6989Doc)));
return (CYzg6989Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CYzg6989View message handlers
void CYzg6989View::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 CYzg6989View::flagA(CDC *pDC,int x,int y)
{
CBrush
redBrush(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 CYzg6989View::flagB(CDC *pDC,int x,int y)
{
CBrush
woodBrash(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);
CPen
p1(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 CYzg6989View::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 CYzg6989View::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 CYzg6989View::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 CYzg6989View::graph(CDC *pDC,int x,int y)
{
flagA(pDC,x+360,y+42);
flagB(pDC,x+40,y+44);
}
程序运营效果图
总结
通过课程设计项目设计、开发、测试、总结和验收各阶段,进一步理解计算机图形学课程中理论和算法,学习计算机图形学有关类编程技巧,初步掌握游戏开发前期技能。
展开阅读全文