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