面片常用于构建多边形模型,比如图1-11中,整个面具可以看作是一张面片。面片由很多三角形和四边形拼接而成。称这些三角形和四边形为面片的小面。[大谦MATLAB,dqmatlab点com]
图1-11 多边形模型
1 生成面片
面片用Patch对象表示,该对象由patch函数创建。patch函数的语法形式为:
patch(X,Y,C) 在当前坐标系中添加二维面片。X和Y的元素共同指定多边形的顶点。如果X和Y是矩阵,则MATLAB利用每一列的数据绘制一个多边形。C确定多边形的颜色。
patch(X,Y,Z,C) 在三维坐标系中创建面片。
patch('XData',X, 'YData',Y) 跟patch(X,Y,C)类同,区别是不用指定颜色变量C。
patch('XData',X, 'YData',Y, 'ZData',Z) 跟patch(X,Y,Z,C)类同,区别是不用指定颜色变量C。
patch('Faces',F, 'Vertices',V) 创建一个或多个多边形,其中 V 指定顶点的值,F 定义要连接的顶点。当有多个多边形时,仅指定唯一顶点及其连接矩阵可以减小数据大小。为 V 中的每个行指定一个顶点。要创建一个多边形,请将 F 指定为向量。要创建多个多边形,请将 F 指定为矩阵,其中一行对应于一个多边形。不要求每个面都具有相同的顶点数。要指定不同数量的顶点,请以 NaN 值填充 F。
patch(FV) 用结构FV创建面片,该结构包含字段vertices, faces和可选的facevertecdata。这些字段会生成对应的Vertices, Faces和FaceVertexCData属性值。
patch(…'PropertyName',PropertyValue...) 指定顶点坐标以后用属性名/属性值匹配对指定其他面片属性。
patch('PropertyName',PropertyValue...) 完全用属性名/属性值的形式指定属性值。使用这种方式,可以忽略颜色的指定,因为除非给FaceColor和EdgeColor属性指定一个值,MATLAB会使用默认的小面颜色和边线颜色。使用这种形式可以用Faces和Vertices属性定义面片。
patch(ax,…) 为面片指定坐标系。
handle=patch(...) 返回所创建的面片对象的句柄。
patch对象的主要属性如表1-4所示。
表1-4 patch对象的主要属性
| 属 性 | 说 明 |
|---|---|
| FaceColor | 设置面片上小面的颜色,不同取值的说明: 指定颜色值 – 用指定的颜色单色填充面片上所有的小面。单色的取值可以参照表1-3,也可以直接用RGB分量设置。 'flat' – 面片上的小面为单色填充,将 CData 或 FaceVertexCData 指定为一个数组,其中一个面一个颜色,或者每个顶点对应一种颜色。但各小面的颜色可以不一样。 'interp' – 面片上的小面为渐变色填充,将 CData 或 FaceVertexCData 指定为一个数组,其中每个顶点对应一个值。 |
| FaceAlpha | 设置面片上小面的透明度,不同取值的说明: 0和1之间的标量 – 在所有小面使用统一的透明度。值为 1 时完全不透明,值为 0 时完全透明。 'flat' – 根据 FaceVertexAlphaData 属性中的值,对每个小面使用不同的透明度。首先必须将 FaceVertexAlphaData 属性指定为向量,其中一个面或一个顶点对应一个透明度值。第一个顶点的透明度值确定整个小面的透明度。 'interp' – 根据 FaceVertexAlphaData 属性中的值,对每个小面使用渐变透明度。首先必须将 FaceVertexAlphaData 属性指定为一个向量,其中一个顶点对应一个透明度值。通过对各顶点处透明度数值进行插值计算每个小面上的透明度。 |
| EdgeColor | 设置面片上边的颜色,不同取值的说明: 指定颜色值 – 设置所有边的颜色为指定的颜色。单色的取值可以参照表1-3,也可以直接用RGB分量设置。 'flat' – 每条边使用不同颜色。使用顶点颜色设置该顶点之后的边的颜色。必须先将 CData 或 FaceVertexCData 指定为一个数组,其中一个顶点对应一种颜色。边的颜色取决于您指定顶点的顺序。 'interp' – 插入的边颜色。必须先将 CData 或 FaceVertexCData 指定为一个数组,其中一个顶点对应一种颜色。通过在两个边界顶点上进行线性插值来确定边颜色。 'none' – 不显示边。 |
| LineStyle | 线型。参照表1-2进行设置。 |
| LineWidth | 线宽。 |
| Marker | 点标记。参照表1-1进行设置。 |
| MarkerFaceColor | 点内部的填充色。参照表1-3进行设置。 |
| MarkerEdgeColor | 点边线的颜色。参照表1-3进行设置。 |
使用patch函数有两种方法生成面片,一种是通过指定每个小面的顶点坐标和颜色来创建,另一种是指定所有顶点的坐标和各小面的顶点和颜色来创建。
注意:用顶点定义小面时使用逆时针方向。
下面用顶点/小面表示方法和顶点/颜色表示方法创建了一个等腰三角形和一个多边形区域。vert变量定义各个点的坐标,按照先后顺序取得各个顶点的编号。face变量按逆时针方向指定组成小面的顶点的编号。x和y定义各顶点的横坐标和纵坐标,也是按逆时针方向排列。
>> vert=[1 2;3 2;2 4];
>> face=[1 2 3];
>> patch('Faces',face, 'Vertices',vert, 'FaceColor', 'none');
>> x=[3;4;5;6;6.5;4];
>> y=[4;2.5;4;3;4;6];
>> tcolor(1,1:6)=[. .7 .7 .7];
>> patch(x,y, tcolor);
>> axis([1 7 1 7])
生成图1-12。
图1-12 创建多边形并着色
下面用这两种方法创建1个有3个小面的扇面,它存在于三维空间。
首先用小面坐标和颜色进行创建。用x, y和z矢量定义小面的顶点,用tcolor矢量定义小面的颜色,第一个索引值为面片编号,第二个索引值为小面编号,第三个索引值为小面顶点的编号。在命令窗口键入下面的命令行:
>> x=[0 0 0;1 .5 0;1 1 .5];
>> y=[0 0 0;.5 1 1;0 .5 1];
>> z=[.;1 1 1;1 1 1];
>> tcolor(1,1,1:3)=[.];
>> tcolor(1,2,1:3)=[1 1 1];
>> tcolor(1,3,1:3)=[.];
>> patch(x,y,z,tcolor);
>> axis([0 1 0 1 0 2]);
>> view(3)
生成图1-13,正好是3个小三角形组成的扇面。
图1-13 用patch函数创建一个扇面
下面用第2种方法进行创建。用vert矢量定义各顶点,用fac矢量定义小面。键入下面的代码:
>> vert=[0 0 .5;1 0 1;1 .5 1;.5 1 1;0 1 1];
>> fac=[1 3 2;1 4 3;1 5 4];
>> tcolor=[.;1 1 1;.3 .3 .3];
>> patch('Faces',fac,'Vertices',vert,'FaceVertexCData',tcolor,'FaceColor','flat');
>> axis([0 1 0 1 0 2]);
>> view(3)
生成与图1-13相同的结果。
2 面片面的着色
面片面的着色,主要有单色着色、刻面着色和插值着色三种。下面分面片只有一个小面和面片由多个小面的情况进行介绍。
面片只有一个小面的情况
面片只有一个小面时,实际上就是一个多边形。
下面这些语句显示一个多边形,中间用绿色填充,边为黑色。
>> x=[3;4;5;6;6.5;4];
>> y=[4;2.5;4;3;4;6];
>> tcolor=[.7;.7;.7;.7;.7;.7];
>> patch(x,y,tcolor);
>> axis equal
生成的多边形如图1-14所示。
图1-14 生成多边形
第1个和最后1个顶点不需要一致,MATLAB会自动闭合面片的每一个小面。实际上,通常最好只将每个顶点定义一次,特别是使用插值法进行着色时。
下面重新指定tcolor的值,设置FaceColor属性的值为interp,对例1-13中的多边形进行插值着色。
>> x=[3;4;5;6;6.5;4];
>> y=[4;2.5;4;3;4;6];
>> tcolor=[.1;.2;.3;.4;.5;.7];
>> patch(x,y,tcolor,'FaceColor','interp');
>> colormap cool;
>> axis equal
显示效果如图1-15所示。
图1-15 多边形的渐变着色
面片有多个小面的情况
单色着色时将面片的FaceColor属性值设置为单一颜色,此时面片上所有小面的颜色都设置为该颜色。下面对例1-12中的面片进行单色着色,设置颜色为绿色。在MATLAB命令窗口输入:
>> vert=[0 0 .5;1 0 1;1 .5 1;.5 1 1;0 1 1];
>> fac=[1 3 2;1 4 3;1 5 4];
>> tcolor=[.;1 1 0;1 0 0;0 1 0;0 0 1];
>> patch('Faces',fac,'Vertices',vert,'FaceVertexCData',tcolor,'FaceColor','g');
>> axis([0 1 0 1 0 2]);
>> view(3)
生成图1-16。
图1-16 单色着色
刻面着色时将面片的FaceColor属性值设置为flat。例1-12中实现了面片面的刻面着色,如图1-13所示。
插值着色时将面片的FaceColor属性值设置interp。下面对例1-12中的面片进行插值着色。在MATLAB命令窗口输入:
>> vert=[0 0 .5;1 0 1;1 .5 1;.5 1 1;0 1 1];
>> fac=[1 3 2;1 4 3;1 5 4];
>> tcolor=[.;1 1 0;1 0 0;0 1 0;0 0 1];
>> patch('Faces',fac,'Vertices',vert,'FaceVertexCData',tcolor,'FaceColor','interp');
>> axis([0 1 0 1 0 2]);
>> view(3)
生成图1-17。注意本例和例1-12中tcolor变量值的设置,使用插值着色,需要用面片所有顶点的颜色进行计算,所以在tcolor中必须指定所有顶点的颜色。而例1-12中只需要指定每个小面的颜色就可以了。
图1-17 插值着色
3 面片边的着色
通过给Patch对象的EdgeColor属性赋值,可以设置面片边的颜色。该属性的设置可参考表1-4的介绍,与ForeColor属性的设置类同。默认时,面片边的颜色为黑色。
下面使用例1-14,将FaceColor属性值设置为flat,将EdgeColor属性值设置为flat,线宽设置为2。
>> x=[3;4;5;6;6.5;4];
>> y=[4;2.5;4;3;4;6];
>> tcolor=[.1;.2;.3;.4;.5;.7];
>> patch(x,y,tcolor,'FaceColor','flat',...
'EdgeColor','flat', 'LineWidth',2,...
'Marker','o', 'MarkerFaceColor', 'flat');
>> colormap cool;
>> axis equal
生成图1-18。可见,刻面着色时,边线的颜色为线段起点的颜色。注意各顶点的排列方向为逆时针方向。
将FaceColor属性的值设置为interp,将EdgeColor属性的值设置为none。
>> patch(x,y,tcolor,'FaceColor','interp', 'EdgeColor','none');
生成图1-19。此时不显示边线。
图1-18 设置边线颜色 图1-19 不显示面片的边线
4 渐变色曲线
使用面片,还可以绘制颜色渐变的曲线。
下面的例子中,用面片绘制正弦曲线,根据曲线上各点的纵坐标值的大小确定颜色,最大值为红色,最小值为蓝色。
>> t=0:pi/40:4*pi;
>> t2=4*pi:-pi/40:0;
>> yt=sin(t);
>> yt2=sin(t2)-0.02;
>> x=[t t2];
>> y=[yt yt2];
>> tcolor=y;
>> patch(x,y,tcolor, 'FaceColor', 'interp', 'EdgeColor', 'none');
生成图1-20。
图1-20 颜色渐变的曲线
下面代码生成的渐变色曲线比较理想。在命令窗口键入
>> x=linspace(1,10,15);
>> y=cos(x);
>> y(end)=NaN;
>> c=y;
>> patch(x,y,c,'EdgeColor','interp','Marker','o','MarkerFaceColor','flat');
>> colorbar;
生成图1-21。
图1-21 渐变色曲线
5 设置透明度
给Patch对象的FaceAlpha属性赋值,可以设置面片的透明度。
下面用patch函数生成一个立方体。立方体各小面的颜色用刻面着色,FaceAlpha属性的值设置为0.3。此时所有小面的透明度都设置为0.3。
>> vert=[1 1 1;1 2 1;2 2 1;2 1 1;1 1 2;1 2 2;2 2 2;2 1 2];
>> fac=[1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8];
>> tcolor=[1 0 1;1 1 0;1 0 0;0 1 0;0 0 1;0 1 1];
>> patch('Faces',fac,'Vertices',vert,'FaceVertexCData',tcolor,'FaceColor','flat','FaceAlpha',0.3);
>> view(3);
>> axis square;
生成图1-22。
图1-22 FaceAlpha属性设置为0.3的效果
下面将面片的FaceAlpha属性值设置为flat。注意,设置为flat或interp时,必须指定各小面或各顶点的透明度值,并赋给FaceVertexAlphaData属性。
>> vert=[1 1 1;1 2 1;2 2 1;2 1 1;1 1 2;1 2 2;2 2 2;2 1 2];
>> fac=[1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8];
>> tcolor=[1 0 1;1 1 0;1 0 0;0 1 0;0 0 1;0 1 1];
>> talpha=[.2;.3;.4;.5;.6;.7;.8;.1];
>> patch('Faces',fac,'Vertices',vert,'FaceVertexCData',tcolor,…
'FaceVertexAlphaData',talpha,'FaceColor','flat','FaceAlpha', 'flat');
>> view(3);
>> axis square;
生成图1-23。此时根据小面起点的透明度值设置小面的透明度,各小面的透明度不完全一样。
将FaceAlpha属性的值改为interp,即
>> patch('Faces',fac,'Vertices',vert,'FaceVertexCData',tcolor,…
'FaceVertexAlphaData',talpha,'FaceColor','flat','FaceAlpha', 'interp');
生成图1-24。此时小面上的透明度有渐变效果。
图1-23 FaceAlpha属性设置为flat的效果 图1-24 FaceAlpha属性设置为interp的效果