Matlab实现三维投影绘制的示例代码

目录
  • 使用方法
  • 三维曲面投影
  • 三维曲线投影
  • 三维参数曲线投影
  • 三维参数曲面投影
  • 混合类型三维绘图投影
  • 工具函数完整代码

本期带来一个三维投影绘制函数(三视图绘制),函数支持三维曲线、曲面、三维多边形、参数方程曲线、参数方程曲面的投影绘制,以下先给出代码使用方式,文末给出工具函数完整代码:

使用方法

三维多边形投影及基本使用

通过介绍如何生成三维多边形投影介绍一下函数咋用,这里的三维多边形指的是使用patchfill3创建的图形,假设我们绘制了如下一个复杂多边形构成的球:

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

以上是工具函数的基本使用,以下给出应对其他几种图像格式该工具的使用效果:

三维曲面投影

此部分主要是值使用函数surfsurfacemesh函数创建的曲面,完全相同的使用方式:

cplxdemo
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5])

axProjection3D('XYZ') 

三维曲线投影

此部分主要是值使用函数lineplot3函数创建的曲线,完全相同的使用方式:

[~,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)
% @author : slandarer
% 公众号  : slandarer随笔
% 知乎    : hikari

% 获取参数
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三维投影的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于Matlab绘制洛伦兹吸引子相图

    目录 1.公式及Lorenz函数 2.混沌吸引子图像 3.混沌吸引子图像 4.封面图绘制 洛伦兹吸引子(Lorenz attractor)是由MIT大学的气象学家Edward Lorenz在1963年给出的,他给出第一个混沌现象——蝴蝶效应........废话不多说. 反正咱就是,好看且有用咱就写代码,第零部分给出公式.第一部分给出 混沌吸引子 图像,第二部分给出庞加莱截面法 分岔图 绘制. 1.公式及Lorenz函数 Lorenz微分方程组定义如下: 非常容易能写出该微分方程组函数: func

  • 利用Matlab绘制有趣图像的示例代码

    目录 1.随机樱花树 2.苹果绘制 3.南瓜绘制 4.一堆三角形绘制 5.月饼绘制 6.大钻石绘制 7.有趣曲线1 8.有趣曲线2 9.有趣曲线3——蝴蝶曲线 10.有趣曲线4——心形曲线 11.有趣曲线5 12.会害羞的含羞草 13.随机雪景 1.随机樱花树 function sakura % @author:slandarer % 随机形状二叉树樱花树绘制 hold on,axis equal axis(0.5+[-10,50,0,50]) set(gca,'xtick',[],'ytick

  • 详解Matlab绘制3D玫瑰花的方法(内附旋转版本)

    目录 1.玫瑰花绘制 绘制效果 完整代码 2.月季花绘制 绘制效果 完整代码 3.玫瑰配色 4.旋转版本 1.玫瑰花绘制 绘制效果 完整代码 function drawrose grid on [x,t]=meshgrid((0:24)./24,(0:0.5:575)./575.*20.*pi+4*pi); p=(pi/2)*exp(-t./(8*pi)); change=sin(15*t)/150; u=1-(1-mod(3.6*t,2*pi)./pi).^4./2+change; y=2*(

  • Matlab绘制散点密度图的教程详解

    目录 效果 1工具函数完整代码 2参数说明 3使用方式 3.1散点赋色 3.2等高线图 3.3带直方图的散点图 3.4带直方图的等高线图 4使用方式扩展–与ggplot修饰器联动 效果 原理也很简单,通过matlab自带的ksdensity获得网格每一点密度,通过密度拟合曲面,再计算每个数据点对应的概率,并将概率映射到颜色即可为了怕大家找不到函数这次工具函数放到最前面 1工具函数完整代码 function [CData,h,XMesh,YMesh,ZMesh,colorList]=density

  • 详解Matlab如何绘制小提琴图

    目录 1使用示例 基础使用,Y为矩阵 基础使用,Y为向量,X为标签 基础使用多个图像绘制,并添加图例 2完整代码 写了个matlab绘制小提琴图的函数: 1.图中小提琴状区域为核密度曲线 2.白色方块为25%,75%分位数 3.中间横线为中位数 4.白色点为离群值点 5.竖着的黑线是去掉离群值点后点的上下限 1使用示例 基础使用,Y为矩阵 X=1:5; Y=randn(100,5); Hdl1=violinChart(gca,X,Y,[0 0.447 0.741],0.6); X:横坐标 Y:数

  • Matlab实现四种HSV色轮图绘制的示例代码

    前言 有粉丝问我图(d)上的色盘图咋画: 明度(V)渐变版 注意,此处是为了还原论文中图片所以X加了. % 生成网格 tList=linspace(0,2.*pi,300); rList=linspace(0,1,100); [theta,R]=meshgrid(tList,rList); % 角度及半径转换为坐标 X=cos(theta+pi).*R; Y=sin(theta).*R; Z=zeros(size(X)); % 构造hsv网格并转换为rgb网格 hsvMesh=cat(3,the

  • Matlab绘制雨云图的方法详解

    目录 介绍 横向雨云图 纵向雨云图 介绍 写了俩代码模板,用来绘制横向云雨图与纵向云雨图,云雨图其实就是用把小提琴图拆开来的模板,想获取小提琴图绘制函数的可以看这里:基于Matlab绘制小提琴图的示例代码 后面的俩模板用的时候只需要换换数据,颜色及每一类名称即可,雨云图绘制效果如下: 横向雨云图 function rainCloudsTMPL1 % @author: slandarer % 在这里放入你的数据============================================

  • Matlab实现三维投影绘制的示例代码

    目录 使用方法 三维曲面投影 三维曲线投影 三维参数曲线投影 三维参数曲面投影 混合类型三维绘图投影 工具函数完整代码 本期带来一个三维投影绘制函数(三视图绘制),函数支持三维曲线.曲面.三维多边形.参数方程曲线.参数方程曲面的投影绘制,以下先给出代码使用方式,文末给出工具函数完整代码: 使用方法 三维多边形投影及基本使用 通过介绍如何生成三维多边形投影介绍一下函数咋用,这里的三维多边形指的是使用patch或fill3创建的图形,假设我们绘制了如下一个复杂多边形构成的球: c = 1; d = 

  • Python实现绘制Matlab格式的地图边框的示例代码

    目录 1.Python绘制色斑图 2.Python绘制比例尺.指南针 3.Python绘制Matlab格式的地图边框 1.Python绘制色斑图 import matplotlib.pyplot as plt import numpy as np from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter import cartopy.crs as ccrs import cartopy.feature as cfea

  • Android中贝塞尔曲线的绘制方法示例代码

    贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线. 上面的介绍中,"线段像可伸缩的皮筋"这句话非常关键,但也特别好理解.至于贝塞尔曲线的详细内容大家可以查阅相关资料.        Android提供的贝塞尔曲线绘制接口 在Android开发中,要实现贝塞尔曲线其实还是很简单的,因为Android已经给我们提

  • 利用Matlab制作三子棋游戏的示例代码

    效果: 注: 由于用uifigure和uiaxes写的会比较慢,改成常规的axes和figure会快很多. 完整代码: function OX_chess fig=uifigure('units','pixels',... 'position',[350 100 500 500],... 'Numbertitle','off',... 'name','OX_chess',... 'Color',[1 1 1],... 'resize','off',... 'menubar','none'); a

  • Python&Matlab实现灰狼优化算法的示例代码

    目录 1 灰狼优化算法基本思想 2 灰狼捕食猎物过程 2.1 社会等级分层 2.2 包围猎物 2.3 狩猎 2.4 攻击猎物 2.5 寻找猎物 3 实现步骤及程序框图 3.1 步骤 3.2 程序框图 4 Python代码实现 5 Matlab实现 1 灰狼优化算法基本思想 灰狼优化算法是一种群智能优化算法,它的独特之处在于一小部分拥有绝对话语权的灰狼带领一群灰狼向猎物前进.在了解灰狼优化算法的特点之前,我们有必要了解灰狼群中的等级制度. 灰狼群一般分为4个等级:处于第一等级的灰狼用α表示,处于第

  • 基于Matlab实现嗅觉优化算法的示例代码

    目录 1.概述 2.37 个 CEC 基准测试函数代码 3.F1 Matlab代码仿真 1.概述 嗅觉剂优化是一种新颖的优化算法,旨在模仿气味分子源尾随的药剂的智能行为.该概念分为三个阶段(嗅探,尾随和随机)是独特且易于实现的.此上传包含 SAO 在 37 个 CEC 基准测试函数上的实现. 2.37 个 CEC 基准测试函数代码 function [lb,ub,dim,fobj] = Select_Function(F) switch F case 'F1' %Admijan fobj = @

  • 基于Matlab实现野狗优化算法的示例代码

    目录 1.概述 2.捕食过程的数学模型 2.1 种群初始化 2.2 群体攻击过程 2.3 迫害攻击过程 2.4 野狗的存活率 3.Matlab代码实现 3.1 代码 3.2 结果 1.概述 野狗优化算法(Dingo Optimization Algorithm, DOA)模仿澳大利亚野狗的社交行为.DOA算法的灵感来源于野狗的狩猎策略,即迫害攻击.分组策略和食腐行为.为了提高该方法的整体效率和性能,在DOA中制定了三种与四条规则相关联的搜索策略,这些策略和规则在搜索空间的强化(开发)和多样化(探

  • 基于Matlab实现鲸鱼优化算法的示例代码

    目录 1.鲸鱼优化算法建模 1.1 包围猎物 1.2 螺旋狩猎 1.3 搜索猎物 1.4 算法流程图 2.Matlab代码实现 2.1 结果 2.2 代码 1.鲸鱼优化算法建模 鲸鱼优化算法(WOA)是澳大利亚学者Mirjaili等于2016年提出的群体智能优化算法,根据座头鲸的捕猎行为实现优化搜索的目的.其中,每个鲸鱼可以看作一个粒子,每个粒子作为不同的决策变量.WOA的实现过程主要包括包围猎物.螺旋狩猎和随机搜索3个阶段,其数学模型如下: 1.1 包围猎物 1.2 螺旋狩猎 1.3 搜索猎物

  • Matlab实现黑洞优化算法的示例代码

    目录 前言 1.概述 1.1黑洞算法 1.2黑洞搜索优化算法 1.3黑洞搜索算法的实现过程 2.Matlab代码实现 2.1主函数 2.2目标函数 2.3黑洞优化算法 3.结果展现 前言 应用的领域很多. 1.概述 1.1黑洞算法 根据黑洞现象原理首次提出BH 算法,它在传统PSO基础上引入了新的机制,有效地提高了收敛速度并防止了陷入局部极值的情况发生;但是该方法却没有提及如何确定黑洞边界和如何处理吸收星体的问题. Hatamlou BH算法进行了完善,让其更加接近于黑洞的自然现状,使其具有黑洞

随机推荐