【基础知识笔记】021 三维数据可视化

1-1 曲线图绘制

与二维绘图命令类似,在三维坐标下有三维的基本绘图命令plot3,其使用方法与plot相仿。plot3的调用格式如下。

格式一:\(plot3(x, y, z)\)

\(x, y, z\)相同长度的向量,则根据向量x, y, z绘制空间三维曲线。
如果\(x, y, z\)为同阶矩阵,则绘制对应列的多条曲线

格式二:\(plot3(x, y, z, 's')\)

按字符串s设置的线型、颜色、标记符号绘制三维空间曲线。字符串s的设置与\(plot()\)命令的设置相同。

>> t=0:pi/10:10*pi;
>> x=cos(t);
>> y=sin(t);
>> plot3(x,y,t,'bo-.');
>> xlabel('x=cos(t)');
>> ylabel('y=sin(t)');
>> zlabel('z');
>> title('三维螺旋线')
>> 

1-2 三维网线图绘制

MATLAB提供的函数mesh用来绘制三维网线图

该命令可以绘出在某一区间内完整的曲面,而不是单根曲线。其基本调用格式如下:

mesh(x,y,z)

根据矩阵x, y和z绘制彩色的空间三维网线图。x, y和z中对应的元素为三维空间上的点,点与点之间用线连接。其中网线的颜色随网点高度的改变而改变。

在绘制二元函数\(z=f(x, y)\)的三维网线时

首先应通过\([x,y]=meshgrid(x, y)\)语句在xy平面上建立网格坐标,然后利用x和y计算每一个网格点上z坐标的大小,该坐标就定义了曲面上的点。最后由\(mesh(z)\)命令完成三维网线图的绘制。

1-2-1 example:绘制$z=x e{-x2 - y^2} $

>> x=-2:0.2:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*exp(-x.^2)-y.^2;
>> mesh(x,y,z);
>> z=x.*exp(-x.^2-y.^2);
>> mesh(x,y,z);
>> 
1EdMQ.png

meshz函数在mesh函数的基础上增加了绘制边界面的功能,其调用格式与mesh一样。图12.3是运行\(meshz(x, y, z)\)的结果。

>> x=-2:0.2:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*exp(-x.^2)-y.^2;
>> mesh(x,y,z);
>> z=x.*exp(-x.^2-y.^2);
>> meshz(x,y,z)
1Eg5h.png

1-2-1 example:绘制$z=x e{-x2 - y^2} $的等高线图

>> x=-2:0.2:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*exp(-x.^2)-y.^2;
>> mesh(x,y,z);
>> z=x.*exp(-x.^2-y.^2);
>> meshc(x,y,z)
1EYsy.png

1-3 曲面图的绘制

在三维网线上,对网线之间的网线元进行颜色填充就成了三维曲面图。MATLAB提供的surf函数具有这样的功能。其调用格式如下:

surf(x,y,z)

最常用的曲面图调用格式,绘制由3个矩阵所指定的带色参数的网状表面图,轴的刻度决定于x、y、z的范围,或当前对轴的设定,颜色与网的高度成正比。

1-3-1 example:\(z=x^2+y^2\) 绘制曲面图

>> x=-5:5;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.^2+y.^2;
>> surf(x,y,z);
>> hold on;
>> colormap(hot) 
>> stem3(x,y,z,'bo-.')
1EsRX.png

与mesh函数类似,与surf函数对应的也有surfl和surfc函数,surfl函数在绘制好的曲面上基于当前调色板颜色进行光照处理,surfc函数在绘制好的曲面图下加等高线。将范例12-4中的surf(x, y, z)分别替换为surfl(x, y, z)和surfc(x, y, z)后运行程序的结果如图所示。

1Epdf.png

2 三维隐函数的绘制

利用MATLAB的等值面函数isosurface,并在patch函数的配合之下就可以轻松完成

2-1 isosurface 等值面函数

调用格式:

fv=isosurface(X, Y, Z, V, isovalue)。

返回某个等值面(由isovalue指定)的表面(faces)和顶点(vertices)数据,存放在结构体fv中(fv由vertices、faces两个域构成)。
X、Y和Z的取值构成立体空间的一些栅格节点,V对应的是这些栅格点上的函数值数据。
如果是画隐函数v=f(x, y,z)=0的三维图形,则等值面的数值为isovalue=0。

2-2 patch 函数

调用格式:

patch(x,y,c)

此格式以平面坐标(X, Y)为顶点,构造平面多边形,C是RGB颜色向量。

patch(x,y,z,c)

此格式以空间三维坐标(X, Y, Z)为顶点,构造空间三维曲面,C是RGB颜色向量。

patch(fv)

此格式通过包含vertices、faces两个域的结构体fv来构造三维曲面,fv可以直接由等值面函数isosurface得到,例如patch(isosurface(X, Y, Z, V,0))。

2-3 绘制隐函数步骤

  1. 坐标范围确定;
  2. 使用meshgrid函数产生网格点;
  3. 隐函数定义,可利用@符号获取其函数句柄,实现对函数的操作;
  4. 计算坐标空间范围内的格点函数值val;
  5. 调用p=isosurface(x, y, z, val,0)函数计算隐函数等值点的位置并返回到p;
  6. 调用patch函数对曲面进行修饰

2-4 example:绘制 \(f(x,y,z)=x^2+y^2+z^2-1=0\)


>> clear;
>> xlimit=[-2 2];
>> ylimit=[-2 2];
>> zlimit=[-2 2];
>> gd=[30,30,30];%设置三个坐标轴的格点数,越多绘制出来的越精细。
>> f=@(x,y,z) x.^2+y.^2+z.^2-1 %定义隐函数表达式如果不含有某个变量,那就要用0*y之类表示,

f = 

    @(x,y,z)x.^2+y.^2+z.^2-1

>> xlinspace(xlimit(1),xlimit(2),gd(1));%定义x变量的向量;
未定义函数或变量 'xlinspace'。
 
是不是想输入:
>> x=linspace(xlimit(1),xlimit(2),gd(1));%定义x变量的向量;
>> y=linspace(ylimit(1),ylimit(2),gd(2));%定义x变量的向量;
>> z=linspace(zlimit(1),zlimit(2),gd(3));%定义x变量的向量;
>> [x.y,z]=meshgrid(x,y,z);
字段赋值赋给非结构体数组对象。
 
>> [x,y,z]=meshgrid(x,y,z);
>> val=f(x,y,z);%根据网格点计算函数值
>> [f,v]=isosurface(x,y,z,val,0);%isosurface()利用等值点绘制曲面
>>p=patch('Faces',f,'Vertices',v,'CData',v(:,3),'facecolor','none','Edgecolor','flat')
>> grid on;
>> view(3)
>> 

3 习题

  1. 用plot,fplot绘制函数\(y=cos(tan x)\)的图形。
  2. 用eplot绘制摆线:

\[\begin{align} x &= a(t-sint)\\ y &=a(1-cost) \\t & \in [0,2\pi] \end{align} \]

的图形。
3. 用plot绘制阿基米德螺线\(r=aθ\)和三叶玫瑰线\(r=acos(3θ)\)

x=-0.5*pi:pi/100:0.5*pi;
y=cos(tan(x));
plot(x,y)

1V7pf.png

posted @ 2023-02-01 22:43  FE-有限元鹰  阅读(118)  评论(0编辑  收藏  举报