MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面_matlab surf 颜色-程序员宅基地

技术标签: surf函数使用  matlab surf函数错误  matlab坐标点绘制曲面  matlab三维着色曲面  plot3函数转surf函数  MATLAB  

来源

写论文,从二维变三维空间,对三维工作空间分析,希望创建漂亮的工作空间示意图。二维区域着色已经在之前博文提到过了:Matlab不规则区域渐变色填充及注意事项。这里主要讲三维曲面着色。

方法

实现绘制曲面的函数有不少,典型如下

函数 含义
mesh、surf 曲面图
meshc、surfc 下方带有等高线图的曲面图
meshz 带帷幕图(参考平面)的曲面图
pcolor 单一着色平面图(值仅与颜色成比例)
surfl 从指定方向照亮的曲面图
surface 用于创建曲面图形对象的低级函数(高级函数的基础)

函数plot3在此不考虑,因为它不是绘制曲面的函数。

具体可以参考官方帮助文档:将数据表示为曲面

我选择使用surf函数来绘图。

surf函数

surf(X,Y,Z) 创建一个三维曲面图。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。函数还对颜色数据使用 Z,因此颜色与高度成比例。

关键:这个函数的参数都是矩阵,如何将二维空间通过旋转得到三维空间,并是数据结构适合surf函数是我遇到的难点。换一句话就是,如何把plot3函数参数的数据应用到surf函数中。

实例

二维数据

在这里插入图片描述
上面图形是二维工作空间,现在将该图形中右侧下方橙黄色线沿着‘x=0’(z轴)旋转360°得到封闭的三维曲面。三维封闭空间可以使用相同的方式把其他边界线旋转得到。

解决方案

从二维图形中获取右侧下方一半橙黄色实现数据,即下方代码前两行数据,我将其转置是为了后面产生矩阵。绕z轴旋转,二维的X坐标就转换成三维的X与Y坐标,二者关系式一个圆的方程,这里使用参数方程进行转换。使用surf绘制可得

X_t=Pos_2D{1,2}';	% 二维X坐标
Z_t=Pos_2D{1,3}';    % 二维Z坐标
theta = linspace(0, 2*pi, length(X_t));			% 产生相同长度的向量
X = X_t*cos(theta);										% 产生三维X坐标矩阵
Y = X_t*sin(theta);										% 产生三维Y坐标矩阵
Z=Z_t*ones(1,length(Z_t));							% 产生三维Z坐标矩阵

surf(X,Y,Z,'EdgeColor', 'none')

在这里插入图片描述

其他方案

在生成二维坐标值的时候 内嵌一个循环直接生成三维坐标。不相关变量没有提供注释。这样也可以得到上面的三维着色曲面。

tt=1;
for i=1:length(epsilonWorkspace)
    phi_0 = EPSILON *2*bending_L(k)/d;
    phi(i)   = epsilonWorkspace(i)*2*bending_L(k)/d;
    curve_angle(i) = phi_0-phi(i);
    R(i) = bending_L(k)/curve_angle(i);

    X(i)=-1*R(i)+R(i)*cos(curve_angle(i)) ;			% 生成二维X坐标
    Z(i)=R(i)*sin(curve_angle(i));							% 生成二维Z坐标
    for p = 0 : pi/20 : 2*pi
        X_3D(tt) = X(i) * cos(tt);								% 生成三维X坐标
        Y_3D(tt) = X(i) * sin(tt);								% 生成三维Y坐标
        Z_3D(tt) = Z(i);											% 生成三维Z坐标
        tt = tt +1;
    end
end
%把上面的坐标向量转换成surf可以使用的矩阵
n = floor(nthroot(length(Z_3D),2));
X_3D((floor(nthroot(length(X_3D),2))^2+1):length(X_3D))=[];
Y_3D((floor(nthroot(length(Y_3D),2))^2+1):length(Y_3D))=[];
Z_3D((floor(nthroot(length(Z_3D),2))^2+1):length(Z_3D))=[];
XXX = reshape(X_3D,n,n)';
YYY = reshape(Y_3D,n,n)';
ZZZ = reshape(Z_3D,n,n)';
surf(XXX, YYY,ZZZ)

常见错误

surf报错

surf函数的输入参数都是矩阵

生成的图形是黑色

在这里插入图片描述
如果生成的曲面是上图黑色,这是因为之前的循环中间隔太小,然而默认surf会绘制曲线颜色导致,使用下面代码取消曲线颜色显示,结果如下:
在这里插入图片描述

生成曲面光滑

在这里插入图片描述
上图我人为是生成数据点时,点之间过渡不光滑导致,因为在其他方案中是 把二维XZ平面中的一个点处理成三维空间一个平面圆,然后处理下一个点。

参考资料

  1. Matlab不规则区域渐变色填充及注意事项
  2. 将数据表示为曲面
  3. 将数据表示为曲面
  4. 如何用Matlab快速画出带有3D渲染效果的复杂曲面
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jh1513/article/details/108617989

智能推荐

C语言 局部变量与全局变量的生存期_?局部变量的生存周期?-程序员宅基地

文章浏览阅读6.2k次。1.局部变量仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。2.局部变量的内存分配:通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部变量所在的函数被调用时,系统根据需要临时为其分配内存。当函数执行结束时,局部变量被撤销,占用内存被收回。注意:局部变量在函数被调用时由系统分配存储区,在不同的声明周期的函数中同名的变量实际上..._?局部变量的生存周期?

编译gstreamer for android_cebero gst for android-程序员宅基地

文章浏览阅读1k次。1.下载cerbero工程编译gstreamer可不是件容易事,一个是gst依赖了太多其他库,再一个是gst本身就有很多插件,这些插件分散在不同的工程里,相对来说ffmpeg就显得简单易用了不少,奈何项目里要用到gst,那就只能搞咯,幸运的是,github上有个开源项目,专为gst的交叉编译量身打造的,那就是cerbero项目。它只做两件事情,一个是配置编译环境,另一个是编译打包gst全部的相关工程,先从github上把它下下来git clone https://github.com/GStreamer_cebero gst for android

编译原理-自顶向下文法消除二义性和左递归_考虑文法、 e→e+t | tt→(e) | a(1) 消除文法中存在的左递归(2) 为(1)中得到-程序员宅基地

文章浏览阅读4.4k次,点赞9次,收藏23次。自顶向下文法消除二义性和左递归前言一、自顶向下文法二、自顶向下面临的问题1.二义性问题2.二义性问题解决方案3.左递归问题4.左递归问题解决方案5.回溯问题6.回溯问题解决方案总结前言语言是满足一定组成规则的句子集合,句子是满足一定组成规则的单词序列,单词则是满足一定组成规则的字符串。这些组成规则就是文法中的产生式。语法分析(syntax analysis)是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。无论是自顶向下还是自底向上,语法._考虑文法、 e→e+t | tt→(e) | a(1) 消除文法中存在的左递归(2) 为(1)中得到

Linux 中安装简洁的博客 Typecho_上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后-程序员宅基地

文章浏览阅读4.5k次。CentOS 7typecho 1.2我使用的虚拟机进行的安装,也希望练习学习的时候使用虚拟机进行练习。在这里插入代码片typecho 下载地址:http://typecho.org/download安装宝塔Linux面板引用:Typecho搭建个人博客教程可以使用 SSH 连接工具,根据系统执行框内命令开始安装(大约2分钟完成面板安装)Centos安装脚本:yum install -y wget && wget -O install.sh http://down._上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后

详解步进电机原理及其正反转驱动程序(51单片机)_步进电机a十a一b十b一正反转-程序员宅基地

文章浏览阅读3.3w次,点赞26次,收藏227次。一、步进电机简要原理1.步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。2.非超载时,电机转速、转过的角度取决于脉冲信号的频率和脉冲数。3.线性关系:给电机施加一个脉冲,电机转过一个步距角。二、步进电机驱动方式单极性 (unipolar) 和双极性 (bipolar) 是步进电机最常采用的两种驱动架构。1.单极性驱动电路使用四颗晶体管来驱动步进电机的两组相位,电机结构则如图1..._步进电机a十a一b十b一正反转

python学习记录5——Python中的数_python里面数字加减以后的结果是float还是int-程序员宅基地

文章浏览阅读98次。4、在Python中书写很大的数时可以使用下划线将其中的数字分组,使其更清晰易读,打印这种数时不会打印出其中的下划线。3、无论是哪种运算,只要有操作数是浮点数,Python默认得到的结果总是浮点数,即便结果原本为整数也是如此。2、Python中将任意两个数相除时,结果总是浮点数,即便这两个数都是整数且能整除。Python中常见的数包括整数和浮点数,下面记录一些特别的、反常识的应用法则。_python里面数字加减以后的结果是float还是int

随便推点

RMAN backup recovery area 命令-程序员宅基地

文章浏览阅读62次。一朋友问我一个问题: RMAN> BACKUP RECOVERY AREA; 这个命令备份哪些内容, 还真不太清楚。 Google了一下。 这个命令是备份Flash recovery Area的内容的。 这是也是Oracle 10g以后才有的。10g引进了flash recovery area,同时在rman备份中支持对该区域的备份。 在9i中oracle引入flashb..._backup recovery area force

【python】启动一个公司级项目的完整报错和解决方案-程序员宅基地

文章浏览阅读224次,点赞5次,收藏2次。启动一个项目对于新手都是不容易的事情。

while循环与getchar()_while(q=getchar()!='.')-程序员宅基地

文章浏览阅读1.3k次。#include <stdio.h>int main(){ int i =0; while(char ch = getchar()!='\n')//这句循环执行getchar语句,会依次读取键盘录入到缓冲区的字符,直到回车键结束符 { i++; printf("%d\n",i); } return 0;}_while(q=getchar()!='.')

caffe如何自定义网络以及自定义层(python)(五)_param_str_ caffe-程序员宅基地

文章浏览阅读4.3k次。前面铺垫了这么多,终于到主题了。_param_str_ caffe

Win10上安装Keras 和 TensorFlow(GPU版本)-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏17次。一. 安装环境Windows 10 64bit 家庭版GPU: GeForce GTX1070Python: 3.5CUDA: CUDA Toolkit 8.0 GA1 (Sept 2016)cuDNN: cuDNN v6.0 Library for Windows 10【注意】(1)这里值得一提的是,Python,CUDA,cuDNN之间的版本要严格匹配,不匹配安装会出错。..._win10 tensorflowgpu keras 对应版本

year 和 weak year 的区别-程序员宅基地

文章浏览阅读864次。java 中使用 SimpleDateFormat 时,会遇到 year 和 week year 这两个概念,特此记录。google 答案:A week year is in sync with a WEEK_OF_YEAR cycle. All weeks between the first and last weeks (inclusive) have the same week year..._week year 和 year

推荐文章

热门文章

相关标签