MATLAB-二维曲线绕轴旋转成三维曲面
前言
目前搜索到的很多都是关于已知函数表达式做变换进行三维旋转,或者使用cylinder函数进行旋转。但是,对于由离散点构成的曲线,我们未知其表达式,使用cylinder函数总是不能达到自己想要的效果。以下记录我的相关学习过程。
一、代码如下
1.matlab代码
代码如下:其中备注见注释和后续文字。
clear;
file1 = load('C:\XXX.txt'); %选择路径读取txt文件
% txt文件有两列数据,一列为横坐标数据,一列为纵坐标数据
x = file1(:,1);
y = file1(:,2);
plot(x,y);
% 目标为绕纵轴旋转二维曲线形成三维曲面
n = 500; % 饶轴一圈的采样点数,!注意点1!
theta = (0:n)/n*2*pi; % i/n * 2π
XsinX = sin(theta); %因为存在小数点,最后一项应该是0,但其实只是接近零,e-16
XsinX(n+1) = 0; %这一项其实不太影响,因为最后结果是非常接近0的
% !注意点2!XX、YY每一列的元素都是原本的横坐标乘递增的sin(theta),所以ZZ的每一行也应是原本的纵坐标
XX = x .* cos(theta); % 对于这个新矩阵,某行某列的元素其实对应了一个x*cos
YY = x .* XsinX; % 同理,YY矩阵对应元素为x*sin,那么这个元素对应的三维z就是原本横坐标x对应的纵坐标y
ZZ = y .* ones(1,n+1);
% !注意点3!
boqian = mesh(XX,YY,ZZ,'FaceAlpha',1);
boqian.FaceColor = 'flat';
hidden on
colorbar;
2.结果
(1)二维曲线
(2)旋转形成的三维曲面
3.相关解释
- 注意点1:
n为绕轴一圈的采样点数。这里的曲线绕轴一周并不真的指旋转一周形成光滑曲面,实际上,这个三维曲面是由线面连接而成的,当采样点n越多,显示的三维曲面越光滑。
下图是n=5时的结果(我将透明度改为0.5,方便查看):
可以很明显发现,这个三维面由折线连接起来。
- 注意点2:
可以注意到,我的二维曲线所用到的离散点坐标均为列矩阵(m行),当横坐标x与theta(行矩阵,n列)相乘时,会产生一个m行n列的矩阵,其中每一行都对应着原本的横坐标,只是随着sin或cos的值递增或递减。也即,三维坐标的XX和YY的元素所在的行数就决定了它对应的三维ZZ坐标,所以ZZ才会是二维纵坐标y乘ones矩阵。
所以,你需要注意你自己的矩阵是何种形式。
- 注意点3:
这里主要是如何让画出的曲面更加美观:
- facealpha决定了透明度
- facecolor = ‘flat’ 可以让平面上色
- hidden决定是否显示隐藏线
以上这些都可以用help函数搜索查看其详细信息。