MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面

目录

  • 来源
  • 方法
    • surf函数
  • 实例
    • 二维数据
    • 解决方案
    • 其他方案
    • 常见错误
      • surf报错
      • 生成的图形是黑色
      • 生成曲面光滑
  • 参考资料

来源

写论文,从二维变三维空间,对三维工作空间分析,希望创建漂亮的工作空间示意图。二维区域着色已经在之前博文提到过了: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函数中。

实例

二维数据

MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面_第1张图片
上面图形是二维工作空间,现在将该图形中右侧下方橙黄色线沿着‘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')

MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面_第2张图片

其他方案

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

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函数的输入参数都是矩阵

生成的图形是黑色

MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面_第3张图片
如果生成的曲面是上图黑色,这是因为之前的循环中间隔太小,然而默认surf会绘制曲线颜色导致,使用下面代码取消曲线颜色显示,结果如下:
MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面_第4张图片

生成曲面光滑

MATLAB三维着色曲面surf及如何使用三维点集绘制三维曲面_第5张图片
上图我人为是生成数据点时,点之间过渡不光滑导致,因为在其他方案中是 把二维XZ平面中的一个点处理成三维空间一个平面圆,然后处理下一个点。

参考资料

  1. Matlab不规则区域渐变色填充及注意事项
  2. 将数据表示为曲面
  3. 将数据表示为曲面
  4. 如何用Matlab快速画出带有3D渲染效果的复杂曲面

你可能感兴趣的:(MATLAB,matlab三维着色曲面,matlab,surf函数错误,surf函数使用,plot3函数转surf函数,matlab坐标点绘制曲面)