在Matlab中可视化环形表面

时间:2012-05-18 15:23:23

标签: matlab 3d plot

我遇到了双重问题:

  1. 如果主半径 R 和小半径 a ,如何在MATLAB中绘制环形曲面?为了避免混淆,我正在谈论的是toroidal/poloidal coordinate system,如下图所示。 Toroidal coordinate system

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

  3. 如果有人可以告诉我如何让图片显得更小,请做=)

2 个答案:

答案 0 :(得分:11)

解决你的第一个问题:首先你需要在环形坐标中定义圆环的坐标(看起来很自然!)然后转换为笛卡尔坐标,这就是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

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

[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

Proof!

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

结果是:

enter image description here

答案 1 :(得分: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)(但显然在所有维度中)。