matlab 3D绘图详解
2016-03-30 11:44
465 查看
<pre code_snippet_id="1628801" snippet_file_name="blog_20160330_1_8408168" name="code" class="cpp">
1、三维曲线: plot3()
→plot3(X1,Y1,Z1,...)→plot3(X1,Y1,Z1,LineSpec,...)
→plot3(...,'PropertyName',PropertyValue,...)
→h = plot3(...)
plot3( )的用法与plot( )类似,只是多了一个 Z 数组。举例:
<span style="font-size:18px;">>> t=[0:0.2:10*pi]; >> x=2*t; >> y=sin(t); >> z=cos(t); >> plot3(x,y,z,'bo'); >> hold on >> plot3(x,y,z,'r-','LineWidth',2);</span> |
当X,Y,Z为同维的二维数组,plot3( )将 X 、Y、Z 相应的列相组合,绘制多条3d曲线。
2、二维数据网格: meshgrid( )
[X,Y] = meshgrid(x,y) 由向量 x 和 y 生成二维数组X和Y,用来计算二元函数 f(x,y)的值Z = f(X,Y)。二维数组X,Y,Z可用来绘制三维曲线、三维网格图、三维曲面图等。 输出数组 X 中的行向量相当于向量 x ,输出数组 Y 中的列向量相当于向量 y 。[X,Y] = meshgrid(x) 等价于[X,Y] = meshgrid(x,x)。实质:
<span style="font-size:18px;">x = -4:0.5:4; y = ( 4:-0.5:-4 )'; X = repmat(x,length(y),1); Y = repmat(y,1,length(x));</span>
3、三维网格图: mesh( ) / meshc( ) / meshz( )
→mesh(X,Y,Z):绘制由数组 X,Y,Z 所确定的曲面的网格图X,Y,Z 都为二维数组时,要求它们的维数相同。X,Y 也可以是向量,但 Z 必须为二维数组, [m,n] = size(Z),此时必须满足:length(X) = n 且 length(Y) = m。
→mesh(Z): 相当于X = 1:n ,Y = 1:m,其中 [m,n] = size(Z)
→mesh(...,C):二维数组C确定网格颜色,省略C时相当于 C=Z
→mesh(...,'PropertyName',PropertyValue,...):设置属性值
→mesh(axes_handles,...) :在指定的坐标轴绘图
→h = mesh(...):返回句柄
举例:
<span style="font-size:18px;">>> x = -4:0.2:4; >> [X,Y] = meshgrid(x); >> Z = sin(sqrt(X.^2+Y.^2)); >> h = mesh(X,Y,Z); >> c1 = get(h,'FaceColor');</span> |
<span style="font-size:18px;">>> hidden off; >> c2 = get(h,'FaceColor');</span> |
meshc(X,Y,Z)
调用方式与 mesh 相同,在 mesh 基础上增加等高线
举例:
<span style="font-size:18px;">>> x = -10:0.5:10 ; >> [X,Y] = meshgrid(x); >> r = sqrt(X.^2+Y.^2)+eps; >> Z = sin(r)./r; >> meshc(X,Y,Z);</span> |
调用方式与 mesh 相同,在 mesh 基础上屏蔽边界面
4、三维表面图: surf( ) / surfc( )
绘制由矩阵 X,Y,Z 所确定的表面图,参数含义同 mesh→surf(Z) :相当于X = 1:n ,Y = 1:m,其中 [m,n] = size(Z)
→surf(Z,C) :二维数组C确定网格颜色,省略C时相当于 C=Z
→surf(X,Y,Z) :绘制由数组 X,Y,Z 所确定的曲面图
→surf(X,Y,Z,C) :
→surf(...,'PropertyName',PropertyValue) :设置属性值
→surf(axes_handles,...):在指定的坐标轴绘图
→h = surf(...) :返回句柄
举例:
<span style="font-size:18px;">>> x = -10:0.5:10 ; >> [X,Y] = meshgrid(x); >> r = sqrt(X.^2+Y.^2)+eps; >> Z = sin(r)./r; >> surf(X,Y,Z);</span> |
调用方式与 surf 相同,在 surf 基础上增加等高线
mesh( ) / surf( )的一些常用属性
属性名称 | 意义 | 取值 |
EdgeColor | 网格线颜色 | {ColorSpec} | none | flat | interp |
FaceColor | 四边形网格的填充颜色 | ColorSpec | none | {flat} | interp | texturemap |
LineStyle | 网格线线型 | {-} | -- | : | -. | none |
LineWidth | 网格线线宽 | |
Marker | 标记点形状 | none | + | o | * | . | x | s | d | p | h ….. |
MarkerEdgeColor | 标记点边界颜色 | none | {auto} | flat | ColorSpec |
MarkerFaceColor | 闭合的标记点填充颜色 | {none} | auto | flat | ColorSpec |
MarkerSize | 标记点大小 | size in points |
MeshStyle | 网格类型 | {both} | row | column |
<span style="font-size:18px;">>> x = -10:0.5:10 ; >> [X,Y] = meshgrid(x); >> r = sqrt(X.^2+Y.^2)+eps; >> Z = sin(r)./r; >> h = mesh(X,Y,Z,'EdgeColor','black'); >> set(h,'FaceColor','r'); >> set(h,'LineWidth',2);</span> | |
<span style="font-size:18px;">>> x = -10:0.5:10 ; >> [X,Y] = meshgrid(x); >> r = sqrt(X.^2+Y.^2)+eps; >> Z = sin(r)./r; >> surf(X,Y,Z,'EdgeColor','none');</span> |
5、利用surf( )绘制一些常见的三维表面图
mesh()/surf()绘制三维曲面的方法:(1)先根据X,Y,Z数组确定网格点
(2)用网格线连接在同一行中的网格点
(3)用网格线连接在同一列中的网格点
(4)用颜色数组C确定网格线(面)的颜色
用surf( )绘制四边形平面
绘图思路:把四个顶点分成"2行2列",将相应的坐标放进X,Y,Z数组即可绘图。同理,对 2n 边形,可将 2n个顶点分成 "2行n列 "或" n行2列 "进行处理。对凹多边形,这样处理可能会出错。
举例
<span style="font-size:18px;">>> clc; >> clear all; >> close all; >> A = [1;0;2]; >> B = [3;0;3]; >> C = [1;0;0]; >> D = [3;0;0]; >> P = [A,B;C,D]; >> X = P([1,4],:); >> Y = P([2,5],:); >> Z = P([3,6],:); >> h = surf(X,Y,Z); >> set(h,'FaceColor','b'); >> axis([0,4,-1,1,0,4]);</span> |
用surf( )绘制三角形平面
绘图思路:想象一下,有两个A点,只不过它们完全重合,这样就有四个顶点了,可以分成"2行2列",将相应的坐标放进X,Y,Z数组即可绘图。选取合适的顶点,这个想法对任意多边形都可以。
例:绘制一个长方体表面图(共六个面)
<span style="font-size:18px;">>> L = rand(1); >> W = rand(1); >> H = rand(1); >> A = rand(3,1); >> B = A + [L;0;0]; >> C = B + [0;W;0]; >> D = A + [0;W;0]; >> r1 = repmat(A,1,5); >> r2 = [A,B,C,D,A]; >> r3 = r2 + repmat([0;0;H],1,5); >> r4 = repmat(r3(:,1),1,5); >> P=[r1;r2;r3;r4]; >> X = P(1:3:end,:); >> Y = P(2:3:end,:); >> Z = P(3:3:end,:); >> surf(X,Y,Z,'FaceColor','b','EdgeColor','none') >> axis vis3d >> hold on >> x = X(2:3,:); % x,y,z用来绘制线框 >> y = Y(2:3,:); >> z = Z(2:3,:); >> plot3(x,y,z,'r','LineWidth',3); >> plot3(x',y',z','r','LineWidth',3);</span> |
用surf( )绘制平行于XOY平面的正多边形平面
一些特殊图形的绘制
<span style="font-size:18px;">>> z1 = 0 %底面所在的平面 >> z2 = 2 ; %顶面面所在的平面 >> M = 20 ; % 纬线数目 >> N = 20; % 经线数目 >> t = linspace(0,2*pi,N); >> s = linspace(0,2*pi, M)'; >> r = (2 + sin(s)); >> h = linspace(z1,z2, M)'; >> X = r*cos(t); >> Y = r*sin(t); >> Z = h*ones(size(t)); >> surf(X,Y,Z);</span> | |
<span style="font-size:18px;">>> z1 = 0 %底面所在的平面 >> z2 = 2 ; %顶面面所在的平面 >> M = 20 ; % 纬线数目 >> N = 20; % 经线数目 >> t = linspace(0,2*pi,N); >> s = linspace(0,2*pi, M)'; >> r = (2 + sin(s)); >> h = linspace(z1,z2, M)'; >> [T,R] = meshgrid(t,r); >> [T,H] = meshgrid(t,h); >> X = R.*cos(T); >> Y = R.*sin(T); >> Z = H; >> surf(X,Y,Z);</span> | |
<span style="font-size:18px;">>> z1 = 0 %底面所在的平面 >> z2 = 2 ; %顶面面所在的平面 >> M = 20 ; % 纬线数目 >> N = 20; % 经线数目 >> t = linspace(0,2*pi,N); >> s = linspace(0,2*pi, M)'; >> r = (2 + cos(s)); >> h = linspace(z1,z2, M)'; >> X = r*cos(t); >> Y = r*sin(t); >> Z = h*ones(size(t)); >> surf(X,Y,Z);</span> | |
<span style="font-size:18px;">>> z1 = 0 %底面所在的平面 >> z2 = 2 ; %顶面面所在的平面 >> M = 20 ; % 纬线数目 >> N = 20; % 经线数目 >> t = linspace(0,2*pi,N); >> s = linspace(0,2*pi, M)'; >> r =sin(s)./(s+eps); >> h = linspace(z1,z2, M)'; >> X = r*cos(t); >> Y = r*sin(t); >> Z = h*ones(size(t)); >> surf(X,Y,Z);</span> | |
<span style="font-size:18px;">>> r = 2; %球半径 >> r = 2; %球半径 >> N = 30; %纬线数 >> phi = 0:2*pi/M:2*pi ; >> theta = linspace(0,pi,N)'; >> X = r*sin(theta)*cos(phi); >> Y = r*sin(theta)*sin(phi); >> Z = r*cos(theta)*ones(size(phi)); >> surf(X,Y,Z); >> axis square;</span> | |
<span style="font-size:18px;">>> r = 2; >> theta = linspace(0,pi,20); >> phi = linspace(0,2*pi,21); >> [T,P]=meshgrid(theta,phi); >> X = r.*sin(T).*cos(P); >> Y = r.*sin(T).*sin(P); >> Z = r.*cos(T); >> surf(X,Y,Z); >> axis square;</span> |
Matlab提供的绘制柱面的函数cylinder
→[X,Y,Z]=cylinder 返回一半径为1、高度为1的圆柱面的x-,y-,z-轴的坐标值,圆柱面的圆周有20个距离相同的点。→[X,Y,Z]=cylinder(r) 返回一半径为r、高度为1的柱面的x-,y-,z-轴的坐标值,柱面的圆周有20个距离相同的点。
→[X,Y,Z]=cylinder(r,n) 返回一半径为r、高度为1的柱面的x-,y-,z-轴的坐标值,圆柱面的圆周有指定的n个距离相同的点
→cylinder(...) 画出柱面。
<span style="font-size:18px;">>> t = 0:pi/10:2*pi; >> [X,Y,Z] = cylinder(2+cos(t)); >> surf(X,Y,Z); >> axis square</span> |
Matlab提供的绘制球面的函数sphere
→sphere 生成三维直角坐标系中的单位球体。该单位球体有20*20个面。→sphere(n) 在当前坐标系中画出有 n*n 个面的球体
→[X,Y,Z] = sphere(n)
返回三个阶数为(n+1)*(n+1)的直角坐标系中的二维坐标数组阵。该命令没有画图,只是返回矩阵。用户可以用命 令surf(X,Y,Z)或mesh(X,Y,Z)画出单位球体球体也可以直接用sphere(n)直接画出球体
<span style="font-size:18px;">>> sphere; >> axis equal</span> |
Matlab提供的绘制椭球面的函数ellipsoid
→[x,y,z] = ellipsoid(xc,yc,zc, a,b,c,n)返回绘图数据,x,y,z均为(n+1)×(n+1)的二维数组
→[x,y,z] = ellipsoid(xc,yc,zc,a,b,c)
返回绘图数据,n = 20
→ellipsoid(axes_handle,...)在指定坐标轴画出椭球面
→ellipsoid(...) 画出椭球面
<span style="font-size:18px;">>> [x, y, z] = ellipsoid(0,0,0,3,2,1,30); >> surf(x, y, z); >> axis equal</span> |
相关文章推荐
- Matlab中数据的存储方式
- Matlab中数据的存储方式
- matlab2015a xcode7 找不到sdk问题
- 最大间隔多超平面分类器(多线性SVM分类器)介绍及Matlab实现
- matlab集合经验模态分解EEMD工具包
- 模糊聚类FCM的MATLAB实现
- VS 调用 Matlab (混合编程)
- 傅立叶变换-MATLAB
- matlab 查看电脑系统性能(CPU,GPU),并开启并行运算
- Matlab调用C语言编写MEX文件
- matlab学习笔记
- 将MATLAB的变量数据导入到C/C++程序中的方法!
- matlab图像处理
- ubuntu15.04下Matlab R2012a的安装和GCC4.6配置
- MATLAB中MEX文件的编写与调试
- MATLAB中fopen、fprintf函数的用法
- MATLAB的一些基础知识
- MatLab 代码优化 Fast your MatLab code. (2) 寻找性能瓶颈
- Matlab---图像滤波之各种滤波器汇总实现
- Matlab编程实例(4) 相位角与相关系数曲线