前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MATLAB 从零到进阶】day7制作三维图形

【MATLAB 从零到进阶】day7制作三维图形

作者头像
统计学家
发布2019-04-10 15:43:18
8130
发布2019-04-10 15:43:18
举报

第三节 三维图形绘制

用plot3函数绘制三维螺旋线

>> t = linspace(0, 10*pi, 300);

>> plot3(20*sin(t), 20*cos(t), t, 'r', 'linewidth', 2);

>> hold on %图形保持

>> quiver3(0,0,0,1,0,0,25,'k','filled','LineWidth',2);

>> quiver3(0,0,0,0,1,0,25,'k','filled','LineWidth',2);

>> quiver3(0,0,0,0,0,1,40,'k','filled','LineWidth',2);

>> grid on

>> xlabel('X'); ylabel('Y'); zlabel('Z');

>> axis([-25 25 -25 25 0 40]);

>> view(-210,30);

>> [x,y]=meshgrid(0:0.25:4*pi);

>> z=sin(x+sin(y))-x/10; mesh(x,y,z);

>> axis([0 4*pi 0 4*pi -2.5 1]);

调用函数绘制柱面,球面,椭球面

% 绘制圆柱面 >> subplot(2,2,1); >> [x,y,z] = cylinder; >> surf(x,y,z); % 绘制哑铃面 >> subplot(2,2,2); >> t = 0:pi/10:2*pi; >> [X,Y,Z] = cylinder(2+cos(t)); >> surf(X,Y,Z); % 绘制球面,半径为10,球心(1,1,1) >> subplot(2,2,3); >> [x,y,z] = sphere; >> surf(10*x+1,10*y+1,10*z+1); axis equal; % 绘制椭球面 >> subplot(2,2,4); >> a=4; b=3; >> t = -b:b/10:b; >> [x,y,z] = cylinder(a*sqrt(1-t.^2/b^2),30); >> surf(x,y,z);

绘制三维饼图、三维柱状图、三维火柴杆图、三维填充图、三维向量场图和立体切片图(四维图).

% 饼图 >> subplot(2,3,1); >> pie3([2347,1827,2043,3025]); >> title('三维饼图'); % 柱状图 >> subplot(2,3,2); >> bar3(magic(4)); >> title('三维柱状图'); % 火柴杆图 >> subplot(2,3,3); >> y=2*sin(0:pi/10:2*pi); >> stem3(y); >> title('三维火柴杆图'); % 填充图 >> subplot(2,3,4); >> fill3(rand(3,5),rand(3,5),rand(3,5), 'y' ); >> title('三维填充图'); >> subplot(2,3,5); >> [X,Y] = meshgrid(0:0.25:4,-2:0.25:2); >> Z = sin(X).*cos(Y); >> [Nx,Ny,Nz] = surfnorm(X,Y,Z); >> surf(X,Y,Z); >> hold on; > quiver3(X,Y,Z,Nx,Ny,Nz,0.5); >> title('三维向量场图'); >> axis([0 4 -2 2 -1 1]); % 立体切片图(四维图) >> subplot(2,3,6); >> t = linspace(-2,2,20); >> [X,Y,Z] = meshgrid(t,t,t); >> V = X.*exp(-X.^2-Y.^2-Z.^2); >> xslice = [-1.2,.8,2]; >> yslice = 2; >> zslice = [-2,0]; >> slice(X,Y,Z,V,xslice,yslice,zslice); >> title('立体切片图(四维图)');

二、三维图形的修饰和添加注释

MATLAB中提供了colormap函数,可以根据颜色映像矩阵对图形对象的色彩进行调整。所谓的颜色映像矩阵就是一个的矩阵,k行表示有k种颜色,每行3个元素分别代表红、绿、蓝三元色的灰度值,取值均在[0,1]之间。

colormap 函数

colormap(map),设置map为当前颜色映像矩阵

colormap('default'),恢复当前颜色映像矩阵为默认值

cmap = colormap,获取当前颜色映像矩阵

colormap(ax,…),设置当前axes对象的颜色映像矩阵

map的设置有两种,可以人为指定一个元素值均在[0,1]之间的的矩阵,也可以用MATLAB自带的17种颜色映像矩阵。在MATLAB命令窗口分别运行autumn、bone、colorcube、cool、copper、flag、gray、hot、hsv、jet、lines、pink、prism、spring、summer、white和winter函数,就可得到这17种颜色映

三维图形的透视效果

subplot(1,2,1); [X,Y,Z] = sphere; surf(X,Y,Z); colormap(lines); shading interp hold on; mesh(2*X,2*Y,2*Z) hidden off axis equal axis off subplot(1,2,2); surf(X,Y,Z,'FaceColor','r'); hold on; surf(2*X,2*Y,2*Z,'FaceAlpha',0.4); axis equal axis off

4. 光源设置与属性调整

light函数

light('PropertyName',propertyvalue,…)

建立一个光源,并设置光源属性(Position、Color和Style)'Position'是位置属性,设置光源位置,其属性值为三个元素的向量[x, y, z],即光源的三维坐标;'Color'是颜色属性,设置光源颜色,其属性值可以是代表颜色的字符(如表5.2-1所列),也可以是由红、绿、蓝三元色的灰度值组成的向量;'Style'是光源类型属性,设置光源类型,其取值为字符串'infinite' 或'local',分别表示平行光源和点光源。

handle = light(…)

建立一个光源,并获取其句柄值handle,之后可以通过get(handle)查看光源的所有属性,也可以通过set(handle, 'PropertyName',propertyvalue,…)设置光源的属性值。

5. 调整光照模式

lighting函数

lighting flat,产生均匀光照,选择此方法,以查看面对象,是光照模式的默认设置。

lighting gouraud,计算顶点法线并作线性插值修改表面颜色,选择此方法,以查看曲面对象。

lighting phong,做线性插值并计算每个像素的反射率来修改表面颜色,选择此方法,以查看曲面对象。此方法比lighting gouraud的效果好,但是用于渲染的时间较长。

lighting none,关掉照明。

6. 图形表面对光照反射属性设置

material函数

material shiny,使图形对象有相对较高的镜面反射,镜面光的颜色仅取决于光源颜色。

material dull,使图形对象有更多的漫反射,反射光的颜色仅取决于光源颜色。

material metal,使图形对象有非常高的镜面反射和非常低的环境光及漫反射,反射光的颜色取决于光源颜色和图形表面的颜色。

material([ka kd ks])

material([ka kd ks n])

material([ka kd ks n sc]),用ka、kd和ks分别设置图形对象的环境光、漫反射和镜面反射的强度,用镜面指数n控制镜面亮点的大小,用sc设置镜面颜色的反射系数。ka、kd、ks、n和sc均为标量,sc的取值介于0和1之间。

material default,恢复ka、kd、ks、n和sc的默认值。

7. 调整视点位置

view函数

view(az,el),设置三维绘图的视角, az是方位角,el表示相对于xoy平面的仰角,。

view([x,y,z]),设置视点的三维直角坐标[x, y, z].

view(2),设置默认的二维视角,az = 0, el = 90.

view(3),设置默认的三维视角,az = -37.5, el = 30.

view(ax,…),设置句柄值为ax的坐标系的视角。

view(T),用viewmtx函数生成的的视角转换矩阵作为输入来设置视角。

[az,el] = view,返回当前方向角和仰角。

T = view,返回一个的视角转换矩阵。

绘制一个透明的立方体盒子,里面放红色、蓝色和黄色三个球。

vert = [0 0 0;0 200 0;200 200 0;200 0 0;0 0 100;... 0 200 100;200 200 100;200 0 100]; 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]; view(3); h = patch('faces',fac,'vertices',vert,'FaceColor','g'); set(h,'FaceAlpha',0.25); hold on; [x0,y0,z0] = sphere; x = 30 + 30*x0; y = 50 + 30*y0; z = 50 + 30*z0; h1 = surf(x,y,z,'linestyle','none','FaceColor','r','EdgeColor','none'); x = 110 + 30*x0; y = 110 + 30*y0; z = 50 + 30*z0; h2 = surf(x,y,z,'linestyle','none','FaceColor','b','EdgeColor','none'); x = 110 + 30*x0; y = 30 + 30*y0; z = 50 + 30*z0; h3 = surf(x,y,z,'linestyle','none','FaceColor','y','EdgeColor','none'); lightangle(45,30); lighting phong; axis equal; xlabel('X'); ylabel('Y'); zlabel('Z');

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档