2012-05-18 60 views
4

環形面我有一個問題是雙重的:可視化在Matlab

  1. 如何繪製在MATLAB環形表面,賦予了大半徑[R和短半徑一個?爲了避免混淆,我正在談論的是toroidal/poloidal coordinate system,如下圖所示。 Toroidal coordinate system

  2. 現在,在任何點(PHI,θ-)該表面上,該小半徑將由我已存儲在一個矩陣一些值扭曲。我如何繪製這個扭曲的曲面?這可能是容易,一旦我找到了答案,以第1部分,但是這是我的實際目標,因此任何解決方案,第1部分不能處理,這是非常對我沒用。

如果有人能告訴我如何使圖像顯得更小在這裏,請不要=)

回答

10

解決你的第一個問題:首先你需要定義環面座標(看起來很自然!),然後轉換爲笛卡爾座標,這就是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 

我們只想圓環的一個表面,所以小半徑是標量。我們現在做這些座標的二維網格:

[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爲0的FWHM的平均值。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

+0

+1矢量化這一切,它比我匆匆忙忙的循環更好。 – tmpearce

+0

這正是我所需要的。萬分感謝! –

+0

舊帖子,但我最近使用這個。在八度(我也假設Matlab)衝浪()採取第四個參數的顏色。我發現它幫助我突出瞭如果我稱爲surf(x,y,z,變形)的失真。 – Bovaz

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)(但在所有維度上,很明顯)。