Matlab实现三维投影绘制的示例代码
创作时间:
作者:
@小白创作中心
Matlab实现三维投影绘制的示例代码
引用
1
来源
1.
https://www.zhangshengrong.com/p/l51gZEjAX0/
本文介绍了一个用于Matlab的三维投影绘制函数axProjection3D,支持三维曲线、曲面、三维多边形、参数方程曲线和参数方程曲面的投影绘制。通过多个具体示例,展示了该函数在不同场景下的使用方法。
使用方法
三维多边形投影及基本使用
通过介绍如何生成三维多边形投影来说明函数的使用方法。这里的三维多边形指的是使用patch或fill3创建的图形。假设我们绘制了如下一个复杂多边形构成的球:
c = 1;
d = 2*c*(3*sqrt(2)+2)/7;
m = d*(3*sqrt(2)-4)/4;
l = m+d*(2-sqrt(2))/4;
t = d*(2-sqrt(2))/4;
V = [c-l -t c; t -c+l c; -t -c+l c; -c+l -t c; -c+l t c; -t c-l c; t c-l c; c-l t c; c t c-l;...
c -t c-l; c -c+l t; c -c+l -t; c -t -c+l; c t -c+l; c c-l -t; c c-l t; c-l c t; c-l c -t;...
t c -c+l; -t c -c+l; -t c-l -c; t c-l -c; c-l t -c; -c+l t -c; -c+l c -t; -c c-l -t; -c t -c+l;...
-c -t -c+l; -c+l -t -c; -t c c-l; t c c-l; -c+l c t; -c c-l t; -c t c-l; -c -t c-l; -c -c+l t;...
-c+l -c t; -c+l -c -t; -c -c+l -t; -t -c -c+l; -t -c+l -c; t -c+l -c; t -c -c+l; c-l -c -t;...
c-l -t -c; t -c c-l; -t -c c-l; c-l -c t];
F8 = [1 2 3 4 5 6 7 8; 17 18 19 20 25 32 30 31; 22 23 45 42 41 29 24 21;...
37 38 40 43 44 48 46 47; 9 10 11 12 13 14 15 16; 26 27 28 39 36 35 34 33];
F6 = [5 6 30 32 33 34; 3 4 35 36 37 47; 1 2 46 48 11 10; 7 8 9 16 17 31; 20 25 26 27 24 21;...
28 39 38 40 41 29; 14 23 22 19 18 15; 12 13 45 42 43 44];
F4 = [6 7 31 30; 1 10 9 8; 2 3 47 46; 4 5 34 35; 32 25 26 33; 36 37 38 39;...
11 12 44 48; 15 16 17 18; 19 20 21 22; 27 24 29 28; 40 41 42 43; 13 14 23 45];
hold on;axis equal;grid on
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5])
view(3);
patch('Vertices', V, 'Faces', F4, 'FaceColor', [0 .8 .9]);
patch('Vertices', V, 'Faces', F6, 'FaceColor', [0 .5 .9]);
patch('Vertices', V, 'Faces', F8, 'FaceColor', [0 .5 .5]);
在代码最后加入这么一行即可生成投影:
axProjection3D('XYZ')
只生成部分投影:
axProjection3D('XZ')
为每个投影设置不同颜色:
axProjection3D('X')
axProjection3D('Y',[.7,0,0])
axProjection3D('Z',[0,0,.7])
以上是工具函数的基本使用,以下给出应对其他几种图像格式该工具的使用效果:
三维曲面投影
此部分主要是值使用函数surf、surface、mesh函数创建的曲面,完全相同的使用方式:
cplxdemo
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5])
axProjection3D('XYZ')
三维曲线投影
此部分主要是值使用函数line、plot3函数创建的曲线,完全相同的使用方式:
[~,L]=ode45(@(t,L)Lorenz(t,L),0:.01:100,[1;1;1;10;28;8/3]);
plot3(L(:,1),L(:,2),L(:,3))
grid on
axProjection3D('XYZ')
function dL=Lorenz(t,L)
% L=[x;y;z;a;r;b];
% dL=[dx/dt;dy/dt;dz/dt;0,0,0];
% dz/dt=-a*(x-y)
% dy/dt=x*(r-z)-y
% dz/dt=x*y-b*z
dL=zeros([6,1]);
dL(1)=-L(4)*(L(1)-L(2));
dL(2)=L(1)*(L(5)-L(3))-L(2);
dL(3)=L(1)*L(2)-L(6)*L(3);
dL(4:6)=0;
end
三维参数曲线投影
此部分主要是值使用函数fplot3函数创建的曲线,完全相同的使用方式:
xt = @(t) exp(-t/10).*sin(5*t);
yt = @(t) exp(-t/10).*cos(5*t);
zt = @(t) t;
fplot3(xt,yt,zt,[-10 10])
axProjection3D('XYZ')
三维参数曲面投影
此部分主要是值使用函数fsurf函数创建的曲面,完全相同的使用方式:
syms u v;
r = @(u) 4 - 2*cos(u);
x = piecewise(u <= pi, -4*cos(u)*(1+sin(u)) - r(u)*cos(u)*cos(v),...
u > pi, -4*cos(u)*(1+sin(u)) + r(u)*cos(v));
y = r(u)*sin(v);
z = piecewise(u <= pi, -14*sin(u) - r(u)*sin(u)*cos(v),...
u > pi, -14*sin(u));
fsurf(x,y,z, [0 2*pi 0 2*pi]);
axis([-8,12,-8,12,-22,18])
axProjection3D('XYZ')
混合类型三维绘图投影
多种类型图像画在一起:
xt = @(t) exp(-t/10).*sin(5*t);
yt = @(t) exp(-t/10).*cos(5*t);
zt = @(t) t;
fplot3(xt,yt,zt,[-10 10],'LineWidth',2)
hold on
[X,Y,Z] = peaks(30);
surf(X,Y,Z)
axis([-5,5,-5,5,-8,8])
axProjection3D('XYZ')
工具函数完整代码
function axProjection3D(varargin)
% 获取参数
if isa(varargin{1},'matlab.graphics.axis.Axes')
ax=varargin{1};varargin(1)=[];
else
ax=gca;
end
hold(ax,'on')
ax.XLim=ax.XLim;
ax.YLim=ax.YLim;
ax.ZLim=ax.ZLim;
state=upper(varargin{1});
if length(varargin)>1
faceColor=varargin{2};
else
faceColor=[.5,.5,.5];
end
[~,state,~]=intersect('XYZ',state);
% 记录子图形对象
ChildrenList(length(ax.Children))=ax.Children(end);
for n=1:length(ax.Children)
ChildrenList(n)=ax.Children(n);
end
for n=length(ChildrenList):-1:1
if strcmp(ChildrenList(n).Tag,'AP3D')
ChildrenList(n)=[];
end
end
% 绘制投影
minLim=[ax.XLim(2),ax.YLim(2),ax.ZLim(1)];
for i=1:length(state)
ii=state(i);
for n=1:length(ChildrenList)
switch true
% Patch对象投影
case isa(ChildrenList(n),'matlab.graphics.primitive.Patch')
tobj=copyobj(ChildrenList(n),ax);
tobj.Vertices(:,ii)=minLim(ii);
tobj.FaceColor=faceColor;
tobj.FaceAlpha=.5;
tobj.EdgeColor=faceColor./5;
tobj.EdgeAlpha=.9;
tobj.Tag='AP3D';
% Surface对象投影
case isa(ChildrenList(n),'matlab.graphics.chart.primitive.Surface')||isa(ChildrenList(n),'matlab.graphics.primitive.Surface')
tobj=copyobj(ChildrenList(n),ax);
switch ii
case 1,tobj.XData(:,:)=minLim(ii);
case 2,tobj.YData(:,:)=minLim(ii);
case 3,tobj.ZData(:,:)=minLim(ii);
end
tobj.FaceColor=faceColor;
tobj.FaceAlpha=.5;
tobj.EdgeColor=faceColor./5;
tobj.EdgeAlpha=.9;
tobj.Tag='AP3D';
% Line对象投影
case isa(ChildrenList(n),'matlab.graphics.chart.primitive.Line')||isa(ChildrenList(n),'matlab.graphics.primitive.Line')
tobj=copyobj(ChildrenList(n),ax);
switch ii
case 1,tobj.XData(:,:)=minLim(ii);
case 2,tobj.YData(:,:)=minLim(ii);
case 3,tobj.ZData(:,:)=minLim(ii);
end
tobj.Color=[faceColor,.5];
tobj.Tag='AP3D';
% 三维参数化曲线
case isa(ChildrenList(n),'matlab.graphics.function.ParameterizedFunctionLine')
tobj=copyobj(ChildrenList(n),ax);
switch ii
case 1,tobj.XFunction=@(t)t.*0+minLim(ii);
case 2,tobj.YFunction=@(t)t.*0+minLim(ii);
case 3,tobj.ZFunction=@(t)t.*0+minLim(ii);
end
tobj.Color=[faceColor,.5];
tobj.Tag='AP3D';
% 三维参数化曲面
case isa(ChildrenList(n),'matlab.graphics.function.ParameterizedFunctionSurface')
tobj=copyobj(ChildrenList(n),ax);
switch ii
case 1,tobj.XFunction=minLim(ii);
case 2,tobj.YFunction=minLim(ii);
case 3,tobj.ZFunction=minLim(ii);
end
tobj.FaceColor=faceColor;
tobj.FaceAlpha=.5;
tobj.EdgeColor=faceColor./5;
tobj.Tag='AP3D';
end
end
end
end
以上就是Matlab实现三维投影绘制的示例代码的详细内容,更多关于Matlab三维投影的资料请关注我们其它相关文章!
热门推荐
大学生创业成功案例:从校园走向商业巅峰
网络密语揭秘:蝴蝶背后的多重隐喻与象征
30平方米的厨房客厅设计:布局和分区选项
怎么做项目管理表单表格
电子焊接技术主要的焊接标准和规范
雪燕:营养价值、功效、禁忌、食用方式
三日奥硝唑输液:疗效探秘与给药方式抉择
围炉茶话 | 中国茶馆四大派别:品味地域文化的茶香脉络
《2025年全球软实力指数》发布,我国超越英国位居全球第二位
刘宁||《雪域高原》创作概要
什么是镜头眩光?
浅谈太极拳呼吸法
姜母鸭的做法:补气滋阴的美味佳肴
肺部轻度纤维化怎么治
中国著名十大上古神话女神盘点
电池管理系统集中式和分布式的区别:哪个更适合你的需求?
大西北适合逛吃的地方,可不止西安、兰州,还有这座宁夏小城
太原楼市热度不减,房价逆势上扬引关注
经常坐着的上班族怎么减肥呢
最新!2024年惠州行业薪酬出炉!
如何合理计算和安排补仓资金?这种补仓资金的使用策略有哪些?
衢州:“东南孔道”如何再弘“孔子之道”
会厌囊肿术后喉咙痛原因及应对方法
收款码风控问题全攻略:原因分析、解除方法与预防策略
2.6万家!杭州人是有多爱这口啊,街头老长的队伍!你最喜欢哪种配方?
Cell Reports | 突破瓶颈!功能性胸腺上皮类器官系成功培育
房屋确权问题找哪个部门解决
财务指标分析:探究公司融资能力的有效方法
交通事故保险公司垫付医药费不够怎么解决
玩具选购攻略:为孩子挑到最合适的玩具