matlab 3D绘图详解

<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>

 

用plot3( )同时绘制多条3d曲线

当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>

 

默认情况下每个四边形区域填充的是白色,因此c1的值 [1,1,1]

<span style="font-size:18px;">>> hidden off;
>> c2 = get(h,'FaceColor');</span>

 

hidden off命令是使每个四边形区域不填充任何颜色,是空的,可以看到后面的图线。因此c2的值为 none

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>

 

→meshz(X,Y,Z)

调用方式与 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>

 

→surfc(X,Y,Z)

调用方式与 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

例:mesh() / 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;
>> 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>

 

时间: 2024-08-04 20:18:05

matlab 3D绘图详解的相关文章

【转】Android Canvas绘图详解(图文)

转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡在网上的日子 发表于 2012-12-12 20:29 第 63165 次阅读 Canvas,android 15 Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳

canvas绘图详解笔记(一)

声明一下:这里我不会用太多文字去详解介绍canvas是什么,相信了解过canvas的人都知道它的魅力所在,如果你对canvas还比较陌生的话,建议可以查阅相关资料了解一下.这里我将对canvas绘图详解课程做一次详细的笔记,方便大家和自己日后可以学习.那么接下来就是直接进入笔记内容的学习: 首先创建一个canvas元素,我们只需要在html文件中加入这么一句代码: <canvas id="canvas">当前浏览器不支持canvas,请更换浏览器使用!</canvas

Matlab绘图详解

Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,Matlab还提供了直接对图形句柄进行操作的低层绘图操作.这类操作将图形的每个图形元素(如坐标轴.曲线.文字等)看做一个独立的对象,系统给每个对象分配一个句柄,可以通过句柄对该图形元素进行操作,而不影响其他部分. 本章介绍绘制二维和三维图形的高层绘图函数以及其他图形控制函数的使用方法,在此基础上,再介

IOS绘图详解(http://blog.163.com/wkyuyang_001/blog/static/10802122820133190545227/)

14.1 Quartz概述 Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics.共有两种部分组成Quartz: Quartz Compositor,合成视窗系统,管理和合成幕后视窗影像来建立Mac OS X使用者接口. Quartz 2D,是iOS和Mac OS X环境下的二维绘图引擎. 涉及内容包括:基于路径的绘图,透明度绘图,遮盖,阴影,透明层,颜色管理,防锯齿渲染,生成PDF,以及PDF元数据相关处理. 14.2 绘制基本几何图形 视图绘制

Android Canvas绘图详解(图文) - 泡在网上的日子

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

【转】Matlab的regionprops详解

matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域.算法:(1)Determine the connected components.  L = bwlabeln(BW, conn);(2)Compute the area of each component.  S = regionprops(L, 'Area');(3)Remove s

matlab rand函数详解

均匀分布的随机数或矩阵 语法 Y = rand(n) Y = rand(m,n) Y = rand([m n]) Y = rand(m,n,p,...) Y = rand([m n p...]) Y = rand(size(A)) rand s = rand('state') 描述 rand函数产生由在(0, 1)之间均匀分布的随机数组成的数组. Y = rand(n) 返回一个n x n的随机矩阵.如果n不是数量,则返回错误信息. Y = rand(m,n) 或 Y = rand([m n])

Android Canvas绘图详解(图文)

编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章. 大 部分2D使用的api都在android.graphics和android.graphics.drawabl

HTML5 Canvas绘图详解 drawImage() 方法 有图有真相!

步骤 1 2 3 4 5 简介 是一个新的HTML元素,这个元素可以被Script语言(通常是JavaScript)用来绘制图形.例如可以用它来画图.合成图象.或做简单的(和不那么简单的)动画. 工具/原料 html script 步骤/方法 最常见的在canvas上画图的方法是使用Image对象.所支持的来源图片格式依赖于浏览器的支持,然而,一些典型的图片格式(png,jpg,gif等)基本上都没有问题. 在下面的所有例子中,图片源将会使用这张256×256尺寸的图片. 绘制图片:在最基本的画