《计算机图形学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,画线功能,而且画的线要具备反走样功能。