我有一个双重的问题:

  • 在给定长半径R和短半径a的情况下,如何在MATLAB中绘制环形曲面?为避免混淆,我正在谈论的是下图所示的toroidal/poloidal coordinate system
  • 现在,在此表面上的任何点(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
    

    我们只需要一个圆环的表面,所以次半径是一个标量。现在,我们对这些坐标进行2D网格划分:
    [t, p] = meshgrid(phi, theta);
    

    并使用问题中链接到的Wikipedia页面上给出的公式转换为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)
    

    其结果是:

    10-01 15:52