Domanda

Ho una domanda piuttosto semplice per te .. Sento che avrei dovuto trovare la risposta molto tempo fa, ma in qualche modo non posso avvolgere la testa attorno a questo banale problema.

Dato un vettore v = (x, y), vorrei sapere che è un orientamento 'generale'. Questo è "Su", "Giù", "Sinistra" o "Destra"

L'orientamento generale di un vettore è 'Su' se l'orientamento di un vettore è compreso tra 45 e 135 gradi. 'Sinistra' è tra 135 e 225 gradi. 'Giù' è tra 225 e 315 gradi. "Giusto" è compreso tra 315 e 45 gradi.

Non mi interessa davvero i casi in cui l'angolo è esattamente 45, 135, 225 o 315 gradi.

Il problema è che non voglio usare la trigonometria. Sono abbastanza sicuro che ci sia una soluzione semplice.

Penso che una soluzione potrebbe dividere l'intero cerchio in otto. Ecco quello che ho finora.

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

... etc ...

Fondamentalmente, so di poter trovare una soluzione. Sono più interessato al tuo approccio a questo problema.

Grazie!

MODIFICA : il vettore utilizzato non è normalizzato. Puoi rappresentare qualsiasi vettore usando una coppia di punti. Fingi semplicemente che l'origine del vettore sia (0,0).

È stato utile?

Soluzione

C'è un modo, davvero. Tutto quello che devi capire è che se abs (y) > abs (x), quindi la direzione è verticale, altrimenti la direzione è orizzontale. Se verticale, il segno su y indicherà su / giù, altrimenti il ??segno su x indicherà sinistra / destra. Quindi:

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

Gli angoli 45ish andranno sempre a sinistra o a destra.

Altri suggerimenti

So che hai detto che volevi evitare i trigoni, ma hai mai usato il atan2 funzione? È super facile da usare per determinare l'angolo di un vettore:

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

Supponendo uno spazio vettoriale normalizzato ( Modifica: significa che il tuo vettore è composto da unità vettori ) come sembra che stiate facendo, il vostro approccio è perfetto e quello più spesso usato per i giochi e le animazioni 2D. Verificherei comunque la tua tabella di verità.

L'approccio di Daniel è l'IMO più elegante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top