我有一个双重问题:
给定大半径R和小半径a,如何在 MATLAB 中绘制环形曲面?为避免混淆,我说的是环形/极向坐标系,如下图所示。
现在,在这个表面上的任何点(phi,theta),小半径都会被我存储在矩阵中的某个值扭曲。如何绘制这个扭曲的表面?一旦我得到了第 1 部分的答案,这可能很容易,但这是我的实际目标,因此任何无法处理第 1 部分的解决方案对我来说都是毫无用处的。
如果有人可以告诉我如何使图像在这里显得更小,请执行 =)
解决您的第一个问题:首先您需要在环形坐标中定义圆环的坐标(看起来很自然!),然后转换为笛卡尔坐标,这是 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)
结果是:
您可以这样做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)
(但显然在所有维度上)。