资源描述
《计算机图形学Visual c++版》考试作业报告
题目: 计算机图形学图形画板
专业: 推荐IT学长淘宝日用品店530213
班级: 推荐IT学长淘宝日用品店530213
学号: 推荐IT学长淘宝日用品店530213
姓名: 推荐IT学长淘宝日用品店530213
指引教师: 推荐IT学长淘宝日用品店530213
完毕日期: 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_FILE
static char THIS_FILE[] = __FILE__;
#endif
//******自定义全局变量
int type = -1;
CPoint point1;
CPoint point2;
CPoint temp[2];
CPoint remember;
int i = 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
// 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()
////////////////////////////推荐IT学长淘宝日用品店530213/////////////////////////////////////////////////
// CGraDesignView construction/destruction
CGraDesignView::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 cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGraDesignView drawing
void CGraDesignView::OnDraw(CDC* pDC)
{
CGraDesignDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO:add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CGraDesignView printing
BOOL CGraDesignView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return 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 _DEBUG
void 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至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<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++;
}
}
}
//斜率不不大于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<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至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<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--;
}
}
}
//斜率不大于等于-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.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
void 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;
//多边形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函数实现填充
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学长淘宝日用品店530213
1.需求分析
本程序将实现多功能画板功能:
1,画线功能,并且画线要具备反走样功能。
2,运用上面画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。
3,可以对选中区
域图形放大,缩小,平移,旋转等功能。
2.概要设计
RunLine(CPoint CP0,CPoint CP1) //反走样直线
RunRectangle(CPoint CP0,CPoint CP1) //矩形
RunEllipse(CPoint CP0,CPoint CP1) //椭圆
RunFill(CPoint point) //填充
OnLButtonDown(UINT nFlags,CPoint point) //鼠标左键
OnRButtonDown(UINT nFlags,CPoint point) //鼠标右键
3.详细设计
RunLine函数绘制任意斜率直线,并且添加反走样算法,通过OnLButtonDown,OnLButtonUp函数记录鼠标点击位置
运用画线功能通过实现RunRectangle函数画出矩形
运用画线功能通过实现RunEllipse函数画出椭圆
运用画线功能通过鼠标左键函数OnLButtonDown取点,用鼠标右键函数OnRButtonDown实现回到原点
4.调试分析
仅画图功能初步实现,而放大,缩小,平移,旋转等功能依然无法实现。
5.顾客使用阐明
1、运营VC6.0
2、选取功能面板上类型
3、选取功能(画线,矩形,椭圆,多边形,填充)
4、在画板上画图
6.测试成果
1,直线:
2,矩形
3,椭圆
4,多边形
5,填充
7.附录
带注释源程序。如果提交源程序软盘,可以只列出程序文献名清单。
四、 课程设计体会
通过做这个画板设计实验,一方面把所学知识整合到一起并通过画板体现出来,通过这次设计,实现对直线,矩形,多边形绘制,尚有通过自创类来实现消隐功能,通过研究与合伙,更纯熟了用指针进行扫描来绘制这些图形,以及提高对这门课程兴趣。
推荐IT学长淘宝日用品店530213
展开阅读全文