计算机图形学课程设计实习报告范本
- 格式:doc
- 大小:2.27 MB
- 文档页数:29
《计算机图形学》课程设计报告题目名称:专业班级学号姓名指导教师年月日Solar System(太阳系)软件工程专业学生王洋指导老师李征[摘要]太阳系(Solar System)是以太阳为中心,和所有受到太阳重力约束的天体的集合体,主要包括太阳,八大行星,以及卫星.此课题模拟太阳系围绕太阳运转的模型,以太阳,八大行星和月球形成大致的体系结构,以VC6.0为平台用OpenGL基础知识实现从不同角度观测太阳系.关键词:OpenGL VC6.0 太阳系运转角度一、实验名称:Solar System(太阳系)二、实验的目的和要求:1.熟悉OpenGL基础函数2.通过程序模拟太阳系运行3.实现改变视角观测太阳系三、实验的环境:1.硬件环境:CPU Intel Pentium D ,1G内存2.软件环境:操作系统:Windows xp SP2编译软件及版本:vc6.0 OpenGL环境四、系统描述1.太阳太阳是恒星,能够自转,体积是太阳系中最大的,能够发光,处于太阳系中心位置.2.八大行星八大行星按与太阳距离从近到远分别为:水星,金星,地球,火星,木星,土星,天王星,海王星,各有各的大小,其中以木星最大,以各自不同的公转速度绕太阳运行,并自转.3.月球月球是围绕地球旋转的卫星.体积是系统中最小的,旋转周期比较快。
五. 理论基础:用windows api创建窗口,使用OpenGL绘制函数绘制球体,实现位图文件读取,并转换为纹理,使用系统时间控制球体转动,设置视点视角,通过改变视角从不同角度观测.所使用的计算机图形学理论基础:1.3D管道中的几何变换旋转矩阵行向量为该矩阵坐标系在原坐标系上的坐标,列向量为原坐标系的向量在本旋转矩阵坐标系上的坐标。
旋转是欧氏变换;旋转、放缩是线性变换;旋转、放缩、平移是仿射变换;旋转、放缩、平移、透视投影是射影变换。
线性变换在四维空间,仿射变换在三维空间,射影必须采用摄像坐标系,仿射变换是到自身的一类变换.齐次坐标系就是将一个原本是n维的向量用一个n+1维向量来表示。
西南交通大学信息科学与技术学院计算机图形学实验(2014~2015学年第II学期)实验报告学号:20122712 姓名:魏仁斌专业:软件工程班级: 4课程名称计算机图形学班级软件4班学号___20122712 姓名___魏仁斌 _试验日期2015.3.16实验成绩____ _ 实验名称实验 1 集成开发环境的认识和简单窗口程序移植与创建1. 实验目的熟悉windows编程和VC++编程环境2. 实验设备与环境硬件设备:软件设计工具: Microsoft Visual C++ 6.03. 实验设计说明基本工作原理: windows提供了一系列的API函数实验内容:用VC++创建工程,并且创建一个简单的窗口实验设计步骤、设计过程或执行顺序①可单击Windows桌面上的“开始”按钮,弹出开始菜单,点击→所有程序→MicrosoftVisual Studio 6.0→Microsoft Visual C++ 6.0,单击后进入开发环境。
②用鼠标单击 File 菜单中的 New 菜单项,在系统弹出的对话框中,有四大工作类型供操作选择:Files、Projects、Workspaces、Other Documents,每种类型又包含许多具体的文件类型。
③选择 Projects 标签,在 Project name 下的编辑框中输入应用工程的名称为实验1。
在 Location 标签下的编辑框中,输入保存文件的位置,也可以用鼠标点击旁边的“…”按钮来选择保存文件的目录。
④选择 Projects 标签下的 Win32 Application,点击OK按钮后,自动创建新的工作空间。
⑤本例选择创建空白应用工程(An empty project),单击 Finsh按钮。
⑥点击“OK”按钮,建立空白的Win32应用工程。
⑦用鼠标单击File菜单中New菜单项,在系统弹出的对话框中,在Files标签下,选择C++Source File,在右方的File编辑框中输入源程序文件的名称后单击“OK”。
巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。
由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。
DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。
特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。
同时也熟练运用OpenGL基本的绘图函数。
p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。
特别是对于DDA,Bresenham和画圆算法。
其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。
而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。
而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。
而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。
另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。
计算机图形学课程综合实习实习报告1.实习目的(1)熟练掌握计算机图形学的基本原理和方法。
(2)熟练掌握计算机图形学的算法的程序实现,增强理论联系实际的能力(3)学习和掌握图形系统的设计和开发方法。
(4)学习使用VC++编写计算机图形学基础程序。
2.实习内容2.1程序结构说明2.1.1新建类的说明根据实习要求,对于二维算法的实现主要涉及到的图形有直线、圆形和多边形,因此新建三个类Cline,CCircle和CPolygon,其成员变量分别记录生成图形的参数,包括图形的几何参数(比如直线的端点坐标,圆的圆心坐标和半径)和图形显示效果的一些参数,比如线宽,使用何种方法绘制有一定线宽的直线,线的颜色等,类的成员函数主要作用是用于生成图形(主要是构建函数)、绘制图形(使用图形生成算法而不使用VC++自带的一些图形生成函数)和执行图形编辑操作。
同时由于添加一个对话框资源用于设置线宽和绘制时处理方法的一个对话框,生成对应的对话框处理类CSetWidthDialog,它从CDialog继承来,并添加相应的处理函数用于获得控件中相应的数据。
另外在裁剪时为了使程序的操作性更强,需要有一个临时的裁剪框,而使用MFC的函数或者是我已经写好的程序都没有办法达到理想的效果,因此我又添加一个新的类,叫做CCutRect专门用于处理图形裁剪时的操作。
2.1.2图形信息存储在文档类中添加三个动态文档类数组分别用于存储直线对象,圆对象和多边形对象,同时添加相应的函数,用于向数组中添加新的对象、获得数组长度和获得指定位置的对象,数组声明如下在绘制图形时,每绘制一个图形,就像相应的数组中添加相应的对象,在程序视图刷新时,输出所有图形。
2.1.3图形显示的优化如果在绘制图形及进行图形填充等操作时,直接在屏幕上输出结果,会因为整个I/O 操作拖慢程序的运行效率,具体反映就是图形填充操作时能够明显看出从上到下、逐行输出地过程,而在刷新视图时也可以看到类似的过程,在极端条件下(比如待填充区域很大或是非常复杂)会由于I/O操作不断刷新视图,导致程序永远进行填充,进入死循环。
实习报告实习名称:计算机图形学实习班级:学号:姓名:实习地点:实习指导教师:实习时间:年月日至月日一、实习目的与意义本次计算机图形学的实习分两部分,一部分是利用AutoCAD进行二维和三维模型的制作,另一部分是利用VC6.0进行编程实现对图形的简单操作。
通过对AutoCAD的实习,熟悉该软件的基本功能及操作特点,掌握二维及三维图形的基本制作过程。
通过对VC6.0的编程实习,理解图形的生成、图形的变换、图形的显示以及二维裁剪的基本思想,熟练掌握计算机图形学的基本原理和方法;熟练掌握计算机图形学算法的实现算法;学习和掌握图形系统的设计;学习用VC++编写计算机图形学程序;建立面向对象编程的基本概念。
二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑命令操作(3)标注文字及填充(4)三维图形绘制2.基于VC6.0下的计算机图形学程序编写(1)图形的生成:画直线、画圆、画曲线、画字符(2)图形的变换:平移、旋转、缩放、对称变换(3)图形的显示:扫描线填充、边缘填充、种子填充(4)图形的二维裁剪:CS裁剪、多边形裁剪、梁友栋裁剪、圆裁剪、中点分割法三、实习的主要过程第一部分 AutoCAD软件操作AutoCAD软件可以处理很多问题,在机械制图,土木建筑等方面有着广泛的应用,我们在机房打开AutoCAD软件对其进行系统配置,然后进行具体操作。
通过配置可以实现工具栏之类的快捷运用。
(1)简单图形绘制实习开始的第一天,在老师的讲解以及演示下,我们了解了AutoCAD软件的基本使用方法,与此同时,我们跟着老师的操作也逐渐熟悉了该软件的一些基本操作方法。
从设置基本绘图环境开始,按照指导书上的指示,采用边完成简单图形边学习各种命令的方式,逐渐熟练掌握了AutoCAD的使用,熟练掌握了其基本绘图功能,如掌握了绘图命令POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE的功能及操作;掌握了实体绘图命令键盘输入的方法;掌握了缩放命令(ZOOM)的使用方法等。
实验报告的内容提纲实验报告应包括以下内容:(1)实验题目(2)实验内容(3)实验环境:本次上机实验所使用的平台和相关软件。
(4)问题分析:对所要解决的问题进行阐述和分析,提出解决方法,列出解决步骤。
(5)算法设计:用流程图或伪代码描述解决问题的算法。
(6)源代码(7)程序运行结果(8)总结1实验报告的格式规范(1)报告按以下内容次序编排:封面、成绩评定表、报告。
(2)用A4纸,通栏排版,页边距:上2。
2厘米,下2厘米,左2.7厘米,右2.3厘米;(3)行距一律用1.5倍行距;(4)中文一律用宋体,英文和数字一律用Times New Roman;(5)一级标题用四号粗体,段前段后不空行,二级标题用小四号粗体,左端不缩进,段前段后均不留多余空格;(6)正文用小四号,每段文字首行缩进2个字符.(7)关于正文中的“图”和“表”:➢图形下方标示图号与图名(见下面示例),图号与图名字体要求:中文宋体小五号,数字和英文Times New Roman,小五号;图1 学员报名信息管理模块➢表格上方标示表号与表名(见下面示例),表号与表名字体要求:中文宋体小五号, 数字和英文Times New Roman,小五号。
表1 科目表(tb_Subject)计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名学号专业班级指导教师日期成绩评定表1. 实验内容绘制金刚石图案。
金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线.当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。
绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充.绘制递归圆应用递归的方法绘制如下所示的图案2。
实验环境操作系统:Windows xp编译环境:Vc++6。
03. 问题分析1。
金刚石绘制本实验的核心是在圆的基础上绘制金刚石图案。
金刚石图案是一个二维图案,仅使用二维坐标(x,y)就可以绘制,本实验使用数组实现。
实习报告实习名称:计算机图形学实习班级: 10012班学号:***************: ***实习地点:5栋机房实习指导教师: 付仲良实习时间:2012年6月25日至7月1日遥感信息工程学院目录一、实习目的与意义 (4)二、实习主要内容 (4)1、AutoCAD软件操作 (4)(1)简单图形绘制 (4)(2)图形的基本编辑 (4)(3)文字及填充 (4)(4)三维图形绘制 (4)2、基于VC6.0下的计算机图形学程序编写 (4)(1)画直线、画多边形、画圆、画字符 (4)(2)对多边形进行填充 (4)(3)图形裁剪 (4)(4)图形的几何变换 (4)(5)三维图形的消隐及着色 (4)三、实习的主要过程 (4)第一部分AutoCAD软件操作 (4)(1)简单图形绘制 (5)(2)图形的基本编辑 (7)(3)文字及填充 (9)(4)三维图形绘制 (12)第二部分基于VC6.0下的计算机图形学程序编写 (16)(1)配置 (16)(2)画直线、画多边形、画圆、画字符 (17)(3)对多边形进行填充 (19)(4)图形裁剪 (20)(5)图形的几何变换 (20)(6)三维图形的消隐及着色 (21)四、实习的主要体会 (22)成绩评定 (25)一、实习目的与意义这次计算机图形学实习是在机房实习,我们所采用的是CAD和VC6.0的软件来进行实习,通过CAD 制作二维和三维的模型,通过VC编程实现一些图像的变化。
通过对AutoCAD2004与VC系统的应用实习,熟悉其的基本功能及操作特点,掌握基本的制作过程。
通过本次实习,学生应能熟练使用AutoCAD软件、建立初步面向对象编程的基本概念、以及学会使用VC编程语言。
二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑(3)文字及填充(4)三维图形绘制2、基于VC6.0下的计算机图形学程序编写(1)画直线、画多边形、画圆、画字符(2)对多边形进行填充(3)图形裁剪(4)图形的几何变换(5)三维图形的消隐及着色三、实习的主要过程第一部分AutoCAD软件操作AutoCAD软件能处理相当多的图像,广泛应用于土木建筑等。
《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham算法实验3:椭圆中点Bresenham算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。
三维变换类似于二维,在画图时,把三维坐标转换为二维即可。
三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
计算机图形学实习报告计算机图形学课程设计实验报告姓名:学号:专业:地理信息系统⼀、课程设计⽬的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。
⼆、课程设计内容仿照Windows的附件程序“画图”, ⽤C++语⾔编制⼀个具有交互式绘制和编辑多种图元功能的程序“Mini-Painter”,实现以下功能对应的设计内容:(1) 能够以交互⽅式在图形绘制区绘制点、直线(折线)、圆(椭圆)、圆弧、多边形、Beizer曲线、封闭区域填充、⽂字等基本图元;(2) 设置线条的颜⾊、线型和线条宽度,对绘制的图元进⾏线条和填充属性的修改;(3) ⽀持图元的点选和基于橡⽪筋技术的圈选;(4) 对选中的图元进⾏平移、缩放、旋转和对称等变换;三、实验步骤1.新建MFC应⽤程序1.1新建⼯程。
运⾏VC++6.0,新建⼀个MFC AppWizard[exe]⼯程,并命名为“0710070118”,选择保存路径,确定。
1.2选择应⽤程序的类型,选择“单⽂档”,则可以通过菜单打开对话框2.建⽴单⽂档应⽤程序,在其中调⽤对话框2.1 查看⼯程资源在单击完成之后,即建⽴了⼀个⼯程,在⼯程的左侧资源视图可以看到MFC向导为该程序提供的⼀些资源。
分别如下所⽰:2.2插⼊对话框资源想在⽂档应⽤程序中,通过单击菜单来打开⼀个对话框,⾸先要建⽴该对话框的资源。
右击“resources ”中的“dialog ”项,在弹出的菜单中选择“插⼊”,打开插⼊菜单对话框,如图所⽰:对话框资源插⼊后,可修改⼀些属性,⽐如标题、字体等等。
在对话框空⽩处右击,选择属性就可打开资源的属性对话框,按照要求设置对话框的属性。
2.3布置对话框界⾯对话框资源插⼊后,即可在该对话框上布置各种需要的控件,并可通过编排菜单的各种命令或“对话”⼯具条调整各控件的⼤⼩,位置,对齐⽅式等,还可以单击对话⼯具条上第⼀个按钮“测试”按钮,看到对话框运⾏时的界⾯。
一、实习目的与意义本次实习为集中实习,基于AutoCAD2004平台与VC环境系统,制作二维和三维立体产品。
通过对AutoCAD2004与VC系统的应用实习,熟悉其的基本功能及操作特点,掌握基本的制作过程。
通过本次实习,学生应能熟练使用AutoCAD软件、建立初步面向对象编程的基本概念、以及学会使用VC编程语言。
二、实习主要内容1、AutoCAD软件操作<1)简单图形绘制<2)图形的基本编辑<3)文字及填充<4)三维图形绘制2、基于VC6.0下的计算机图形学程序编写<1)画直线、画多边形、画圆、画字符<2)对多边形进行填充<3)图形裁剪<4)图形的几何变换<5)三维图形的消隐及着色三、实习的主要过程实习为期两周,第一周实习部分为CAD 软件实习,第二部分为计算机图形学基础的编程实习。
第一周实习CAD画图,在实习第一天一晚上老师给我们讲了这两周实训的任务安排,讲述了本周实训的主要内容,实训目的以及意义所在,然后交代了一些细节方面的问题,强调应当注意的一些地方,以及考试成绩打分等。
并建议到图书馆找谢相关的书籍学习。
开始我们跟着实习指导书开始一步一步的做。
b5E2RGbCAP前两天主要学习CAD的二维画图,主要是掌握了二维的POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE、ELLIPSE﹑POLYGON﹑SPLINE﹑MLINE﹑TRACE﹑SOLID﹑XLINE﹑RAY的功能及操作。
学会设置幅面、使用实体绘图工具条、擦除命令(ERASE>、重画命令(REDRAW>及 SOLID命令操作及编辑命令操作MOVE、COPY、MIRROR、ARRAY、BREAK、TRIM、EXTEND、ROTATE、OFFSET、FILLET、CHAMFER。
倒角、补线、SCALE﹑STRETCH﹑DIVIDE﹑MEASURE﹑EXPLODE﹑LENGTHEN﹑MEDIT﹑PEDIT﹑SPLINEDDIT﹑U﹑UNDO。
北京联合大学应用文理学院实验报告课程名称计算机图形学实验(实训)名称圆的扫描转换班级信息与计算科学2009级姓名学号同组者实验(实训)日期完成日期本实验(实训)所用学时统计预习实验(实训)报告总计评阅意见:成绩北京联合大学应用文理学院实验报告一、实验目的1、掌握用中点画圆法进行圆的扫描转换方法;2、掌握用Bresenham画圆法进行圆的扫描转换方法;3、理解中点画圆法与Bresenham画圆法的区别;二、算法原理介绍1、中点画圆算法假设x坐标为xp的各像素点中,与该圆弧最近者已确定,为P(xp,yp),那么,下一个与圆弧最近的像素只能是正右方的P1(xp+1,yp),或右下方的P2(xp+1,yp-1)两者之一。
令M为P1和P2的中点,易知M的坐标为(xp+1,yp-0.5)。
显然,若M在圆内,则P1离圆弧近,应取为下一个像素;否则应取P2。
判别式d:d = F(M)=F(xp+1,yp-0.5)=(xp+1)^2+(yp-0.5)^2-R^2d的初始值为:d0 = F(1,R-0.5)=1+(R-0.5)^2-R^2=1.25-R在d≥0的情况下,取右下方像素P2,d = F(xp+2,yp-1.5)=(xp+2)^2+(yp-1.5)^2-R^2=d+2(xp-yp)+5在d<0的情况下,取正右方像素P1,d = F(xp+2,yp-0.5)=(xp+2)^2+(yp-0.5)^2-R^2=d+2xp+32、 Bresenham画圆算法假设生成圆心在坐标原点,半径为r,从x=0到x=y的1/8圆弧。
xi+1=xi +1相应的y则在两种可能中选择:y=yi,或者y=yi-1选择的原则是考察理想的y值是靠近yi还是靠近yi-1判别式:d i+1=2(xi+1)2+yi2+(yi-1)2-2r2判断式d的初始值为:d0= 3-2r。
如果d i+1>=0,则y=yi-1,di+2 =d i+1 + 4(xi- yi)+10如果d i+1<0,则y=yi,d i+2 =d i+1+ 4x i+6三、程序源代码1、中点画圆算法#include"graphics.h"#include"math.h"#include"conio.h"main(){void MidPointCircle(int,int);/*定义主函数变量,MidPointCircle中点画圆算法函数*/int gdriver,gmode; /*gdriver和gmode分别表示图形驱动器和模式*/gdriver=DETECT; /*DETECT是自动选择显示模式*/initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");/*图形驱动文件的路径*/ MidPointCircle(200,YELLOW); /*定义圆的半径和颜色*/getch();/*getch();会等待你按下任意键,再继续执行下面的语句*/closegraph();/*关闭图形系统*/return(0); /*返回值为0*/}void MidPointCircle(int r,int color) /*定义函数变量半径和颜色*/{ int x,y;float d; /*float类型中小数位数为7位,即可精确到小数点后7位 */x=0; y=r; d=1.25-r;while(x<y) /*满足条件x<y时进入循环,不满足跳出*/{ if(d<0){d+=2*x+3; x++;}else { d+=2*(x-y)+5; x++; y--;}putpixel(x+200,y+200,color); putpixel(y+200,x+200,color);putpixel(200-x,y+200,color); putpixel(y+200,200-x,color);putpixel(200+x,200-y,color); putpixel(200-y,x+200,color);putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);/* putpixel 在指定位置画一像素*/}}2、 Bresenham画圆算法#include"graphics.h"#include"math.h"#include"conio.h"main(){void Bresenham_Circle(int,int);/* Bresenham_Circle为 Bresenham画圆算法函数*/int gdriver,gmode;gdriver=DETECT;initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");Bresenham_Circle(200,YELLOW); /*定义圆的半径和颜色*/getch();closegraph();return(0);}void Bresenham_Circle(int R,int color){ int x,y,delta,delta1,delta2,direction;x=0;y=R;delta=2*(1-R);while(y>=0) /*满足条件y>=0时进入循环,不满足跳出*/{putpixel(x+200,y+200,color); putpixel(y+200,x+200,color);putpixel(200-x,y+200,color); putpixel(y+200,200-x,color);putpixel(200+x,200-y,color); putpixel(200-y,x+200,color);putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);if(delta<0){delta1=2*(delta+y)-1;if(delta1<=0)direction=1;else direction=2;}else if(delta>0){delta2=2*(delta-x)-1;if(delta2<=0) direction=2;else direction=3;}elsedirection=2;switch (direction)/*switch语句,即“切换”语句;case即“情况*/ {case 1:x++;delta+=2*x+1;break;/*执行 break 语句会退出当前循环或语句*/case 2:x++;y--;delta+=2*(x-y+1);break;case 3: y--;delta+=(-2*y+1);break;}}}四、实验结果图1中点画圆算法生成的圆半径r=200,颜色为黄色图2 Bresenham画圆算法生成的圆半径R=200,颜色为黄色五、总结与体会通过运用 C 语言环境下的图像显示设置,本次实验我学会了用中点画圆法、Bresenham 画圆法进行圆的扫描转换,更加深刻的理解了中点画圆法、Bresenham 画圆法进行圆的扫描转换的生成原理。
实习报告实习名称:计算机图形学实习班级:学号:姓名:实习地点:5栋机房实习指导教师: 刘敏付仲良实习时间:2011年6月27日至7月10日遥感信息工程学院一、实习目的与意义本次实习为集中实习,基于AutoCAD2004平台与VC环境系统,制作二维和三维立体产品。
通过对AutoCAD2004与VC系统的应用实习,熟悉其的基本功能及操作特点,掌握基本的制作过程。
通过本次实习,学生应能熟练使用AutoCAD 软件、建立初步面向对象编程的基本概念、以及学会使用VC编程语言。
二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑(3)文字及填充(4)三维图形绘制2、基于VC6.0下的计算机图形学程序编写(1)画直线、画多边形、画圆、画字符(2)对多边形进行填充(3)图形裁剪(4)图形的几何变换(5)三维图形的消隐及着色三、实习的主要过程本次实习分为两个部分:AutoCAD软件操作和基于VC6.0下的计算机图形学程序。
1、AutoCAD软件操作AutoCAD软件操作可分为平时和考核。
(1)、平时主要是按照实习指导书绘制例题,从图2-1到图18-4,我基本上每个图都认认真真画完。
具体过程如下:首先,要熟悉AutoCAD 2000软件系统的启动方法及步骤,基本绘图环境设置的方法及步骤,擦除命令(ERASE)、重画命令(REDRAW)的操作,实体绘图工具条的使用方法,实体绘图下拉菜单的使用方法,实体绘图命令键盘输入的方法,缩放命令(ZOOM)的使用方法,特殊点的输入方法,数据的输入方法。
在这个过程中,我认真地按照指导书的内容实习,掌握绘图命令POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE的功能及操作。
我依照指导书的内容,成功完成了图2-1,图2-2的绘制,初步理解了CAD的作图过程,因此独立完成了图2-3,图2-4,图2-5的绘制。
然后,根据实习指导的要求,我又进一步掌握了基本绘图环境设置的方法及步骤,从开始的只会用键盘输入命令到掌握实体绘图工具条和实体绘图下拉菜单的使用方法。
工作报告之计算机图形学实验报告计算机图形学实验报告【篇一:计算机图形学实验报告及代码】第1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。
二、教学要求1. 了解计算机图形学的概念和研究内容;2. 了解本门课程的发展概况。
三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。
五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。
八、教学内容1.1 计算机图形学的研究内容计算机图形学(computer graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。
计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。
具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。
(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2d):在平面坐标系中定义的图形(2).三维图形(3d):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。
(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。
《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham 算法实验3:椭圆中点Bresenham 算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
实验零? Visual C++ 2005绘图系统地点:土木楼B401机房时间:星期三下午节次:第三大节一、实验目的:1. 了解Visual C++ 2005绘图的基本概念2. 了解Visual C++ 2005绘图环境3. 掌握用Visual C++ 2005设计绘图项目的基本步骤4. 掌握用Visual C++ 2005绘图的基本命令二、实验内容:实验内容1:创建绘图应用程序主框架实验内容2:应用程序编译运行实验内容3:设置菜单项并生成消息响应函数实验内容4:SetPixel绘图三、实验步骤:实验内容1:创建绘图应用程序主框架步骤:1.创建一个工作目录D:\MyProject2.启动Visual Studio 20053.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++”->“MFC”,模版选择“MFC应用程序”。
在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。
4.单击“确定”按钮。
5.单击“下一步”按钮。
6.在“应用程序类型中”,选择“单文档”类型。
7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。
实验内容2:应用程序编译运行运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下:1.生成解决方案点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。
2.调试运行程序点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。
结果如下:生成Release解决方案步骤如下:1.生成解决方案点击“生成-〉批生成”。
2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。
3.查看目录,sample.exe是Release版,单击即可以运行。
运行结果:实验内容3:设置菜单项并生成消息响应函数1.弹出菜单设计器双击“资源视图”中的“Menu”展开文件夹,双击“IDR_MAINFRAME”,弹出菜单设计器。
实验零 Visual C++ 2005绘图系统地点:土木楼B401机房时间:星期三下午节次:第三大节一、实验目的:1. 了解Visual C++ 2005绘图的基本概念2. 了解Visual C++ 2005绘图环境3. 掌握用Visual C++ 2005设计绘图项目的基本步骤4. 掌握用Visual C++ 2005绘图的基本命令二、实验容:实验容1:创建绘图应用程序主框架实验容2:应用程序编译运行实验容3:设置菜单项并生成消息响应函数实验容4:SetPixel绘图三、实验步骤:实验容1:创建绘图应用程序主框架步骤:1.创建一个工作目录D:\MyProject2.启动 Visual Studio 20053.单击“文件”->“新建”->“项目”,项目类型对话框中选择“其他语言”->“VC++” ->“MFC”,模版选择“MFC应用程序”。
在工作目录D:\MyProject 下创建一个新应用项目: Sample,如下图所示。
4.单击“确定”按钮。
5.单击“下一步”按钮。
6.在“应用程序类型中”,选择“单文档”类型。
7.单击“完成”,创建了一项空的工程-绘图应用程序主框架。
实验容2:应用程序编译运行运行版本有两类:Debug、Release, 生成Debug解决方案步骤如下: 1.生成解决方案点击“生成-〉生成解决方案”, 生成了Debug版的可运行程序。
2.调试运行程序点击菜单“调试——〉开始执行(不调试)”, 执行Debug版的可运行程序。
结果如下:生成Release解决方案步骤如下:1.生成解决方案点击“生成-〉批生成”。
2.勾选“Release”,单击“生成”,生成可以独立于Visual C++ 2005外运行的.exe程序。
3.查看目录,sample.exe是Release版,单击即可以运行。
运行结果:实验容3:设置菜单项并生成消息响应函数1.弹出菜单设计器单击“解决方案管理器”窗口中的资源文件Sample.rc,弹出资源视图,2.插入一项菜单双击“资源视图”中的“Menu”展开文件夹,双击“IDR_MAINFRAME”,弹出菜单设计器。
右健单击菜单设计器的“帮助”,选择“新插入”,插入一项菜单。
在新插入的菜单项的“Caption”中输入“绘图”。
3.输入ID输入“打开”菜单项,输入“直线”菜单项,在“直线”菜单项下输入“DDA”菜单,“DDA”菜单的ID为ID_LINE_DDA。
ID Caption 功能ID_LINE_DDA DDA用DDA发绘制直线4.调出类视图窗口单击菜单“视图-〉类视图”,在“解决方案管理器”窗口中出现“类视图”窗口。
4.生成菜单消息响应函数在类视图窗口,单击Csample0View类,单击事件按钮,5.选择ID_LINE_DDA的COMMAND,添加OnLineDDA事件。
6.进入代码编辑器在void Csample0View::OnLineDda()中的// TODO: 在此添加命令处理程序代码处输入的自己代码:AfxMessageBox("Hello World",MB_OK,NULL);7.修改项目字符集属性选择“项目”菜单->属性->,弹出“属性”对话框,选择“配置属性 ->常规->字符集”,改为“未设置”。
8.运行结果重新生成解决方案,运行结果如下。
实验容4:SetPixel绘图在void Csample0View::OnLineDda()中的// TODO: 在此添加命令处理程序代码处输入的代码:// TODO: Add your command handler code hereCClientDC *pdc=new CClientDC(this);CPen pen;pen.CreatePen(PS_DOT,1,RGB(255,0,0));CPen *oldpen=(CPen*)pdc->SelectObject(&pen);int x,y;y=100;for(x=100;x<=300;x+=3){y++;pdc->SetPixelV(x,y,RGB(255,0,0));}pdc->DeleteDC();}运行结果如下。
四、实验结果:实验容1:创建绘图应用程序主框架结果实验容2:应用程序编译运行结果实验容3:设置菜单项并生成消息响应函数实验容4:SetPixel绘图五、回答如下问题:解释以下每条命令的含义CClientDC *pdc=new CClientDC(this);//定义一个指针类型的CClientDC对象,客户区设备上下文用于客//户区的输出,与特定窗口关联CPen pen;//定义一个画笔对象pen.CreatePen(PS_DOT,1,RGB(255,0,0));//赋予pen对象以风格CPen *oldpen=(CPen*)pdc->SelectObject(&pen);//pdc->SetPixelV(x,y,RGB(255,0,0));//画出像素坐标为(x,y),风格为红色的一点六、其它的实验容:答:工具条按钮的添加七、实验中发现的问题及你解决的方法:答:发现的问题:调试过程中出现如下错误解决的方法:重新生成解决方案,如还出现则多生成几次。
实验一直线的生成算法地点:土木楼B401机房时间:星期三下午节次:第三大节一、实验目的:1.理解DDA算法2.理解中点Bresenham算法3.理解改进的Bresenham算法4.了解DDA和Bresenham算法的区别,以及生成图形的差异原因二、实验容:实验容1:设计DDA算法程序实验容2:设计中点Bresenham算法程序实验容3:改进的Bresenham算法三、实验步骤:实验容1:设计DDA算法程序添加函数:void DDALine(int Xa, int Ya, int Xb, int Yb)//DDA算法void CSampleView::DDALine(int Xa, int Ya, int Xb, int Yb){CClientDC *pdc=new CClientDC(this);CPen pen;pen.CreatePen(PS_DOT,1,RGB(255,0,0));CPen *oldpen=(CPen*)pdc->SelectObject(&pen);float delta_x,delta_y;int x,y;int dx,dy,steps,k;dx=Xb-Xa;dy=Yb-Ya;if(abs(dx)>abs(dy))steps=abs(dx);else steps=abs(dy);delta_x=(float)dx/(float)steps;delta_y=(float)dy/(float)steps;x=Xa;y=Ya;pdc->SetPixelV(x,y,RGB(255,0,0));for(k=1;k<=steps;k++){x+=(int)delta_x;y+=(int)delta_y;pdc->SetPixelV(x,y,RGB(255,0,0));}pdc->DeleteDC();添加事件响应函数:// 消息响应函数DDA算法程序的设计画直线void CSampleView::OnDdaLine(){DDALine(100,100,300,300);}实验容2:设计中点Bresenham算法程序添加函数:void LineBresenhams(int Xa,int Ya,int Xb,int Yb)//Bresenhams算法程序的设计画直线的实现void CSampleView::LineBresenhams(int Xa,int Ya,int Xb,int Yb) { CClientDC *pdc=new CClientDC(this);CPen pen;pen.CreatePen(PS_DOT,1,RGB(255,0,0));CPen *oldpen=(CPen*)pdc->SelectObject(&pen);int dx=abs(Xa-Xb);int dy=abs(Ya-Yb);int p=2*dy-dx;int twody=2*dy;int twodydx = 2*(dy-dx);int x,y,xend;if(Xa>Xb){ x=Xb; y=Yb;xend=Xa;}else{x=Xa;y=Ya;xend=Xb;}pdc->SetPixelV(x,y,RGB(255,0,0));;while(x<xend){ x++;if(p<0)p+=twody;else{y++;p+=twodydx; }pdc->SetPixelV(x,y,RGB(255,0,0));;}}添加事件响应函数:void CSampleView::OnBresenhamline(){// TODO: 在此添加命令处理程序代码LineBresenhams(100,200,300,300);实验容3:改进的Bresenham算法添加函数:void ImproveBresenhams(int Xa, int Ya, int Xb, int Yb)//Bresenham算法改进算法的实现void CSampleView::ImproveBresenhams(int Xa, int Ya, int Xb, int Yb) { CClientDC *pdc=new CClientDC(this);CPen pen;pen.CreatePen(PS_DOT,1,RGB(255,0,0));CPen *oldpen=(CPen*)pdc->SelectObject(&pen);int dx,dy,e,x,y;dx=Xb-Xa;dy=Yb-Ya;e=-dx;x=Xa;y=Ya;while(x<=Xb){pdc->SetPixelV(x,y,RGB(255,0,0));;x++;e+=2*dy;if(e>0){y++;e-=2*dx;}}}添加事件响应函数://菜单响应函数生成直线ImproveBresenhams算法void CSampleView::OnImprove(){// TODO: 在此添加命令处理程序代码ImproveBresenhams(200,100,300,300);}四、实验结果:实验容1:设计DDA算法程序实验容2:设计中点Bresenham算法程序实验容3:改进的Bresenham算法五、回答如下问题:DDA算法的缺点是什么?答:DDA算法的缺点是:它的y和斜率k必须用浮点数表示,而且每一步都必须对y进行舍入取整,这不利于用硬件实现。