2010-08-29 11 views
6

Per il gioco basato su tile, ho bisogno di calcolare la direzione in base a un dato offset di punto (differenza tra due punti). Ad esempio, diciamo che sono al punto (10, 4) e voglio passare al punto (8, 6). La direzione in cui mi muovo è nord-ovest. Quale sarebbe il modo migliore per calcolare questo?Calcolo della direzione in base agli offset di punto

Ecco l'implementazione di base in Java.

public int direction(int x, int y) { 
    if (x > 0) { 
     if (y > 0) { 
      return 0; // NE 
     } else if (y < 0) { 
      return 1; // SE 
     } else { 
      return 2; // E 
     } 
    } else if (x < 0) { 
     if (y > 0) { 
      return 3; // NW 
     } else if (y < 0) { 
      return 4; // SW 
     } else { 
      return 5; // W 
     } 
    } else { 
     if (y > 0) { 
      return 6; // N 
     } else if (y < 0) { 
      return 7; // S 
     } else { 
      return -1; 
     } 
    } 
} 

Sicuramente può essere ottimizzato o ridotto. Qualsiasi aiuto? Grazie.

+0

Compilare anche questo? Non restituisce un valore quando x e y sono entrambi 0. –

+0

Sembra buono così com'è (modulo mancante 'else' trovato da Matti). Si potrebbe trarre un fattore di "ritorno", ma in genere è l'ottimizzazione che potrebbe non essere quella a livello di bytecode, e quella che il compilatore dovrebbe essere in grado di fare comunque per te. Potresti calcolare il calcolo delle condizioni 'y <0' and 'y> 0', ma ancora una volta, un compilatore decente dovrebbe essere in grado di farlo per te. Puoi cambiare la rappresentazione di che direzione è (ad es.una coppia di numeri ogni -1, 0 o 1 per l'asse N/S e l'asse W/E) per rendere questo metodo più semplice, ma non sembra necessario. –

+0

@Matti Virkkunen Ah hai ragione (cambiato). Copia-incolla fallita ... – someguy

risposta

4

Penso che il modo più semplice per capire sarebbe creare un array statico che contenga i valori per tutti i casi.

// Won't say anything about how much these values make sense 
static final int[][] directions = { 
    {3, 6, 0}, 
    {5, -1, 2}, // -1 for "no direction", feel free to replace 
    {4, 7, 1} 
}; 

public int direction(int x, int y) { 
    x = (x < 0) ? 0 : ((x > 0) ? 2 : 1); 
    y = (y < 0) ? 0 : ((y > 0) ? 2 : 1); 

    return directions[y][x]; 
} 

Edit:Ora è corretto (il motivo per cui sono così tante lingue mancanti una vera e propria funzione di sgn?)

+0

quasi corretta. ma xey può essere> 1 o <-1 – mhshams

+0

@mohammad shamsi Per quale input 'Math.sgn' restituisce un valore diverso da -1, 0 o 1? –

+0

@Pascal: ho dimenticato di usare 'sgn' all'inizio, che è probabilmente quello che ha spinto il suo commento. E poi ho scoperto che Java non sembra nemmeno avere 'sgn' per i numeri interi. Meh. –

0
  • definire una matrice 2D per contenere tutti gli stati.

  • convertito xey 0, 1 o 2 in base al loro valore (x> 0 o x < 0 o x == 0)

  • ritorno indice specifico dell'array.

0

Questo è il più breve e pulito possibile, se si rappresentano le otto direzioni cardinali in questo modo, come valori enumerati separati. Stai scegliendo tra otto distinti valori di ritorno, quindi un albero decisionale con otto foglie è il meglio che puoi fare.

Si potrebbe ottenere qualcosa di un po 'più ordinato, se si direzione diviso in due componenti (N-S ed E-W), ma senza sapere di più su ciò che si fai con la direzione, non possiamo sapere se questo è vale la pena.

0

È possibile ricevere e restituire la direzione come Punto o qualcosa di simile (ad ogni modo, una tupla (x, y)). Quindi, se siete in piedi in p0 = (10, 4) e si vuole passare a p1 = (8, 6), il risultato sarebbe (in pseudocodice):

norm(p1 - p0) = norm((-2,2)) = (-1,1) 

è possibile calcolare la norma di un intero se lo dividi per il suo valore assoluto. Quindi per un punto calcoli la norma di entrambi i membri. Ricorda che (-1,1) è più espressivo di 3 e puoi operare in modo più semplice con esso.

Se sono necessarie operazioni specifiche, è possibile creare la propria classe Java Point o estendere quelle esistenti nella libreria.

1

Le mie risposte con condizioni if ​​:).

public int direction(int x, int y) { 
     //0 NE, 1 SE, 2 E, 3 NW, 4 SW, 5 W, 6 N, 7 S, 8 (Same place/Not a direction) 
     int direction = 0; 

     if(x < 0){ 
      direction = 3; 
     }else if(x == 0){ 
      direction = 6; 
     } 

     if(y < 0){ 
      direction = direction + 1; 
     }else if(y == 0){ 
      direction = direction + 2; 
     } 
      return direction; 
    } 
Problemi correlati