2017-03-27 8 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

まだ問題は残ります。データX = 0、データY = 0の場合、角度0を与える。データX = 0の場合、データY = -1は0の角度を与える。 –

+0

番号atan2は(0,1)→0、(1,0)→pi/(0、-1) - > pi、(-1,0) - > -pi/2 –

+0

私はそれが数学的に正しいと思います。しかし、計算上、0/1または0/-1が最初に評価され、ゼロが与えられます。そしてatan(0)を実行すると、y座標が何であるかにかかわらず0が得られます。私はMATLABでやっています。別の言語で違うの? –