这是本人毕业论文最后一张内容,有什么问题尽管提。
5.1Matlab画图基本介绍
Matlab是由美国Mathworks公司发布的计算环境。其主要特点是实现数据可视化以及交互式程序设计。Matlab有着强大的绘图功能,而且由于Matlab基本数据单位是矩阵,故其能够简单的实现高层次的作图,包括二维和三维的可视化、图象处理、动画和表达式作图。
Matlab图形系统使用的是面向对象的设计方法,其优越性在于可以重复的利用对象进行编程。面向对象方法是90年代软件开发方法的主流,其思想就是将所有的数据都被封装在类的实例中,而整个程序则被封装在一个更高级的类中。在使用既存部件的面向对象系统中,可以只花费少量时间和工作量来实现目标。在Matlab中,把许多有共同属性的图形对象抽象成为一个类,图形中每个对象都是类的一个实例,即对象,多个对象组合在一起,形成有意义的图形。不同的类有不同的依赖关系,按照一定关系组成图形对象的层次结构,如图5-1所示。
图5-1 Matlab图形对象的层次结构
第一层为根类,也成为root类对象,它表示计算机屏幕,是其他所有类的父类。根类保存一些系统状态信息和设置信息。
第二层为图形窗口类,也成figure类,他表示整个图形窗口,是根的直接子类。
第三层为坐标轴类和用户接口类,是figure类的直接子类。坐标轴类是核心类和组类的父类,用于数据的可视化;用户接口类(也成UI类)用于Matlab与用户之间交互操作。
第四层包括核心类和组类。核心类为所有绘图的基本元素;组对象为多个核心对象组合而成的坐标轴子对象。例如,图形的注释(annotation函数创建)、插图(legend函数创建)、直方图(bar函数创建)、火柴杆图(stem函数创建)等,都是组类。图形对象的创建函数与函数描述见表5-1
表5-1 图形的创建函数与函数描述
对象所属的类 | 创建函数 | 对象描述 |
根 | root | 计算机屏幕 |
图形窗口 | figure | 显示图形和用户界面的窗口 |
坐标轴 | axes | 在图形窗口中显示的坐标轴 |
内部控件 | uicontrol | UI对象,执行用户接口交互相应函数的控件 |
图像 | image | 核心对象,基于像素点的二维图片 |
灯光 | light | 核心对象,影响块对象和曲面对象的光源 |
线条 | line | 核心对象,在指定坐标轴内绘制一条线 |
块 | patch | 核心对象,有边界的填充多边形 |
矩形 | rectangle | 核心对象,有曲率属性的、从椭圆到矩形变化的二维图形 |
曲面 | surface | 核心对象,将数据作为平面上点的高度创建的二维矩阵数据描述 |
文本 | text | 核心对象,用于显示字符串与特殊字符 |
组合对象 | hggroup | 坐标轴子对象,同时操作多个核心对象 |
每个具体对象都有一个"与生俱来、终生不变"的独特"身份",即句柄(Handle)。句柄是储存图形对象唯一规范识别符,不同对象的句柄不可能重复和混淆。
所有对象都有一组定义和刻画其外貌和性状的属性。属性由两部分组成:属性名和属性值,即属性二元对。在创建或修改属性的指令中,属性名和属性值总是成对出现。
属性名是英文词组字符串。该英文词组每个单词第一个字母大写,而单词间没有空格,例如'LineStyle','ColorMap'等。这样书写属性名的目的是便于阅读。至于在指令中援引属性名时,为用户输入方便,Matlab采取了两个措施:第一,不分字母大小写,都同样识别;第二,只要不引起歧义,属性名不必全写。比如'lines'就代表'LineStyle'。
不同的属性值将使对象具有不同的表现。
Matlab每个对象的属性都有十几种,但是创建对象时不必把所有属性全部加以定义。因为倘若用户不对某个属性加以定义,Matlab总会自动地给对象的每个属性赋予"出厂定义"的属性值。当然,用户如果希望创建具有个性的图形,那么就可以通过某些属性进行定义。浮泥绘制过程中,有关figure对象的颜色地图,某些曲面透明度等,这些都需要自己进行定义。
除根对象外,所有图形对象都由与之同名的指令创建。对象创建指令的名称和含义见表9.2.1。这些指令都是Matlab的内建函数。每个指令在创建对象的同时,还可返回该函数的句柄。
每个底层函数只能创建这11个图形对象中的一个,并将它们置于适当的父辈对象之中。
表5-2 建立图形对象命令、功能及调用格式举例
指令名 | 功能 | 调用格式举例 |
figure | 创建图形窗 | h = figure(n)n为整数,打开或创建第n号图形窗 |
axes | 创建轴 | h = axes(n) 定义坐标轴 |
line | 创建线 | h = line(x,y,z)绘制向量x、y、z确定的直线 |
rectangle | 创建长方形 | h =rectangle('position',[x,y,w,h],'curvature',[xc,yx]) x、y为左下角顶点坐标,w、h为长方形的宽和高;xc、yc曲率 |
patch | 创建块 | h = patch('face',fac,'vertices',vert) vert为顶点矩阵,fac为定义多边形的顶点序号矩阵 |
image | 创建图像 | h = image(x) x为图像数据矩阵 |
text | 创建字 | h = text(x,y,'string')x、y指定字符串string标注位置 |
light | 创建光照 | h =light('Position',[1,0,0]) 设置入射光的方向。它影响面、块对象的渲染 |
uicontrol | 创建用户界面控制 | h = uicontrol('property',value)property/value 指定界面的控制类型 |
uimenu | 创建用户界面菜单 | h = uimenu('property',value)property/value 指定图形窗口上方的菜单形式 |
5.3Matlab浮泥剖面图形绘制
5.3.1三维图形的数据准备
在matlab中,除根屏幕外,所有图形对象都由与之同名的指令创建。有关各种三维绘图的函数和其功能,主要有以下几种:
图5-3 绘制三维图像主要函数及其功能
三维绘图函数 | 函数主要功能 |
contour | 二维等值线图 |
contour3 | 等值线图 |
fill3 | 填充的多边形 |
mesh | 网格图 |
meshc | 具有基本等值线图的网格图 |
meshz | 有零平面的网格图 |
pcolor | 二维伪彩色绘图 |
plot3 | 直线图 |
quiver | 二维带方向箭头的速度图 |
surf | 曲面图 |
surfc | 具有基本等值线图的曲面图 |
surfl | 带亮度的曲面图 |
waterfall | 无交叉线的网格图 |
要使浮泥运动情况形象的表达出来,主要使用surf函数。其主要功能是根据x,y,z的三个二维矩阵在三维直角坐标系中绘制曲面。
调用函数的基本格式为:surf(x,y,z,v)
这里参量的维数同作图维数关系与二维作图时关系类似。因为是三维图作图,所以变量都是二维矩阵且x,y,z,v大小必须一致。
其中x,y,z三个变量为曲面坐标参量。v是该点对应颜色映像矩阵ColorMap中颜色的序号,有关ColorMap颜色的设置,在5.4节有详细的说明。
曲面绘制时候,整个曲面是由一个个面片拼接而成,而每个四边形面片是由四个三维空间坐标中的角点组成的,如图5-2所示。例如x,y,z全部为为16×16的矩阵时,曲面角点共有256个,每个点的坐标根据x,y,z矩阵中对应元素的值来决定,即x(i,j),y(i,j),z(i,j)分别为同一个点(i,j)的三个坐标分量。四个角点组成面片时,点取自矩阵中相邻的四个点,即矩阵中序号为(i,j),(i+1,j),(i,j+1),(i+1,j+1)四个点会组成一个面片,如图5-3所示。
图5-2 Matlab中surf函数绘制曲面中的角点和面片
(i-1,j-1) | (i-1,j) | (i-1,j+1) | (i-1,j+2) |
(i,j-1) | (i,j) | (i,j+1) | (i,j+2) |
(i+1,j-1) | (i+1,j) | (i+1,j+1) | (i+1,j+2) |
(i+2,j-1) | (i+2,j) | (i+2,j+1) | (i+2,j+2) |
图5-3 某个矩阵中四个角点组成一个面片
Matlab为方便绘制曲面专门提供了meshgrid函数,它可以把向量x和y自动扩充为二维矩阵。例如:[X,Y] =meshgrid(-2:1:2, 0:1:2) ,此命令作用的就是把行向量:
,
扩充为两个二维矩阵:
,
其中矩阵的行数由y向量的元素个数决定,列数由x向量的元素个数决定。这样,四个点相连接组成面片时,矩形中相邻的四个点在三维空间中的xoy平面投影也是相邻的。避免了由点连接成面片时候出现交叉重叠的情况。
5.3.2图形的透视、镂空
每个surf函数创建的曲面对象,都具有'FaceAlpha'的属性来控制曲面上每个面片的透明度。通过对曲面属性'FaceAlpha'的调整,可以让某个曲面对象具有透明效果。'FaceAlpha'属性值在0~1之间进行变化,分别代表完全透明和不透明效果。每个曲面对象创建时,该属性值默认取值为1,即不透明。通过set命令设置'FaceAlpha'在0~1之间时,就可以使得曲面具有半透明效果。
通过对曲面透明度的调整,我们可以模拟出类似水体一样的半透明效果的曲面,使得计算结果更加生动形象。下图就是用Matlab制作的波浪爬坡的某一时刻图像。代表水体自由表面的蓝色曲面'FaceAlpha'的属性值设置为0.9,表示地形的灰黑色曲面属性值采用默认值。可以看出,不同曲面的透明效果灵活的使用令画面变得生动多彩。
图5-4Matlab绘制波浪爬坡过程的某一时刻图像
图形的镂空效果主要通过图形输入x,y,z数据操作,Matlab中nan(NotANumber)代表某些位置缺失的数据。Matlab处理缺失的数据时就会跳过或者其他处理,这个也是Matlab优越于其他语言的表现之一。在绘图中,Matlab处理坐标值中包含nan数据的方法就是把曲面包含此角点的面片去除掉。如图5-5所示,若我们将16×16的二维矩阵x中(4,4)的元素设为nan,可见包含(4,4)的四个面片被全部抹去。
通过这种方法,我们可以设定各种形状边界的曲面,曲面在xoy平面的投影也不必为矩形。图5-4中圆锥露出水面的效果也是通过设定角点坐标值为nan的方法实现的。
图5-5Matlab绘制镂空曲面效果
5.4图形颜色绘制
5.4.1Matlab图像类型简介
Matlab的图像类型分四种,分别为灰度图、RBG图、二值图和索引图,不同图像类型存储时的数据格式是不同的。
灰度图像是一个数据矩阵Gray,Gray中的数据均代表了在一定范围内的图像灰度值。RGB图像即真彩图像,在Matlab中存储为m×n×3的三维数据矩阵。数组中的元素定义了图像中的每一个像素的红、绿、蓝颜色值。二值图与灰度图像相同,只需要一个数据矩阵,每个像素只取两个灰度值(0或1)。索引图包括一个索引数据矩阵index_Matrix和一个颜色映像矩阵ColorMap。其中ColorMap是一个包含三列、若干行的数据阵列,其中每个元素的值均为[0,1]之间的双精度浮点型数据。ColorMap矩阵 的每一行分别表示红色、绿色和蓝色的颜色值。在Matlab中,索引图像是从像素值到颜色映射表值的"直接映射"。像素颜色由数据矩阵index_Matrix作为索引指向矩阵ColorMap进行索引,例如,值1指向矩阵ColorMap中的第一行,值2指向第二行,以此类推。
5.4.2浮泥后处理颜色表示方法
Matlab中,每个figure都是使用索引图的方法来表示颜色,在surf命令中,第四个参量v就是储存每个点颜色的索引值的矩阵。在Matlab绘图颜色映射过程中,首先设置索引值的上限和下限。若用户缺省该设置,就把v矩阵中最大值和最小值自动设置为索引值的上限和下限。然后把索引值上限和ColorMap第一行RGB值表示的颜色对应,索引值下限和ColorMap最后一行表示的颜色对应。最后按照一定对应关系(线性或者非线性),给每个v的值确定其对应的颜色。
ColorMap中表示颜色 | v值 |
图5-6 索引图颜色对应方法
根据浮泥的性质可知,浮泥与水和底床的密度有显著区别。因此,我们可以用密度物理量来作为颜色索引值。根据相关文献,连云港地区浮泥密度为1.03g/cm3至1.30g/cm3之间。因此,我们将索引值上线定为0.99,下限为1.35。介于0.99至1.03之间时,用渐深的蓝色表示海水密度变化,在1.03至1.30之间时,用渐深的土黄色表示浮泥密度变化,最后大于1.30时,用单一的深咖啡色表示底床。
表5-4 不同密度物体颜色对照表
对应密度值(kg/m3) | 对应颜色RGB值 | 颜色 | |
最小密度水体 | 0.99 | [124,234,255] | |
最大密度水体 | 1.03 | [0,136,144] | |
最小密度浮泥 | 1.03 | [225,186,83] | |
最大密度浮泥 | 1.30 | [224,155,0] | |
最小密度底床 | 1.30 | [106,51,21] | |
最大密度底床 | 2.65 | [106,51,21] |
当确定索引值上下限之后,线性对应是确定各个索引值对应颜色最简单的方法。设置ColorMap为64行,那么计算第行对应的索引值公式为:。
这样,我们便知道每行颜色应该对应的是有多大密度的水体、浮泥或底床了。
下面计算ColorMap每行颜色RGB数值,根据索引值大小等于密度我们知道,前8行表示的是密度逐渐增大的海水颜色,选定密度较小海水颜色为水蓝色,RGB值为[124,234,255],密度较大的海水颜色为蓝绿色,RGB值为[0,136,144]。中间6个值用两个RGB数值对应项进行线性插值,这样,我们便得到ColorMap中所有海水颜色的RGB数值,下图显示了海水密度由浅变深时候颜色变化。
图5-7 海水密度由浅变深时候颜色变化
浮泥和底床在ColorMap颜色的RGB数值设置同理。