我遇到了双重问题:
如果主半径 R 和小半径 a ,如何在MATLAB中绘制环形曲面?为了避免混淆,我正在谈论的是toroidal/poloidal coordinate system,如下图所示。
现在,在此表面上的任何点(phi,theta)中,小半径将被我存储在矩阵中的某个值扭曲。如何绘制这个扭曲的表面?一旦得到第1部分的答案,这可能很容易,但这是我的实际目标,所以对第1部分无法解决的任何解决方案对我来说都是无用的。
如果有人可以告诉我如何让图片显得更小,请做=)
答案 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
编辑:要解决第二个问题,这取决于你如何存储失真,但是假设你在每个环形和极向点处定义了一个矩阵,你只需要将常数乘以失真是小半径。在下文中,我创建了一个与我的环形和极向角坐标矩阵尺寸相同的失真矩阵,它通常分布在平均值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)
结果是:
答案 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)
(但显然在所有维度中)。