2017-03-27 1 views
1

Ich habe ein 2D-Vektorfeld, und ich möchte das Vektorfeld farbcodieren, so dass jede Vektorrichtung in einer anderen Farbe angezeigt wird. Angenommen, meine Daten sind DataX und DataY. Derzeit mache ich (in MATLAB):Farbcodierung eines Vektorfelds

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 

Das Problem, das ich habe ist, dass ich nicht zwischen den Vektoren, wo entweder die X- oder Y-Komponente Null unterscheiden kann. Zum Beispiel sieht die Farbbalkenskala wie folgt aus (links mit arcsin und rechts mit arcos). Wenn arcsin verwendet wird, wenn DatenY gleich Null ist (horizontaler Vektor), gibt arcsin (0) 0, unabhängig davon, ob der Vektor nach links oder rechts zeigt.

enter image description here

Verwendung des Arkustangens oder arccotangent Definitionen von Polarkoordinaten gibt sogar schlechtere Ergebnisse aufgrund von Null-Fehler teilen. Ich suche nach einem Algorithmus, mit dem ich zwischen den scheinbar degenerierten Vektoren unterscheiden kann. Ich habe versucht, die arccos- und arcsin-Ergebnisse zu kombinieren, aber ich war nicht in der Lage, einen guten Weg zu finden.

Ich frage mich auch, wie dieses Konzept auf 3D erweitert werden kann.

Danke!

Antwort

1

Für 2D können Sie atan2 (DataY, DataX) verwenden, um einen Winkel zu erhalten, und den Winkel dann Ihrer Farbe zuordnen. Verwenden Sie eine zyklische Farbtabelle wie 'hsv'

Für 3D können Sie den Vektor auf Einheitslänge normalisieren und die 3 Komponenten auf rot, grün und blau zuordnen.

+0

Das Problem bleibt bestehen. DataX = 0, DataY = 1 ergibt Winkel von 0. DataX = 0, DataY = -1 ergibt Winkel von 0. –

+0

Nr. Atan2 Karten (0,1) -> 0, (1,0) -> pi/2, (0, -1) -> pi, (-1,0) -> -pi/2 –

+0

Ich denke das ist mathematisch wahr. Aber rechnerisch wird das 0/1 oder 0/-1 zuerst ausgewertet, was zu Null führt. Dann, wenn wir atan (0) tun, erhalten wir 0 unabhängig davon, was die y-Koordinate ist. Ich mache es in MATLAB. Ist es anders in einer anderen Sprache? –

Verwandte Themen