1.补片对象简介
1.1什么是补片对象?
补片图形对象由一个或多个相连或不相连的多边形组成。补片对建模真实世界对象(如飞机或汽车)以及绘制任意形状的二维或三维多边形非常有用。
相对而言,曲面对象是由四边形组成的矩形网格,更适合显示平面布局图,例如具有两个变量的数学函数的值、矩形平面中数据的等高线或者参数化曲面(如球体)。
有一些 MATLAB® 函数可以创建补片对象 - fill、fill3、isosurface、isocaps、某些 contour 函数以及 patch。本节主要介绍如何使用 patch
函数。
您可以通过指定顶点坐标和某种形式的颜色数据来定义补片。补片支持各种着色选项,这些选项对于可视化几何形状上叠加的数据很有用。
指定补片的方法有两种:
-
指定每个多边形的顶点坐标,这些顶点连接起来形成补片。
-
指定每个唯一顶点的坐标以及一个定义如何连接这些顶点以形成面的矩阵。此方法是多面补片的首选,因为它通常需要较少的数据来定义补片,而且由多个面共享的顶点只需定义一次。有关详细信息,请参阅多面补片。
1.2patch 函数的行为
有两种形式的 patch 函数 - 高级语法和低级语法。根据您使用的语法,patch
函数的行为有所不同。
1)高级语法
当您使用高级语法时,MATLAB 会根据您指定的颜色数据自动确定如何为每个面着色。高级语法允许您省略 x、y 和 z 坐标以及颜色数据的属性名称,只要按正确顺序指定这些参量即可。
patch(x-coordinates,y-coordinates,z-coordinates,colordata)
但您必须指定颜色数据,这样 MATLAB 才能确定要使用的着色类型。如果不指定颜色数据,MATLAB 将返回错误。
x = [0 1 1 0];
y = [0 0 1 1];
patch(x,y)
Error using patch
Not enough input arguments.
2)低级语法
低级语法仅接受属性名称/属性值对组作为参量,并且不会自动为面着色,除非您还更改了 FaceColor 属性的值。例如,下面的语句
patch('XData',x,'YData',y)
绘制一个面颜色为黑色的补片,因为 FaceColor
属性的出厂默认值为黑色。
get(groot,'FactoryPatchFaceColor')
ans = 0 0 0
有关如何获取属性的出厂默认值和用户默认值的信息,请参阅《MATLAB 函数参考》中的 Patch 属性 列表以及 get 命令。
3)解释颜色参量
当您使用高级语法时,MATLAB 会将第三个(如果存在 z 坐标,则为第四个)参量解释为颜色数据。如果您打算使用 x、y 和 z 坐标来定义补片,但未指定颜色,则 MATLAB 会将 z 坐标解释为颜色数据,并绘制一个二维补片。例如,
patch(x,y,1:length(x))
将绘制一个所有顶点的 z 值均为 0 的补片,并会根据顶点颜色来插补着色(因为每个顶点一种颜色),而
patch(x,y,1:length(x),'y')
则会绘制一个各个顶点的 z 值递增的补片,颜色为黄色。
1.3 创建单个多边形
多边形是只有一个面的补片。要创建多边形,请按以下形式的语句指定顶点坐标和颜色数据
patch(x-coordinates,y-coordinates,[z-coordinates],colordata)
例如,下面的语句显示一个面为黄色、边为黑色的十边形。axis equal
命令会生成一个正多边形。
t = 0:pi/5:2*pi;
figure
patch(sin(t),cos(t),'y')
axis equal
第一个和最后一个顶点不需要重合,MATLAB 会自动闭合补片的每个多边形面。事实上,通常每个顶点最好只定义一次,尤其是在使用插补面着色法时。
您可以控制补片着色的许多方面。例如,您可以提供一系列数值,将每个顶点的颜色映射到图窗颜色图中的一种颜色,而不是只指定一种颜色。
a = t(1:length(t)-1); %remove redundant vertex definition
figure
patch(sin(a),cos(a),1:length(a),'FaceColor','interp')
axis equal
MATLAB 现在可在补片的整个面上进行颜色插值。同样,您可以将边的颜色指定为插补着色来为补片的边着色。命令如下:
patch(sin(a),cos(a),1:length(a),'EdgeColor','interp')
2.多面补片
立方体由八个顶点定义,它们形成六个面。下图显示了定义边长为一个单位的立方体的各个顶点的 x、y 和 z 坐标。
如果您将 x、y 和 z 坐标参量指定为向量,它们将呈现出一个按顺序连接各点的多边形。如果这些参量是矩阵,MATLAB® 会为每一列绘制一个多边形,从而形成一个具有多个面的补片。这些面不需要连接,并且可以自相交。
您也可以指定每个唯一顶点的坐标以及将它们连接成面的顺序。本节中的示例对这两种方法均进行了说明。
六个面中每个面都有四个顶点。由于不需要闭合每个多边形(即第一个和最后一个顶点不需要相同),因此可以为每个 x、y 和 z 坐标使用一个 4×6 矩阵来定义该立方体。
矩阵的每一列指定一个不同的面。虽然只有八个顶点,但您必须指定 24 个顶点才能定义所有六个面。由于每个面与其他四个面共享顶点,因此您可以每个顶点只定义一次,然后指定连接它们的顺序以形成每个面,这样可以提高定义补片的效率。补片的 Vertices
和 Faces
属性就是以这种方式定义补片的。
这些矩阵使用 Vertices
和 Faces
指定立方体。
当补片包含很多面时,使用顶点/面方法可以节省大量计算机内存。这种方法需要使用正式的 patch
函数语法,为 Vertices
和 Faces
属性显式赋值。例如,
patch('Vertices',vertex_matrix,'Faces',faces_matrix)
由于高级语法不会自动分配面或边颜色,因此您必须设置适当的属性,以生成面和边的颜色不是默认的白色和黑色的补片。
面的单一着色是为每个面指定一种颜色的结果。例如,下面的语句使用顶点/面方法和 FaceVertexCData
属性来定义颜色,为每个面指定一种颜色并将 FaceColor
属性设置为 flat
。
vert = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];
fac = [1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
patch('Vertices',vert,'Faces',fac,...
'FaceVertexCData',hsv(6),'FaceColor','flat')
调整坐标区:
view(3)
axis vis3d
由于使用 FaceVertexCData
属性指定的真彩色与 MATLAB 颜色图(即由 RGB 值组成的 n×3 数组)的格式相同,因此本示例使用 hsv
颜色图生成单一着色所需的六种颜色。
要将面颜色映射到当前颜色图,需要为 FaceVertexCData
属性指定一个 n×1 数组:
patch('Vertices',vert,'Faces',fac,...
'FaceVertexCData',(1:6)','FaceColor','flat')
调整坐标区:
view(3)
axis vis3d
面的插补着色意味着每个面的顶点颜色定义从一个顶点到下一个顶点的颜色过渡。要在顶点之间插补颜色,必须为每个顶点指定一种颜色并将 FaceColor
属性设置为 interp
。
patch('Vertices',vert,'Faces',fac,...
'FaceVertexCData',hsv(8),'FaceColor','interp')
调整坐标区:
view(3)
axis vis3d
生成一个通过顶点的颜色对每个面进行插补着色的立方体。
要使用 x、y、z、c 方法指定相同的着色,c 必须是一个 m×n×3 数组,其中 x、y 和 z 的维度为 m×n。
下图显示了 FaceVertexCData
和 CData
属性之间的对应关系。