计算机图形学课程设计作品.docx
- 文档编号:10253716
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:19
- 大小:19.05KB
计算机图形学课程设计作品.docx
《计算机图形学课程设计作品.docx》由会员分享,可在线阅读,更多相关《计算机图形学课程设计作品.docx(19页珍藏版)》请在冰豆网上搜索。
计算机图形学课程设计作品
《计算机图形学Visualc++版》考试作业报告
题目:
计算机图形学图形画板
专业:
推荐IT学长淘宝日用品店530213
班级:
推荐IT学长淘宝日用品店530213
学号:
推荐IT学长淘宝日用品店530213
姓名:
推荐IT学长淘宝日用品店530213
指导教师:
推荐IT学长淘宝日用品店530213
完成日期:
2015年12月2日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。
通过这次设计,要求在加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、设计内容推荐IT学长淘宝日用品店530213
设计一个图形画板,在这个图形画板中要实现:
1,画线功能,而且画的线要具备反走样功能。
2,利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。
3,可以对选中区域的图形放大,缩小,平移,旋转等功能。
3、设计过程
程序预处理:
包括头文件的加载,常量的定义以及全局变量的定义
#include"stdafx.h"
#include"GraDesign.h"
#include"GraDesignDoc.h"
#include"GraDesignView.h"
#include"math.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//******自定义全局变量
inttype=-1;
CPointpoint1;
CPointpoint2;
CPointtemp[2];
CPointremember;
inti=0;
///////////////////////////////////////////////推荐IT学长淘宝日用品店530213//////////////////////////////
//CGraDesignView
IMPLEMENT_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
//Standardprintingcommands
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()
////////////////////////////推荐IT学长淘宝日用品店530213/////////////////////////////////////////////////
//CGraDesignViewconstruction/destruction
CGraDesignView:
:
CGraDesignView()
{
//TODO:
addconstructioncodehere
}
CGraDesignView:
:
~CGraDesignView()
{
}
BOOLCGraDesignView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
:
PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
//CGraDesignViewdrawing
voidCGraDesignView:
:
OnDraw(CDC*pDC)
{
CGraDesignDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
}
/////////////////////////////////////////////////////////////////////////////
//CGraDesignViewprinting
BOOLCGraDesignView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCGraDesignView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCGraDesignView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
/////////////////////////////////////////////////////////////////////////////
//CGraDesignViewdiagnostics
#ifdef_DEBUG
voidCGraDesignView:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCGraDesignView:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
CGraDesignDoc*CGraDesignView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraDesignDoc)));
return(CGraDesignDoc*)m_pDocument;
}
#endif//_DEBUG
推荐IT学长淘宝日用品店530213
画直线:
RunLine函数绘制任意斜率的直线,并且添加反走样算法,通过OnLButtonDown,OnLButtonUp函数记录鼠标的点击位置
//************画线函数***********************
voidCGraDesignView:
:
RunLine(CPointCP0,CPointCP1)
{
CDC*pDC=GetDC();
CPointp,t;
intx,y;
doublee,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 { pDC->SetPixelV(p,RGB(0,0,0)); p.y++; } } else { y=CP1.y-CP0.y; k=double(y)/double(x); //斜率0至1 if(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 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++; } } } //斜率大于1 if(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 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至0 if(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 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--; } } } //斜率小于等于-1 if(k<=-1) { if(CP0.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学长淘宝日用品店530213 voidCGraDesignView: : Onrectangle() { type=2; } 画矩形: 利用画线功能通过实现RunRectangle函数画出矩形 //***************画矩形函数**************************** voidCGraDesignView: : RunRectangle(CPointCP0,CPointCP1) { CDC*pDC=GetDC(); CPointCP2,CP3; //01在同一对角线,2和1在垂直方向,03在竖直方向 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); } voidCGraDesignView: : Onellipse() { type=3; } 画椭圆: 利用画线功能通过实现RunEllipse函数画出椭圆 //***************画椭圆函数**************************** voidCGraDesignView: : RunEllipse(CPointCP0,CPointCP1) { CDC*pDC=GetDC(); CRectrect; 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); ////////////////建立坐标轴////////////////////// doublea,b,d,d2,a2,b2; CPointp,p0; intendx,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 { 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; } } } } voidCGraDesignView: : Onpolygon() { type=4; } voidCGraDesignView: : Onfill() { type=5; } 画多边形: 利用画线功能通过鼠标左键函数OnLButtonDown取点,用鼠标右键函数OnRButtonDown实现回到原点 CPointtemp[2]; CPointremember; inti=0; //多边形1 if(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函数实现填充 CPointstack[1000000]; voidCGraDesignView: : RunFill(CPointpoint) { CPointp; inttop; COLORREFr; CClientDCdc(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++; } } } voidCGraDesignView: : Ontobig() { type=6; } 推荐IT学长淘宝日用品店530213 1.需求分析 本程序将实现多功能画板的功能: 1,画线功能,而且画的线要具备反走样功能。 2,利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区 域的图形放大,缩小,平移,旋转等功能。 2.概要设计 RunLine(CPointCP0,CPointCP1)//反走样直线 RunRectangle(CPointCP0,CPointCP1)//矩形 RunEllipse(CPointCP0,CPointCP1)//椭圆 RunFill(CPointpoint)//填充 OnLButtonDown(UINTnFlags,CPointpoint)//鼠标左键 OnRButtonDown(UINTnFlags,CPointpoint)//鼠标右键 3.详细设计 RunLine函数绘制任意斜率的直线,并且添加反走样算法,通过OnLButtonDown,OnLButtonUp函数记录鼠标的点击位置 利用画线功能通过实现RunRectangle函数画出矩形 利用画线功能通过实现RunEllipse函数画出椭圆 利用画线功能通过鼠标左键函数OnLButtonDown取点,用鼠标右键函数OnRButtonDown实现回到原点 4.调试分析 仅画图功能初步实现,而放大,缩小,平移,旋转等功能依然无法实现。 5.用户使用说明 1、运行VC6.0 2、选择功能面板上的类型 3、选择功能(画线,矩形,椭圆,多边形,填充) 4、在画板上画图 6.测试结果 1,直线: 2,矩形 3,椭圆 4,多边形 5,填充 7.附录 带注释的源程序。 如果提交源程序软盘,可以只列出程序文件名的清单。 4、课程设计体会 通过做这个画板设计实验,一方面把所学的知识整合到一起并通过画板表现出来,通过这次设计,实现对直线,矩形,多边形的绘制,还有通过自创类来实现消隐的功能,通过研究与合作,更熟练了用指针进行扫描来绘制这些图形,以及提高对这门课程的兴趣。 推荐IT学长淘宝日用品店530213
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 课程设计 作品