6

我有一个双重问题:

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

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

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

4

2 回答 2

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

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

[t, p] = meshgrid(phi, theta);

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

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

现在我们在 3D 中定义了圆环,我们可以使用以下方法绘制它surf

surf(x, y, z)
axis equal

证明!

编辑:要解决您的第二个问题,这取决于您如何存储失真,但假设您在每个环形和极向点定义了一个矩阵,您只需将小半径的常数乘以失真。在下面,我创建了一个失真矩阵,它与我的环形和极向角坐标矩阵的维度相同,并且正态分布在平均值为 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)

结果是:

在此处输入图像描述

于 2012-05-18T16:09:36.023 回答
1

您可以这样做surf- 只需使用 x、y、z 坐标创建矩阵。您链接到的页面具有执行此操作的三角方程(它们正是您自己想出的 - 我在检查您的链接之前编写了下面的代码)。

R = 10;
a = 3;
tx=nan(41,21);
ty=nan(41,21);
tz=nan(41,21);
for j=1:21
  for i=1:41
    phi = (i-1)*2*pi/40;
    theta = (j-1)*2*pi/20;
    tx(i,j)= cos(phi) * (R+cos(theta)*a);
    ty(i,j)= sin(phi) * (R+cos(theta)*a);
    tz(i,j)= sin(theta)*a;
  end
end
figure
surf(tx,ty,tz)
axis equal

要扭曲表面,请将常数替换a为所需小半径值的矩阵,并索引到该矩阵 - 即tz(i,j) = sin(theta)*distortion(i,j)(但显然在所有维度上)。

于 2012-05-18T16:07:34.587 回答