在Matlab中可视化环形表面

Tom*_*han 6 3d matlab plot

我有一个双重问题:

  1. 在给定主半径R和小半径a的情况下,如何在MATLAB中绘制环形曲面?为了避免混淆,我正在谈论的是环形/极向坐标系,如下图所示.环形坐​​标系

  2. 现在,在这个表面上的任何点(phi,theta),小半径将被我存储在矩阵中的某个值扭曲.如何绘制这个扭曲的表面?一旦我得到第1部分的答案,这可能很容易,但这是我的实际目标,因此对于第1部分无法解决这个问题的任何解决方案对我来说都是无用的.

如果有人可以告诉我如何使图像在这里显得更小,请做=)

Chr*_*ris 12

解决你的第一个问题:首先你需要在环形坐标中定义环面的坐标(看起来很自然!)然后转换为笛卡尔坐标,这就是MATLAB期望构建所有绘图的方式(除非你制作极坐标图,当然).所以我们从定义环形坐标开始:

aminor = 1.; % Torus minor radius
Rmajor = 3.; % Torus major radius

theta  = linspace(-pi, pi, 64)   ; % Poloidal angle
phi    = linspace(0., 2.*pi, 64) ; % Toroidal angle
Run Code Online (Sandbox Code Playgroud)

我们只想要一个圆环面,所以小半径是一个标量.我们现在制作这些坐标的2D网格:

[t, p] = meshgrid(phi, theta);
Run Code Online (Sandbox Code Playgroud)

并使用在问题中链接的维基百科页面上给出的公式转换为3D笛卡尔坐标:

x = (Rmajor + aminor.*cos(p)) .* cos(t);
y = (Rmajor + aminor.*cos(p)) .* sin(t);
z = aminor.*sin(p);
Run Code Online (Sandbox Code Playgroud)

现在我们将我们的圆环定义为3D,我们可以使用surf以下方式绘制它:

surf(x, y, z)
axis equal
Run Code Online (Sandbox Code Playgroud)

证明!

编辑:要解决第二个问题,这取决于你如何存储失真,但是假设你在每个环形和极向点处定义了一个矩阵,你只需要通过失真乘以小半径的常数.在下文中,我创建了一个与我的环形和极向角坐标矩阵尺寸相同的失真矩阵,它通常分布在平均值1,FWHM为0.1:

distortion = 1. + 0.1 * randn(64, 64);

x = (Rmajor + aminor .* distortion .*cos(p)) .* cos(t);
y = (Rmajor + aminor .* distortion .* cos(p)) .* sin(t);
z = aminor.* distortion .* sin(p);

surf(x, y, z)
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述