Frage

Ich habe eine ziemlich einfache Frage für Sie .. Ich fühle mich wie vor der Antwort eine lange Zeit gefunden haben sollte, aber irgendwie kann ich einpacken nicht meinen Kopf um dieses triviale Problem.

ein Vektor v = (x, y) gegeben, würde Ich mag es wissen, ist ‚allgemeine‘ Orientierung. Das heißt entweder 'Up', 'Down', 'links' oder 'rechts'

A des Vektors allgemeine Ausrichtung ist ‚Up‘, wenn eine Ausrichtung des Vektor ist zwischen 45 und 135 Grad. ‚Links‘ ist zwischen 135 und 225 Grad. ‚Down‘ ist, zwischen 225 und 315 Grad. 'Recht' ist zwischen 315 und 45 Grad.

Ich weiß nicht wirklich für die Fälle, egal, wo der Winkel genau 45, 135, 225 oder 315 Grad.

Der Haken dabei ist, will ich nicht Trigonometrie verwenden. Ich bin mir ziemlich sicher, dass es eine einfache Lösung.

Ich denke, eine Lösung, die den ganzen Kreis in acht geteilt könnte. Hier ist, was ich habe so weit.

if(x > 0 && y > x)
    return Up
if(x > 0 && y > 0 && y < x )
    return Right

... etc ...

Im Grunde weiß ich, dass eine Lösung gefunden. Ich bin mehr daran interessiert, in Ihrem eigenen Ansatz für dieses Problem.

Danke!

Bearbeiten : Der verwendete Vektor nicht normiert ist. Sie können eine beliebige Vektor repräsentieren ein Paar Punkten. Einfach so tun, als der Ursprung des Vektors ist (0,0).

War es hilfreich?

Lösung

Es gibt einen Weg, in der Tat. Alles, was Sie erkennen müssen, ist, dass, wenn abs (y)> abs (x), dann ist die Richtung senkrecht ist, da sonst die Richtung horizontal ist. Wenn vertikale, wird das Zeichen auf y zeigt nach oben / unten, andernfalls wird das Zeichen auf x / rechts indicate links. Also:

if (abs(y) > abs(x)) {
  if (y > 0) up else down
} else {
  if (x > 0) right else left
}

Der 45ish Winkel wird immer links oder rechts gehen.

Andere Tipps

Ich weiß, Sie sagten, Sie trig vermeiden wollte, aber haben Sie schon einmal verwendet das atan2 Funktion? Es ist super einfach für die Bestimmung der Winkel eines Vektors zu verwenden:

double ldAngle = atan2(vector.y, vector.x) * 180 / PI;

einen normierten Vektorraum Unter der Annahme ( Edit: bedeutet Ihre Vektor Einheitsvektoren ), wie Sie zu tun scheinen, Ihr Ansatz ist vor Ort auf und die am häufigsten für die 2D-Spiele und Animationen verwendet. Ich würde Ihre Wahrheitstabelle überprüfen, aber.

@ Daniel Ansatz ist es, die mehr IMO elegant.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top