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.
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!
Das Problem bleibt bestehen. DataX = 0, DataY = 1 ergibt Winkel von 0. DataX = 0, DataY = -1 ergibt Winkel von 0. –
Nr. Atan2 Karten (0,1) -> 0, (1,0) -> pi/2, (0, -1) -> pi, (-1,0) -> -pi/2 –
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? –