6

私は2つの問題を抱えています:

  1. 主半径Rと副半径aを指定して、MATLAB でトロイダル面をプロットするにはどうすればよいですか? 混乱を避けるために、私が話しているのは、下の図に示されているトロイダル/ポロイダル座標系です。トロイダル座標系

  2. ここで、このサーフェス上の任意の点(ファイ、シータ)で、行列に保存した値によって小半径が歪められます。この歪んだサーフェスをプロットするにはどうすればよいですか? パート 1 の答えが分かれば、これは簡単かもしれませんが、これが私の実際の目標なので、これを処理できないパート 1 の解決策は、私にとってはまったく役に立ちません。

ここで画像を小さく表示する方法を誰かに教えてもらえたら、してください =)

4

2 に答える 2

12

最初の質問への対処: まず、トーラスの座標をトロイダル座標で定義する必要があります (自然に思えます!)。次に、デカルト座標に変換します。これは、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

トーラスの 1 つの面だけが必要なので、短半径はスカラーです。これらの座標の 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

証拠!

編集:2番目の質問に対処するには、歪みをどのように保存するかによって異なりますが、各トロイダルポイントとポロイダルポイントで定義された行列があるとします。マイナー半径である定数に歪みを掛けるだけです。以下では、トロイダルおよびポロイダル角度座標行列と同じ次元であり、FWHM 0.1 で平均 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)

その結果は次のとおりです。

ここに画像の説明を入力

于 2012-05-18T16:09:36.023 に答える
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)(もちろん、すべての次元で)。

于 2012-05-18T16:07:34.587 に答える