【VB开源代码栏目提醒】:网学会员为需要VB开源代码的朋友们搜集整理了【精品】2开题报告(二维线画图元的生成算法MATLAB GUI设计) - 大学课件相关资料,希望对各位网友有所帮助!
( 2010 届) 本科
毕业论文(设计) 开 题 报 告题 目:二维线画图元的生成算法 MATLAB GUI 设计学 院: 数学与信息工程学院专 业: 信息与计算科学班 级: 信计 061学 号: 200649295108: 王 文 涛一、选题的背景、意义 1.选题的背景 计算机图形学是计算机科学最活跃的分支之一,它伴随着计算机技术的发展而发展。
事实上,图形学的应用从某种意义上标志着计算机软、硬件的发展水平。
计算机图形学之所以能在它的短短 30 多年历史中获得飞速发展,其根本原因是图形为传递信息的最主要的媒体之一,人们要利用计算机进行工作,必须有人和
计算机之间传递信息的手段——人机界面。
计算机图形学来源于生活、科学、工程技术、艺术、音乐、舞蹈、电影制作等,反过来,它又大大促进了这些领域的发展。
MATLAB 具有强大的矩阵计算和数据可视化能力.一方面可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、系统仿真等若干个领域的数学计算,另一方面可以实现二维、三维图形绘制、三维场景创建和渲染、科学计算可视化、图像处理、虚拟现实和地图制作等图形图像方面的处理. 2.选题的意义 在科学研究和工程应用中,人们通常希望将数据、设计或计算结果用交互式图形表示,以使数据的特征或性能能够清晰、直观地以 GUI 方式展现。
使用 MATLAB 提供的图形设计技术,用户无须了解图形实现的细节内容,有时甚至只需要几个简单的函数就可以绘制非常复 1杂的图形。
图形,广义的讲是指能够在人的视觉系统中形成视觉印象的客观事物。
在计算 (1)点阵法 (2)参数法。
参数描述的图形叫做参数图(简机中表示一个图形有两种方法: ,点阵法描述的图形称为像素图或图像。
所谓生成图元是指完成从图元的参数表示称图形) 2形式转换成点阵表示形式,通常也称扫描转换图元。
利用 MATLAB 提供的 GUI 设计工具或 1编写程序,可以简单、便捷地设计出美观、方便的菜单化和控件式的人机交互界面。
这里只简单介绍直线段、圆弧的扫描转换算法。
二、研究的基本内容与拟解决的主要问题2.1 MATLAB 软件介绍 1、52.1.1 MATLAB
软件概况 MATLAB 是矩阵实验室(Matrix Laboratory)之意。
除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学工程中常用的形式十分相似故用 MATLAB来解算问题要比用 CFORTRAN 等语言完成相同的事情简捷得多。
当前流行的 MATLAB5.3/Simulink 3.0 包括拥有数百个内部函数的主包和三十几种工具包Toolbox.工具包又可以分为功能性工具包和学科工具包。
功能工具包用来扩充 MATLAB 的符号计算可视化建模仿真文字处理及实时控制等功能。
学科工具包是专业性比较强的工具包控制工具包信号处理工具包通信工具包等都属于此类。
开放性使 MATLAB 广受用户欢迎.除内部函数外所有MATLAB 主包文件和各种工具包都是可读可修改的文件用户通过对源程序的修改或加入自己编写程序构造新的专用工具包. MATLAB 将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,从而被广泛地应用于科学计算、控制系统、信息处理等领域的分析、仿真和
设计工作,而且利用 MATLAB产品的开放式结构,可以非常容易地对 MATLAB 的功能进行扩充,从而不断完善 MATLAB 产品以提高产品自身的竞争能力。
目前 MATLAB 产品族可以用来完成以下功能:数据分析;数值和符号运算;工程与科学绘画;控制系统的设计与仿真;数字图像处理;建模、仿真、原型开发;数字信号处理;
通信系统设计与仿真;图形用户界面设计。
12.1.2 MATLAB 语言特点 MATLAB 语言有不同于其他高级语言的特点,它被称为第四代计算机语言,MATLAB 语言的最大特点就是简单和直接。
正如第三代计算机语言使人们摆脱对计算机硬件操作一样,MATLAB 语言使人们从烦琐的程序
代码中解放出来。
它丰富的函数使开发者无须重复编程,只要简单的调用和使用即可。
MATLAB 语言的主要特点可概括如下:(1)编程效率高 MATLAB 是一种面向科学和工程计算的高级语言。
允许数字形式的语言编写程序,且也BASIC/Fortran 和 C 等语言更加接近书写计算公式的思维方式,用 MATLAB 编写程序犹如在演算纸上排列公式与求解问题,因此也通俗地称 MATLAB 语言为演算纸式科学算法语言。
忧郁它编写简单,所以程序设计效率高,易学易懂。
(2)使用方便 MATLAB 是一种解释执行的语言(在没有被专门的工具编译前),它灵活、方便,调试程序手段丰富,调试速度快。
人们任何一种语言编写程序和调试程序一般要经过 4 个步骤:编辑、编译、连接和执行。
各个步骤之间是顺序关系,编程的过程就是他们之间做瀑布式的循环。
MATLAB 与其他语言相比,较好地解决了上述
问题,把编辑、编译、连接和执行融为一体。
它能在同一画面中灵活地操作,快速排除输入过程的书写错误、语法错误甚至语意,从而加快了用户编写、修改和调试
程序的速度,可以说在编程和调试过程中,它是一种比
VB 还要简单的语言。
(3)扩充能力强,交互性好 高版本的 MATLAB 语言有丰富的库函数,在进行复杂数学运算的时候可以直接调用,而 所有用户文件也可作为 MATLAB 的库函数调用。
且 MATLAB 的库函数同用户文件在形式上一样,因而,用户可以根据自己的需要方便地建立和扩充新的库函数,提高 MATLAB 的使用效率和扩充它的功能。
另外,为了充分利用 Fortran、C 语言的资源,包括用户自己已经编好的Fortran、C 语言陈旭,通过建立 M 文件的形式,混合编程,方便地调用有关的 Fortran、C语言的子程序,还可以在 C 语言和 Fortran 语言中方便地使用 MATLAB 的数值计算能力,良好的交互式使程序员可以使用以前编写过的程序,减少重复性的
工作,也使现在编写的程序具有重复利用的价值。
4 语句简单,内涵丰富 MATLAB 语 言 中 最 基 本 、 最 重 要 的 成 分 是 函 数 , 其 一 般 形 式 为 a b c fu nd e f ,即一个函数由函数名、输入变量和输出变量组成。
同一函数 名 fun ,不同数目的输入变量(包括无输入变量)及不同数目的输出变量,代表着不同的 。
这不仅使 MATLAB 得库函数功能丰富,而且大大减含义(有点像面向对象中的多态性)少了需要的磁盘空间,使得 MATLAB 编写的 M 文件简单、短小而高效。
5 高效方便的矩阵和数组运算 MATLAB 语言像 BASIC、Fortran 和 C 语言一样规定了矩阵的算术运算符、关系运算符、逻辑运算符、条件运算符及赋值运算符,而且这些运算符大部分可以毫无改变地照搬到数组间的运算中,有些运算符只要增加“.”,就可用于数组见间的运算。
另外,它不需定义数组的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在求解诸如信号处理、建模、
系统识别、控制、优化等领域的问题时,显得大为简单、高效、方便,这是其他高级语言所不能比的。
在此基础上,它一定能名副其实地成为“万能演算纸式的”科学算法语言。
(6) 边界强大的绘图功能 MATLAB 的绘图功能是十分方便的,它有一系列绘图函数(命令),例如线性坐标、对数坐标、半对数左边及极坐标。
只需调用不同的绘图函数(命令),即可在图上标出图题、XY 轴标注,格(栅)绘制也需要调用相同的命令,简单易行。
两外,在调用绘图函数时调整自变量可以绘出不同颜色的点、线、复线或多重线。
这种为科学研究着想的设计是通用编程语言所不能及的。
(7) 功能强大,设计简捷的工具箱 MATLAB 提供了许多面向应用问题的工具箱函数,从而大大方便了各个领域专家学者的使用,目前,MATLAB 提供了 30 多个工具箱函数,如信号处理、图像处理、控制系统、非线性控制系统、鲁棒控制、系统识别、最优化、神经
网络、模糊系统和小波等。
他们提供了各个领域应用问题求解的便利函数,使系统分析和设计变得简捷。
(8) 移植性好,开放性好 MATLAB 是用 C 语言编写的,而 C 语言的可移植性很好,于是 MATLAB 可以很方便地移植 而到能运行 C 语言的操作平台上, MATLAB 是和的工作平台有: UNIXLinux、 Windowa、 VMS6.1、PowerMac。
除了内部函数外,MATLAB 所有核心文件和工具箱都是开放式的,都是可读可写的源文件,用户可以通过对源文件的修改自己编程构成新的工具箱。
12.1.3 MATLAB GUI 介绍 图形用户界面(GUI)是由窗口、光标、按键、菜单、文字说明等对象(Objects)构成的一个用户界面。
用户通过一定的方法选择、激活这些图形对象,是计算机产生某种动作或变化,比如实现计算、绘图等。
一个好的 GUI 能够使程序更加容易使用。
它提供给用户一个常见的界面,还提供一些空间,例如按钮、列表框、滑块、菜单等。
用户图形界面应当是易理解且操作时可以预告的,所以当用户进行某一项操作时,它知道如何去做。
例如,当鼠标在一个按钮上发生了单击事件,利用消息驱动机制,用户图形界面初始化它的操作,并在按钮的标签上对这个操作进行描述。
创建 MATLAB 用户图形界面必须具有以下 3 个基本元素: (1)组件 在 MATLAB GUI 中的每一个项目(按钮、标签、编辑框等)都是一个图 、静态元素(窗形化组件。
组件可分为 3 类:图形化控件(按钮、编辑框、
列表、滚动条等) 、菜单和坐标系。
图形化控件和静态元素有函数 nicontrol 创建,菜单由口和文本字符串)函数 unimenu 和 uicontextmenu 创建,坐标系经
常用于显示图形化数据,由函数 axes 创建。
(2)图形窗口 GUI 的每一个组件都必须安排在图像窗口中。
在画数据图像时,图像窗口通常会被自动创建。
但还可以用函数 figure 来创建图像窗口,空图像窗口经常用于放置各种类型的组件。
回 (3) 应 如果用户鼠标单击或用键盘输入一些信息,那么程序就要有相应的动作。
鼠标单击或输入心思是一个事件,如果 MATLAB 程序运行相应地函数,那么 MATLAB 函数肯定会有所反应。
例如,如果用户单击一按钮,这个事件必然导致相应的 MATLAB 语句执行。
这些相应的语句被称为回应。
只要执行 GUI 的单个图形组件,就必须有一个回应。
2.2 扫描转换直线段 2 在数学上,理想的直线是没有宽度的,由无数个点构成的集合。
当我们对直线进行光栅化时,只能在显示器所给定的有限个象素组成的矩阵中,确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作,这就是通常所说的用显示器绘制直线或直线的扫描转换。
2.2.1 生成直线段的 DDA 算法 y1 y0 已知过端点 P0 x0 y0 , P x1 y1 的直线段 L P0 P 直线斜率为 k 。
画线过程 x1 x0 1 1 ,计算相应的 y 坐标 kx B ,从左端点 x0 开始,向 x 右端点步进,步长1(个像素) y 取像素点 x round y 作为当前点的坐标。
计算 yi 1 kxi 1 B k1 xi B k x yi k x 当 x 1,有 yi 1 yi k .即:当 x 每递增 1,y 递增 k即直线斜率;DDA 画线算法程序:void LineDDAint x0int y0int x1int y1int color int x float dydxyk dyy1-y0 dxx1-x0 kdy/dx yy0 forxx0xltx1x PutPixelxinty0.5coloryk 2.2.2 生成直线段的中点算法 画直线段的过程中,当前象素点为 x p y p ,一个象素点有两种可选择点 p1 x p 1 y p 或 p2xp1 yp1。
若 Mxp1 yp0.5,为 p1 与 p2 之中点,Q 为理想直线与 xxp1 垂线的交点。
当 M 在 Q 的下方,则 P2 应为下一个象素点;M 在 Q 的上方,应取 P1 为下一点。
就是中点画线法的基本原理。
下面讨论中点画线法的实现。
令直线段 Lp0x0y0 p1x1 y1 其方程F x y ax by cz 0 。
其中,ay0-y1 bx1-x0 cx0y1-x1y0 点与 L 的关系:on:F x y 0 up: F x y gt0 down: F x y lt0 因此,欲判断中点 M 在 Q 点的上方还是下方,只要把 M 代入 F(x,y),并判断它的符号。
构造判别 式: d F M Fx p 1 y p 0.5 ax p 1 by p 0.5 c 当 dlt0,M 在 LQ 点下方,取 P2 为下一个象素;当 dgt0,M 在 LQ 点上方,取 P1 为下一个象素;当 d0,选 P1 或 P 2 均可,约定取 P 1 为下一个象素;注意到 d 是 x p y p 的线性函数,可采用增量计算,提高运算效率。
若当前象素处于 d≥ 0 情况,则 取 正 右 方 象 素 P1 ( xp1 y p ) 要 判 下 一 个 象 素 位 置 , 应 计 算 d1Fxp2yp 0.5axp2byp 0.5 d a ; 增量为 a; dlt0 时, 若 (x 。
则取右上方象素 P2 p1 yp 1)要判断再下一象素,则要计算 d2 Fxp2 yp1.5axp2byp1.5c d a b ;增量为a+b 画线从x0 y0开始,d 的初值 d0Fx01 y00.5Fx0 y0a0.5b 因 Fx0 y00,则d0a0.5b。
由于我们使用的只是 d 的符号,而且 d 的增量都是整数,只是初始值包含小数。
因此,我们可以用 2d 代替 d 来摆脱小数,写出仅包含整数运算的算法。
中点画线算法程序:void Midpoint Line int x0int y0int x1 int y1int color int a b d1 d2 d x y ay0-y1 bx1-x0 d2ab d12a d22 ab xx0 yy0 Putpixelx y color while xltx1 if dlt0 x y dd2 else x dd1 Putpixel x y color / while / / mid PointLine /2.4 扫描转换圆弧22.4.1 圆的特征 圆被定义为到给定中心位置( xc yc )距离为 r 的点集。
圆心位于原点的圆有四条对称 若已知圆弧上一点 x y 可以得到其关于四条对称轴的其它 7 个点,轴 x0y0xy 和 x-y。
这种性质称为八对称性。
因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。
显示圆弧上的八个对称点的算法: void CirclePointsint xint yint color Putpixelxycolor Putpixelyxcolor Putpixel-xycolor Putpixely-xcolor Putpixel x-ycolor Putpixel-yxcolor Putpixel -x-ycolor Putpixel -y-xcolor 2.4.2 生成圆弧的中点算法 构造圆函数 F x y x 2 y 2 R 2 。
对于圆上的点, F x y 0 ;对 于圆外的点F x y gt 0 ;对于圆内的点 F x y lt 0 。
与中点画线法一样,构造判别式 1 1d F x p 2 y p x p 1 2 y p 2 R 2 2 2 若 dlt0 则应取 P1 为下一象素,而且再下一象素的判别式为 1 1d F x p 2 y p x p 2 2 y p 2 R 2 d 2 x p 3 2 2若 d ≥ 0 则应取 P2 为下一象素,而且下一象素的判别式为d x p 2 y p 1.5 x p 2 2 y p 1.5 2 R 2 2 x p y p 5 F d ,判别 d 的初我们这里讨论的是按顺时针方向生成第二个八分圆。
则第一个象素是(0R) 式始值为 d 0 F 1 R 0.5 1.25 RMidPointCircleint r int color int xy float d x0 yr d1.25-r circlepointsxycolor whilexlty ifdlt0 d2x3 else d2x-y5 y-- x circlepointsxycolor 为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
2.5 生成椭圆弧的中点算法2 由椭圆的对称性,只考虑第一象限椭圆弧生成,分上下两部分,以切线斜率为-1 的点作为分界点。
椭圆上一点处的法向:N x y F xi F yj b 2 xi 2a 2 yj 2在当前中点处,法向量2b 2 X p 1 2a 2 Yp 0.5 的 y 分量比 x 分量大即: b X p 1 lt a Yp 0.5 而在下 2 2一中点,不等式改变方向,则说明椭圆弧从上部分转入下部分 与圆弧中点算法类似:确定一个象素后,接着在两个候选象素的中点计算一个判别式的值,由判别式的符号确定更近的点。
先讨论椭圆弧的上部分 X p , p 中点Xp1Yp-0.5 Y 2 2 2 2则 d1FXp1Yp-0.5 b Xp12 a Yp-0.52- a b若 d1<0,中点在椭圆内,取正右方象素,判别式更新为 2d1FXp2Yp-0.5d1 b 2Xp3 。
d1 的增量为 b 2 2Xp3当 d1≥0,中点在椭圆外,取右下方象素,更新判别式 2 2 2 2 d1d1FXp2Yp-1.5d1 b 2Xp3 a -2Yp2。
的增量为 b 2Xp3 a -2Yp2椭圆弧起点为0,b,第一个中点为1b-0.5初始判别式:d10F1b-0.5bbaa-b0.25转入下一部分,下一象素可能是一正下方或右下方,此时判别式要初始化。
d2 FXp0.5Yp-1 b 2 Xp0.52 a 2 Yp-12- a 2 b 2 2 2若 d2lt0则 d2’ FXp1.5Yp-2 d2 b 2Xp2 a -2Yp3 2若 d2gt0则 d2’ FXp0.5Yp-2 d2 a -2Yp3下半部分弧的终止条件为 y 0程序:MidpointEllipeab color int abcolor int xy float d1d2 x 0 y b d1 bb aa-b0.25 putpixelxycolor while bbx1 lt aay-0.5 if d1lt0 d1 bb2x3 x else d1 bb2x3aa-2y2 x y-- putpixelxycolor //上部分 d2 sqrbx0.5 sqray-1 – sqrab whiley gt0 if d2 lt0 d2 bb2x2aa-2y3 x y--; else d2 aa-2y3 y-- putpixelxycolor 2.6 生成圆弧的多边形逼近法 2 圆的正内接多边形迫近法:原.