一起来学matlab-matlab学习笔记9
高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
觉得有用的话,欢迎一起讨论相互学习~
《matlab 程序设计与综合应用》张德丰等著 感谢张老师的书籍,让我领略到matlab的便捷
《MATLAB技术大全》葛超等编著 感谢葛老师的书籍,让我领略到matlab的高效
图形的高级控制
视点控制和图形旋转
视点控制
-
日常生活中从不同的视点观察物体所看到的图形是不同的,同样用户从不同的角度绘制的三维图形的形状也是不一样的。视点位置可由方位角和仰角表示,方位角又称旋转角,它是视点位置在平面上的投影与轴形成的角度,其中正值表示逆时针,负值表示顺时针。仰角又称视角它是XY平面的上仰或下仰角,正值表示视点在XY面上方,负值表示视点在XY面下方。
-
为了使图形的效果更逼真,有时需要从不同的角度观看图形。方位角和俯仰角是视点相对于 坐标原点 而言,可以通过view函数指定。既可以通过视点的位置指定,也可以通过设置方位角和俯仰角的大小指定。view函数的调用格式如下。
- view(az,el)、view([az,el]):指定方位角和俯仰角的大小。
- view([x,y,z]):指定视点的位置
- view(2):选择二维默认值,即az=0、el=90。
- view(3):选择三维默认值,即az=-37.5、el=30。
- view(T):通过变换矩阵T设置视图,T是一个4×4的矩阵,如通过viewmtx生成的透视矩阵
- [az,el]=view:返回当前的方位角和俯仰角。
- T=view:返回当前的变换矩阵。
-
注意:指令中,az是方位角(azimuth),el是俯视角(elevation)。它们的单位是“度”。vx、vy是视点的直角坐标若绘制三维图形时,不使用view指令,那么MATLAB将使用默认的视点设置:az=37,5°,el=30°。当az=0°,el=90°时,图形将以习惯的平面直角坐标表现
-
MATLAB图形窗可交互式调节视点,为获得最佳视觉效果,用户先通过鼠标调节视点,然后再用指令view把相应的视点加以固定。
-
从不同的视点绘制多峰函数曲面
subplot(2,2,1);mesh(peaks);
view(-37.5,30);
subplot(2,2,2);mesh(peaks);
view(0,90);
title(\'azimuth=0,elevation=90\')
subplot(2,2,3);mesh(peaks);
view(90,0);
title(\'azimuth=90,elevation=0\')
subplot(2,2,4);mesh(peaks);
view(-7,-10);
title(\'azimuth=-7,elevation=-10\')
图形旋转
- 图形的旋动即图形的旋转,命令为:rotate(h,direction,alpha,orgin).其中,h为被旋转的对象;direction为方向轴,可用求坐标[theta,phi]或直角坐标[x,y,z]表示;alpha为按右手法则旋转的角度。
- 旋转图形示例
shg;clf;
[X,Y]=meshgrid([-3:.2:3]);
Z=4*X.*exp(-X.^2-Y.^2);
G=gradient(Z);
subplot(1,2,1),surf(X,Y,Z,G)
subplot(1,2,2),h=surf(X,Y,Z,G)
rotate(h,[-2,-2,0],30,[2,2,0]),colormap(cool)
- 左边为图形旋转前,右边为图形旋转后
颜色的使用
颜色的向量表示
- MATLAB提供了许多在二维和三维空间内显示可视信息的工具。例如,看一条sin函数的曲线图就会比一堆数据提供更多的信息。这种用图表和图形来表示数据的技术叫做数据可视化MATLAB不仅是一个强大的计算工具,并且在以引人人胜和直观方式可视地表示数据方面也很有特色。
- 但是很多时候,一个简单的二维或三维图形不能一次显示出想要提供的全部信息。这时,颜色可以对图形提供一个附加的维数。前面章节讨论的许多绘图函数都可以接受一个可用的颜色参量,来增加这附加的维数
- MATLAB有一个叫颜色映像的数据结构来代表颜色值。颜色映像定义为一个有三列和若干行的
矩阵。利用0到1之间的数,矩阵的每一行都代表了一种色彩。任一行的数字都指定了一个RGB值,
即红、黄、蓝三种颜色的强度,形成一种特定的颜色。
色图
- 色图(Colormap)是MATLAB系统引人的概念。在MATLAB中,每个图形窗口只能有一个色图。色图是m×3的数值矩阵,它的每一行是RGB三元组。色图矩阵可以人为地生成,也可以调用MATLAB提供的函数来定义色图矩阵。
- 语句colormap(M):将矩阵M作为当前图形窗口所用的颜色映像。例如,colormap(cool)装入了一个有64个输入项的cool颜色映像。colormap default装入了默认的颜色映像(hsv)
- 接受颜色参量的绘图函数中的颜色参量通常采用以下三种形式之一:(1)字符串。代表plot颜色或线型表中的一种颜色,例如,\'r\'代表红色;(2)三个输入的行向量,它代表一个单独的RGB值,如[.25,.50.75];(3)矩阵。如果颜色参量是一个矩阵,其元素作了调整,并把它们用作当前颜色映像的下标。
- 按默认,上面所列的各个颜色映像产生一个64×3的矩阵,指定了64种颜色RGB的描述。这些函数都接受一个参量来指定所产生矩阵的行数。例如,hot(m)产生一个m×3的矩阵,它包含的RGB颜色值的范围从黑经过红、橘红和黄,到白。
- 大多数计算机在一个8位的硬件查色表中一次可以显示256种颜色,当然有些计算机的显示卡可以同时显示更多的颜色。这就意味着在不同的图中,一般一次可以用三或四个64×3的颜色映像。如果使用了更多的颜色映像输入项,计算机必须经常在它的硬件查色表中调出输入项。例如,当在画MATLAB图形时背景图案发生了变化,就是发生了这种情况。所以,除非计算机有一次显示更多种颜色的显示卡,最好任何一次所用的颜色映像输入项数都小于256。
颜色的显示
- 可以有多种途径来显示一个颜色映射,其中一个方法是观察颜色映像矩阵的元素。eg:
>> hot(8)
ans =
0.3333 0 0
0.6667 0 0
1.0000 0 0
1.0000 0.3333 0
1.0000 0.6667 0
1.0000 1.0000 0
1.0000 1.0000 0.5000
1.0000 1.0000 1.0000
- 使用pcolor来显示一个颜色映像
n=20;
colormap(jet(n))% jet色图方式
pcolor([1:n+1;1:n+1]\')
title(\' Using Pcolor to Display a Color Map\')
- 在MATLAB中,colorbar命令的主要功能是显示指定颜色刻度的颜色标尺。colorbar更新最近生成的颜色标尺,如果当前坐标轴系统中没有任何颜色标尺,则在图形的右侧显示一个垂直的颜色标尺,其调用格式如下。
- colorbar(\'horiz\'):在当前的图形下面放一个水平的颜色条。
- colorbar(\'vert\'):在当前的图形右边放一个垂直的颜色条。
- 对无参量的colorbar,如果当前没有颜色条就加一个垂直的颜色条,或者更新现有的颜色条。
colormap(cool);
z=peaks(40);
subplot(2,2,1);
surf(z);
caxis([-2 2]);
colorbar;
z=peaks(40);
subplot(2,2,2);
surf(z);
caxis([-2 2]);
colorbar(\'vert\');
z=peaks(40);
subplot(2,2,3);
surf(z);
caxis([-2 2]);
colorbar horiz;
z=peaks(40);
subplot(2,2,4);
surf(z);
caxis([-2 2]);
colorbar horiz
颜色映像的调整
- 颜色映像就是矩阵,意味着你可以像其他数组那样对它们进行操作。函数brighten就利用这一点通过调整一个给定的颜色映像来增加或减少暗色的强度。brighten(n)(0<n<=1)使当前颜色映像变亮;而bnghten(n)(-1<=n<=0)使它变暗;brighten(n)后加一个brighten(-n)使颜色映像恢复原来状态。newmap=brighten(cmap,n)命令创建一个比当前颜色映像更暗或者更亮的新的颜色映像,而并不改变当前的颜色映像。newmap=brighten(cmap,n)命令对指定的颜色映像创建一个已调整过的式样,而不影响当前的颜色映像或指定的颜色映像。
- 可以通过生成m×3的矩阵mymap来建立用户自己的颜色映像,并用colormap(mymap)来安装它。颜色映像矩阵的每一个值都必须在0和1之间。如果企图用大于或小于3列的矩阵或者包含着比0小比1大的任意值,函数colormap会提示一个错误然后退出。
- 通常,颜色映像进行过调节,把数据从最小扩展到最大,也就是说整个颜色映像都用于绘图。有时也许想改变颜色使用的方法。函数caxis代表颜色轴,因为颜色增加了另一个维数,它允许对数据范围的一个子集使用整个颜色映像或者对数据的整个集合只使用当前颜色映像的一部分。
- [cmin,cmax]=caxis返回映射到颜色映像中第一和最后输入项的最小和最大的数据。它们通常被设成数据的最小值和最大值。例如,函数mesh(peaks)会画出函数peaks的网格图,并把颜色轴caxis设为[-6.5466,8.0752],即z的最小值和最大值。这些值之间的数据点使用从颜色映像中经插值得到的颜色
- caxis([cmin,cmax])对cmin和cmax范围区内的数据使用整个颜色映像。比cmax大的数据点用与cmax值相关的颜色绘图,比cmin小的数据点的颜色用与cmin值相关的颜色绘图。如果小于min(data)和/或cmax大于max(data),那么与cmin和/或cmax点相关的颜色将永远用不到。也就是说,只用到和数据相关的那一部分颜色映像。caxis(\'auto\')设置cmin和cmax的默认值。
% 人为增加一个颜色的维度
[X,Y,Z] = sphere;
C = Z;surf(X,Y,Z,C)
caxis([-1 3])
三维表面图形的着色
- 三维表面图实际上就是在网格图的每一个网格片上涂上颜色。surf函数用默认的着色方式对网格片着色。除此之外,还可以用shading命令来改变着色方式。
- shading faceted命令:将每个网格片用其高度对应的颜色进行着色,但网格线仍保留着,其颜色是黑色。这是系统的默认着色方式。
- shading flat命令:将每个网格片用同一个颜色进行着色,且网格线也用相应的颜色,从而使得图形表面显得更加光滑。
- shading interp命令:在网格片内采用颜色插值处理,得出的表面图显得最光滑。
三种着色方式的效果展示
[x,y,z]=sphere(30);
colormap(flag);
subplot(1,3,1);
surf(x,y,z);
axis equal
subplot(1,3,2);
surf(x,y,z);shading flat;
axis equal
subplot(1,3,3);
surf(x,y,z);shading interp;
axis equal
光照控制
- light(\'color\',optionl,\'style\',option2\',position\',option3):灯光设置。在该指令使用前,采用的是等强度各处相等的漫射光。一旦该指令被执行,虽然光源本身并不出现,但图形上“轴"、“面”等子对象所有与光有关的属性(如背景光、边缘光)都被激活。
- option1:可采用RGB三元组或相应的色彩字符,如[1 0 0]或\'r\'都代表红光。
- option2:有两个取值:\'infimte\'和\'local\'。前者表示无穷远光,后者为近光。
- option3:总为直角坐标的三元组形式。对远光,它表示光线穿过该点射向原点;对近光,它表示光源所在位置
- lightingoptions:设置照明模式:该指令只有在light指令执行后才起作用。options有以下
四种取值。- flat:射人光均匀洒落在图像对象的每个面上,主要与faceted配用。它是默认模式。
- gouraund:先对顶点颜色插补,再对顶点勾画的面色进行插补。用于曲面表现
- phong:对顶点处法线插值,再计算各像素的反光。表现效果最好,但费时较多
- none:使所有光源关闭。
- material options:使用预定义反射模式。为用户使用方便,MATLAB提供了四种预定义表面反射模式,即options取值。
- shiny:使对象比较明亮。镜反射份额较大,反射光颜色仅取决于光源颜色。
- dull:使对象比较暗淡。漫反射份额较大,没有镜面亮点,反射光颜色仅取决于光源颜色。
- metal:使对象带金属光泽。镜反射份额很大,背景光和漫射光份额很小。反射光源和图形表面两者的颜色。该模式为默认模式。
light
% 示例1:
figure(1);
[x,y,z]=peaks;
surf(x,y,z);
shading interp;
light(\'Color\',[1 0 1],\'Style\',\'local\',\'Position\',[-4,-4,10])
% 示例2:
figure(2);
[X,Y,Z]=sphere(40);
colormap(jet)
subplot(1,2,1);surf(X,Y,Z);shading interp
light (\'position\',[0 -10 1.5],\'style\',\'infinite\')
lighting phong
material shiny
subplot(1,2,2);surf(X,Y,Z,-Z);shading flat
light;lighting flat
light(\'position\',[-1,-1,-2],\'color\',\'y\')
light(\'position\',[-1,0.5,1],\'style\',\'local\',\'color\',\'w\')
% 示例三
figure(3);
[x,y,z]=peaks(20);
subplot(1,2,1);
surf(x,y,z)
shading interp;
material([0.2,0.3,0.6,10,0.4]);
light(\'color\',\'r\',\'position\',[0 1 0],\'style\',\'local\')
lighting phong
subplot(1,2,2);
surf(x,y,z)
shading flat;
material shiny;
light(\'color\',\'w\',\'position\',[-1 0.5 1],\'style\',\'local\')
lighting flat
请发表评论