2016-01-29 238 views
0

MATLAB的surf命令允許您將可選的XY數據傳遞給指定非笛卡爾x-y分量的數據。 (它們實質上改變了基本向量)。我希望將類似的論點傳遞給一個會畫出一條線的函數。在MATLAB中用非笛卡爾座標繪製一條線

如何繪製使用非笛卡爾座標系的直線?

如果我的術語稍微偏離,我很抱歉。這在技術上仍然可能是笛卡爾空間,但從x方向上的一個單位與y方向上的一個單位正交的意義上講,它不是平方。如果你能糾正我的術語,我會非常感激!

編輯:

下面更好地展示我的意思:

的命令:

datA=1:10; 
datB=1:10; 
X=cosd(8*datA)'*datB; 
Y=datA'*log10(datB*3); 
Z=ones(size(datA'))*cosd(datB); 
XX=X./(1+Z); 
YY=Y./(1+Z); 
surf(XX,YY,eye(10)); view([0 0 1]) 

產生如下圖:

Non-Cartesian Surf

這裏,X和Y尺寸不正交也不等於I-隔開。 x中的一個單位可以對應x方向5釐米,但x中的下一個單位可以對應x方向2釐米+ y方向1釐米。 我希望複製這一功能,但畫一條線,而不是一個衝浪。例如,我在尋找其中的函數:

straightLine=[(1:10)' (1:10)']; 
my_line(XX,YY,straightLine(:,1),straightLine(:,2)) 

會產生追溯到上衝浪圖中的紅色正方形的線。

+0

我不知道我知道你的意思。 'plot'的座標,很像'surf',必須在笛卡兒座標系中給出。但是,您可以*參數化*您的數據,以獲得'x'和'y'作爲您自己的非笛卡爾座標的函數。我的意思是'phi = linspace(0,2 * pi,50); R = COS(PHI)^ 2。 X = R * cos(PHI); Y = R * SIN(PHI);積(X,Y)'。這應該是像「polar(theta,r)」那樣的東西。免責聲明:我意識到極座標系是局部正交的,但我希望你明白我的觀點。因此,只要您知道從您的自定義座標系到笛卡爾座標系的轉換,您應該沒問題 –

+0

您是否可能在尋找[等軸投影](https://en.wikipedia.org/wiki/Isometric_projection)之類的東西? – beaker

+0

@beaker,這可能工作,但我不是從3D投影到2D。 – chessofnerd

回答

1

我米仍然不能確定你的輸入數據是什麼,以及你想要繪製什麼。但是,從如何你想繪製它,我可以幫助。

當你調用

surf(XX,YY,eye(10)); view([0 0 1]); 

,並希望得到只有「紅色部分」,即函數的最大值,你基本上是選擇使用對角矩陣作爲指標XXYY矩陣的子集。所以,你可以手動選擇這些點,並使用plot繪製它們作爲行:

Xplot = diag(XX); 
Yplot = diag(YY); 
plot(Xplot,Yplot,'r.-'); 

diag(XX)呼叫將採取矩陣XX,這也正是你會得到的紅色斑塊的對角線元素當您根據eye()使用surfz數據時。

結果:

result from plot


此外,如果你只是試圖做你的榜樣狀態,那麼就沒有必要使用矩陣只是最終拿出的對角線。這是同樣的結果,使用的elementwise操作您的輸入向量:

datA = 1:10; 
datB = 1:10; 
X2 = cosd(8*datA).*datB; 
Y2 = datA.*log10(datB*3); 
Z2 = cosd(datB); 
XX2 = X2./(1+Z2); 
YY2 = Y2./(1+Z2); 
plot(Xplot,Yplot,'rs-',XX2,YY2,'bo--','linewidth',2,'markersize',10); 
legend('original','vector') 

結果: new result

+1

這工作完美。謝謝你幫我解決這個問題。 – chessofnerd

0

Matlab有很多內置函數來幫助你。

在2D做到這一點,最簡單的方法是polar,可讓您使用thetarho載體,使圖表:

theta = linspace(0,2*pi,100); 
r = sin(2*theta); 
figure(1) 
polar(theta, r), grid on 

所以,你會得到this. 也有pol2cart功能將轉換您的數據到xy格式:

[x,y] = pol2cart(theta,r); 
figure(2) 
plot(x, y), grid on 

這看上去稍微different 然後,如果我們將其擴展到3D,則只剩下plot3。所以,如果有像數據:

theta = linspace(0,10*pi,500); 
r = ones(size(theta)); 
z = linspace(-10,10,500); 

需要使用pol2cart與3個參數,以產生this: [X,Y,Z] = pol2cart(THETA,R,Z); 圖(3) plot3(X,Y,Z),在

最後格,如果你有球的數據,你有sph2cart

theta = linspace(0,2*pi,100); 
phi = linspace(-pi/2,pi/2,100); 
rho = sin(2*theta - phi); 
[x,y,z] = sph2cart(theta, phi, rho); 
figure(4) 
plot3(x,y,z),grid on 
view([-150 70]) 

這看起來this way

+0

感謝您的答案,但我沒有極性或球形數據。 (但是我試圖做些什麼,這可能會工作) – chessofnerd

+0

@AndrasDeak的評論是非常有用的,因爲它適用於任何座標系統。我還建議你提供一些樣本數據。這將有助於社區更好地理解你的問題。 – brainkz