【问题标题】:How can I convert from cylindrical to cartesian coordinates in 3D for plotting in Matlab?如何在 3D 中将圆柱坐标转换为笛卡尔坐标以便在 Matlab 中绘图?
【发布时间】:2021-03-15 18:14:39
【问题描述】:

我正在尝试在 Matlab 中的 3D cylindrical coorindates 中定义一个函数,然后将其转换为 3D 笛卡尔以进行绘图。

例如,如果我的函数仅依赖于径向坐标 r(为简单起见,假设为线性),我可以在 f = 70 处绘制一个 3D 等值面,如下所示:

x = linspace(-10,10,100);
y = linspace(-10,10,100);
z = linspace(-2,2,100);

[X,Y,Z] = meshgrid(x,y,z);
R = sqrt( X.^2 + Y.^2 ); % Calculate the radius for each [x,y] coordinate pair

f = 100*R; % Calculate the function f, dependent only on the radius

isosurface(X,Y,Z,f,70);

但是,由于该函数仅依赖于 r,因此我应该能够只为 r 坐标定义一个向量,并据此计算 f:

r = 0:0.1:1 ;   % define radial coordinate
f = 100*r ;     % make the function linearly dependent on radial coorindate for simplicity

我现在的目标是仅基于知道 r 和 f 来绘制等值面。我想指定一个 z 和 theta 坐标的向量,可能是这样的

z = linspace(-2,2,100);
theta = linspace(0,2*pi,50);

并将它们与 r 一起使用来生成 [x,y,z] 坐标。另外,f 现在是一维数组,而不是像第一个示例那样是 3D 数组,所以 f 需要以某种方式重新整形?

这是因为我试图在循环内多次对 f 进行操作,而在第一种情况下,这会导致对 3D 矩阵进行许多操作,这太慢了。我想改为对 1D 矢量执行操作,并生成仅用于绘图的 3D 版本。

我希望我的问题很清楚。我不认为 pol2cart 函数可以满足我的要求,但我可能是错的。

【问题讨论】:

    标签: arrays matlab plot coordinates reshape


    【解决方案1】:

    表示 4D 数据是一项相当困难的任务。您提到您想使用 isosurface 函数可视化 4D 数据。另一种选择是使用色标表示第 4 个变量,使用 slice 函数。

    这些函数的问题在于它们适用于笛卡尔坐标 [X,Y,Z]。 在使用函数表示这些 4D 数据之前,您需要将数据插入到笛卡尔坐标中的域中,如 herehere

    基本上,你最终得到的是:

    % generate mesh in cylindrical coordinates
    theta = linspace(0,2*pi,50);
    r = 0:0.1:1;
    z = linspace(-2,2,100);
    
    [Theta,R,Z] = meshgrid(theta,r,z);
    
    % Evaluate function in cylindrical coordinates
    f = 100*r; % f is function only of radial coordinate
    f = f'; % make sure f is column vector
    f = repmat(f,1,length(theta),length(z)); % f must be 3D matrix to plot surface
    
    % transform to cartesian coordinates
    [X,Y,Z] = pol2cart(Theta,R,Z)
    
    [xg, yg, zg] = meshgrid(linspace(-1,1,20),linspace(-1,1,20),linspace(-2.1,2.1,20));
    
    Px = squeeze(X);
    Py = squeeze(Y);
    Pz = squeeze(Z);
    v = squeeze(f);
    F = scatteredInterpolant([Px(:) Py(:) Pz(:)],v(:),'linear','nearest');
    
    f_interp = F(xg,yg,zg);
    

    现在您可以使用任何您想要可视化 4D 数据的函数:

    isosurface(xg,yg,zg,f_interp,70);
    

    您可以使用scatteredinterpolant 函数或griddata 函数对您的数据进行插值,只要最适合您。

    【讨论】:

    • 感谢您的回答。但是,您仍然使用 R 作为 3D 矩阵来评估函数。但是,我想在第二个示例中评估低维数组上的函数(这是因为在我的真实代码中,函数评估的计算量很大)。你能提供一个在一维数组上计算 f 的例子吗?
    • 只需评估 r 数组上的函数,然后 repmat 计算结果以创建 3D 数组。检查我的更新。
    • 嗨@Thales,代码没有运行。尝试执行等值面时出现错误“X 的大小必须与 V 的大小或 V 的列数匹配”。 f_interp 为 20x20x20,但 X、Y 和 Z 为 11x50x100。
    • 对不起,我的错误。您应该等值面变量xgygzg - 您用来插值数据的变量。我编辑了答案
    • 谢谢 - 我想我希望有一种方法可以在没有插值的情况下做到这一点,但你的回答让我清楚地看到它似乎没有。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多