计算机图形学.docx
《计算机图形学.docx》由会员分享,可在线阅读,更多相关《计算机图形学.docx(36页珍藏版)》请在冰点文库上搜索。
计算机图形学
课程设计报告
课程名称计算机图形学
课题名称交互式绘图系统
专业计算机科学与技术
班级0902班
学号200903010208
姓名陈瑾
指导教师刘长松曹燚
2012年10月9日
湖南工程学院
课程设计任务书
课程名称计算机图形学
课题交互式绘图系统
专业班级计算机0902
学生姓名陈瑾
学号200903010208
指导老师刘长松曹燚
审批
任务书下达日期2012年9月15日
任务完成日期2012年10月9日
一、设计内容与设计要求
1.设计内容:
用橡皮法实现交互式绘图系统。
2.设计要求:
在屏幕上可以选择不同的命令、来实现不同基本图形的绘制。
完成橡皮筋直线,橡皮筋圆,橡皮筋矩形框,多边形裁剪和3阶B样条曲线的作图,且要有比较友好的界面。
3.算法提示:
首先在屏幕上画出菜单和绘图窗口,显示鼠标。
点击相应菜单,点击鼠标,移动鼠标,获取鼠标移动相对位置,画出相应图形。
相关变量定义:
#define_MOUSE 鼠标
#defineCIRCLE1 圆
#defineLINE2 直线
#defineRECTANGLE3 矩形
#include"stdio.h"
#include"string.h"
#include"graphics.h"
#include"math.h"
#include
unionREGSinreg,outreg;
structSREGSsr;
相关函数:
voidmeun(intx,inty,char*str)
{
setcolor(8);
outtextxy(x+5,28,str);
setcolor(15);
line(x,22,x,40);
line(x,22,y,22);
setcolor(8);
line(x,40,y,40);
line(y,22,y,40);
}
voiddrawwindows() 画窗口
{
setbkcolor(7);/*7*/
setcolor(8);
rectangle(0,20,640,460);
rectangle(0,0,640,20);
setfillstyle(1,1);
floodfill(1,1,8);
rectangle(0,460,640,480);
setfillstyle(1,15);
floodfill(1,461,8);
setcolor(RED);
outtextxy(10,468,"FinishedByXuYuanFei.");
setcolor(15);
line(0,41,640,41);
line(0,459,640,459);
setcolor(8);
line(0,42,640,42);
setcolor(15);
rectangle(610,3,630,17);
setfillstyle(1,7);
floodfill(611,4,15);
setcolor(8);
line(610,17,630,17);
line(630,3,630,17);
line(611,4,628,16);
line(611,16,628,4);
rectangle(2,44,635,459);
setcolor(15);
rectangle(3,45,634,458);
line(611,3,628,15);
line(611,15,628,3);
meun(5,55,"line");
meun(65,165,"rectangle");
meun(175,250,"circle");
meun(260,330,"Bezer");
meun(340,400,"Cut");
}
int_cut() 裁剪
voidmycircle(doublex,doubley,doubler) 画圆
{
doublei;
for(i=0.0;i<360.0;i=i+4)
line(x+r*cos((i+1)/360*3.1415*2),y+r*sin((i+1)/360*3.1415*2),x+r*cos((i+4.0)/360*3.1415*2),y+r*sin((i+4.0)/360*3.1415*2));
}
void_Bezer(inta[3],intb[3],intm) Beizier曲线
voidDisplayMouse() 显示鼠标
{
inreg.x.ax=1;
int86(0x33,&inreg,&outreg);
}
voidCloseMouse() 关闭鼠标
{
inreg.x.ax=2;
int86(0x33,&inreg,&outreg);
}
unionREGSDisplayMouseStatus() 显示鼠标状态
{
inreg.x.ax=3;
int86(0x33,&inreg,&outreg);
returnoutreg;
}
voidGetMouseXY(int*x,int*y) 得到鼠标位置
{
DisplayMouse();
outreg=DisplayMouseStatus();
*x=outreg.x.cx;
*y=outreg.x.dx;
}
响应相应函数
void_mytreat(intoldx,intoldy,intx,inty)
{
if(num==1)
{
if(flag==LINE)
{
line(px,py,oldx,oldy);
line(px,py,x,y);
}
if(flag==CIRCLE)
{
mycircle(px,py,sqrt((double)((px-oldx)*(px-oldx)+(py-oldy)*(py-oldy))));
mycircle(px,py,sqrt((double)((px-x)*(px-x)+(py-y)*(py-y))));
}
if(flag==RECTANGLE)
{
rectangle(px,py,oldx,oldy);
rectangle(px,py,x,y);
}
}
}
二、进度安排
第3周星期一8:
00——12:
00
星期二8:
00——12:
00
星期三8:
00——12:
00
星期四8:
00——12:
00
星期五8:
00——12:
00
第4周星期一8:
00——12:
00
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
目录
一、概述……………………………………………………………1
二、功能模块的划分………………………………………………2
三、主要功能的实现………………………………………………3
四、程序调试………………………………………………………4
五、总结……………………………………………………………5
六、附录……………………………………………………………6
一、概述
1、交互式系统:
随着计算机绘图技术的广泛应用,交互处理已是必不可少的容。
一个交互图形系统使用户能动态的输入坐标位置,指定选择功能,设置交换参数,以及在图形显示期间能够对花面上的某些部分进行修改、删除、增添、存储和在显示操作,且能全部徒手绘图。
交互式绘图软件系统都为用户提供了一个交互工作环境,称交互界面。
通常在图形显示方式,把屏幕划分为图形区,菜单区和提示区。
交互式绘图系统的基本功能一般可归纳为绘图功能、图形编辑、尺寸标准、作图工具、显示功能、询问功能、信息转换、和二次开发工具。
2、橡皮筋技术:
橡皮筋技术是在平面上确定一条直线一般是先定下起点再定下终点,最后把起点和终点连成直线。
如果要求这条直线能通过平面上某一点或和一已知圆相切,上述方法便不易做得很准确。
所谓橡皮筋技术就是在起点确定后,光标移出去定终点时,在屏幕上始终显示一条连接起点和光标中心的直线,这条直线随着光标中心位置的变动而变动,它就像在起点和光标中心之间紧紧地拉着一根橡皮筋,有了这根橡皮筋便比较容易地找到通过一个点或和一个圆相切的直线的位置。
二、功能模块的划分
本程序是采用VC6.0编写的一个绘图系统,在屏幕上可以选择不同的命令、来实现不同基本图形和颜色的绘制。
通过该系统可以完成橡皮筋直线,橡皮筋圆,橡皮筋矩形框,多边形裁剪和3阶B样条曲线的作图,它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和简易的菜单进行操作,适合简单的画图,对学习用一定的帮助。
本程序的功能模块划分如下:
1、画点:
运行程序后单击“绘图”菜单,选择“点”后,用鼠标在视图中任意一个地方,点击下鼠标左键便可在视图中出现一点。
2、画直线:
运行程序后单击“绘图”菜单,选择“直线”后,用鼠标左键在视图框中任意一地方,用来确定直线的起始点,点击鼠标左键不松,在视图框中随意拉动鼠标便可看见一直线随鼠标的变动而变动,当松去左键时,便在视图中画出一条直线。
3、画矩形:
运行程序后单击“绘图”菜单,选择“矩形”后,用鼠标左键在视图框中随意点击任意一个地方,用来确定矩形的起始点,然后按住鼠标左键不松,随意改变鼠标点的位置用鼠标,会有虚框显示,松下鼠标左键,即可在视图中画出一个矩形。
4、画圆:
运行程序后单击“绘图”菜单,选择“圆”后,用鼠标左键在视图框中随意点击任意一个地方,用来确定圆的起始点,然后,按住左键不松,在视图框任意拉动鼠标,便可看到随鼠标移动的圆,当松去左键时,便可以在视图框中确定圆行,这样便画出了一个圆。
5、设置线型:
运行程序后单击“绘图”菜单,选择“设置”后,跟据弹出的对话框和实际的需求选择画直线,画矩形,画圆的线型,有“实线”,“虚线”,和“点线”,选定后点击确定即可。
6、设置颜色:
运行程序后单击“绘图”菜单,选择“颜色”后,根据弹出的调色板选择自己想要的颜色,然后点击确定即可。
3、主要功能的实现:
1、编辑对话框:
点击ResourceView中的Menu,双击其内部的IDR-MAINFRAME,如下图:
便可以编辑菜单选项了。
右击各个菜单,选择ClassWizard…弹出对话框如下:
对各个菜单添加功能后,点击EditCode,便可以编写函数,其函数如下:
voidCGraphicView:
:
OnDot()//点
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=1;
}
voidCGraphicView:
:
OnLine()//直线
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=2;
}
voidCGraphicView:
:
OnRectangle()//矩形
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=3;
}
voidCGraphicView:
:
OnEllipse()//圆
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=4;
}
2、画图功能实现:
确定起始点,确定图形;
voidCGraphicView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
m_ptOrigin=point;//Æðµã×ø±ê
m_endpoint=m_ptOrigin;
linepointnum=1;
CView:
:
OnLButtonDown(nFlags,point);
}
voidCGraphicView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
linepointnum=0;
CClientDCdc(this);
CPenpen(m_nLineStyle,0,m_clr);
dc.SelectObject(&pen);
CBrush*pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//͸Ã÷µÄ»Ë¢
dc.SelectObject(pBrush);
switch(m_nDrawType){
case1:
dc.SetPixel(point,m_clr);
break;
case2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case4:
if(abs(point.y-m_ptOrigin.y)>abs(point.x-m_ptOrigin.x))
{
if(point.y>m_ptOrigin.y){
dc.Ellipse(CRect(m_ptOrigin.x,m_ptOrigin.y,point.x,m_ptOrigin.y+abs(point.x-m_ptOrigin.x)));
}
else
{
dc.Ellipse(CRect(m_ptOrigin.x,m_ptOrigin.y,point.x,m_ptOrigin.y-abs(point.x-m_ptOrigin.x)));
}
}
else
{
if(point.x>m_ptOrigin.x)
{
dc.Ellipse(CRect(m_ptOrigin.x,m_ptOrigin.y,m_ptOrigin.x+abs(point.y-m_ptOrigin.y),point.y));
}
else
{
dc.Ellipse(CRect(m_ptOrigin.x,m_ptOrigin.y,m_ptOrigin.x-abs(point.y-m_ptOrigin.y),point.y));
}
}
//dc.Ellipse(CRect(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y));
break;
}
CGraph*pGraph=newCGraph(m_nDrawType,m_ptOrigin,point,m_clr,m_nLineStyle);
m_ptrArray.Add(pGraph);
CView:
:
OnLButtonUp(nFlags,point);
}
3、线条设置:
voidCGraphicView:
:
OnSetting()
{
//TODO:
Addyourcommandhandlercodehere
CSettingDlgdlg;
dlg.m_nLineStyle=m_nLineStyle;
if(IDOK==dlg.DoModal()){
m_nLineStyle=dlg.m_nLineStyle;
}
}
4、颜色设置:
voidCGraphicView:
:
OnColor()
{
//TODO:
Addyourcommandhandlercodehere
CColorDialogdlg;
dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;
dlg.m_cc.rgbResult=m_clr;
if(IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;
}
}
二、程序调试:
1、画点的实现:
在“绘图”菜单中选择“点”:
操作结果如下显示:
2、画点的实现:
在“绘图”菜单中选择“直线”:
操作结果如下显示:
2、画点的实现:
在“绘图”菜单中选择“矩形”:
操作结果如下显示:
3、画点的实现:
在“绘图”菜单中选择“圆”:
操作结果如下显示:
4、线型实现:
在“绘图”菜单中选择“设置”:
操作结果如下显示:
根据所需,选择相对的线型。
4、线型实现:
在“绘图”菜单中选择“设置”:
操作结果如下显示:
选择想要的颜色即可。
选择虚线和红色,测试绘图如下:
五、总结:
这次课程设计的课题是交互式绘图系统,通过这次课程设计初步了解了橡皮筋技术的基本概念以及它在交互式绘图过程中的作用,使用橡皮筋技术构造直线、矩形和圆的操作过程和方法。
经过这次课程设计,不但巩固了上学期在课堂上学的知识,而且还学到了一些上机的基本操作,提高了动手能力。
由于这门课程是上学期开的,经过了一个暑假,对于这方面的相关知识有些不太熟悉了,这次课程设计给了我一个很好的温习机会,在做课程设计时不尽尽只是完成这个任务,使得我重新找出了相关资料,又认认真真的将需要用到的一些知识巩固了,加深了印象同时锻炼了动手的能力。
在整个过程中,通过解决课程设计中出现的问题,提高了解决问题的能力。
总之,在老师和同学的帮助下还算顺利的完成了橡皮筋直线、橡皮筋圆、橡皮筋矩形框、多边形裁剪和3阶B曲线作图,并且有简单的图形界面。
虽然只是一次短暂的课程设计,但受益匪浅。
六、附录:
1、参考文献:
(1)唐泽圣周嘉玉李新友编著《计算机图形学基础》,北京清华大学出版社1995;
(2)汝传邹北软编著《计算机图形学》,北京人名邮电出版社2002;
(3)网络资料。
2、源代码:
CGraph类中的函数:
#if!
defined(AFX_GRAPH_H__40F8ED15_A3A1_4BE2_84D1_949DCCACA01A__INCLUDED_)
#defineAFX_GRAPH_H__40F8ED15_A3A1_4BE2_84D1_949DCCACA01A__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
classCGraph
{
public:
CPointm_ptOrigin;
CPointm_ptEnd;
UINTm_nDrawType;
COLORREFm_clr;
intm_nLineStyle;
CGraph();
CGraph(UINTm_nDrawType,CPointm_ptOrigin,CPointm_ptEnd,COLORREFm_clr,intm_nLineStyle);
virtual~CGraph();
};
#endif//!
defined(AFX_GRAPH_H__40F8ED15_A3A1_4BE2_84D1_949DCCACA01A__INCLUDED_)
//Graph.cpp:
implementationoftheCGraphclass.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"Graphic.h"
#include"Graph.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGraph:
:
CGraph()
{
}
CGraph:
:
CGraph(UINTm_nDrawType,CPointm_ptOrigin,CPointm_ptEnd,COLORREFm_clr,intm_nLineStyle)
{
this->m_nDrawType=m_nDrawType;
this->m_ptOrigin=m_ptOrigin;
this->m_ptEnd=m_ptEnd;
this->m_clr=m_clr;
this->m_nLineStyle=m_nLineStyle;
}
CGraph:
:
~CGraph()
{
}
CGraphicView类中的函数:
//GraphicView.cpp:
implementationoftheCGraphicViewclass
//
#include"stdafx.h"
#include"Graphic.h"
#include"SettingDlg.h"
#include"GraphicDoc.h"
#include"GraphicView.h"
#include"Graph.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CGraphicView
IMPLEMENT_DYNCREATE(CGraphicView,CView)
BEGIN_MESSAGE_MAP(CGraphicView,CView)
//{{AFX_MSG_MAP(CGraphicView)
ON_COMMAND(ID_DOT,OnDot)
ON_COMMAND(IDM_LINE,OnLine)
ON_COMMAN