2017-03-27 59 views
1

我有一個2D矢量字段,我想對矢量字段進行顏色編碼,以便每個矢量方向以不同的顏色顯示。假設我的數據是DataX和DataY。目前,我做(在MATLAB):顏色編碼矢量字段

R = DataX.^2 + DataY.^2; 
theta1 = acos(DataX ./ R); 
theta2 = asin(DataY ./ R); 
surf(x,y,theta1); colormap jet; shading interp 
figure; surf(x,y,theta2); colormap jet; shading interp 

我遇到的問題是,我不能向量,其中x或y分量是零之間進行區分。例如,彩條的比例看起來像(左,使用arcsin,右使用arcos)。當使用arcsin時,當DataY爲零(水平向量)時,無論向量是向左還是向右,arcsin(0)都會給出0。

enter image description here

使用反正切或極座標arccotangent定義給予了應有的零個錯誤劃分,甚至更壞的結果。我正在尋找一種算法,可以讓我區分看似簡併的矢量。我嘗試過將arccos和arcsin結果結合起來,但是我一直沒能找到一個好的方法來做到這一點。

我也想知道如何將這個概念擴展到3D。

謝謝!

回答

1

對於2D,可以使用atan2(DataY,DataX)獲取角度,然後將角度映射到您的顏色。使用循環色表,如「hsv」

對於3D,可以將矢量歸一化爲單位長度,並將3個成分映射爲紅色,綠色和藍色。

+0

問題仍然存在。 DataX = 0,DataY = 1給出0的角度.DataX = 0,DataY = -1給出角度0. –

+0

編號atan2映射(0,1) - > 0,(1,0) - > pi/2, (0,-1) - > pi,( - 1,0) - > -pi/2 –

+0

我認爲這在數學上是真實的。但在計算上,0/1或0/-1將首先評估,給你零。那麼當我們做atan(0)時,無論y座標是什麼,我們都會得到0。我正在用MATLAB做。在另一種語言中它有什麼不同? –