Come convertire le coordinate del mouse in indici isometrici?


21

Traccio mappa isometrica con tessera 64x32 :

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

Immagine che illustra questo codice:

Immagine che illustra questo codice:

Cari professionisti, per favore, aiutate con una formula di trasformazione delle coordinate del mouse in indici isometrici di una cella. Esempio: (105; 100) -> [1; 4].



Nota a margine: se in realtà non vuoi accedere al valore precedente di una variabile che stai incrementando, come in while(val = arr[i++])costruzioni simili o simili, non usarlo . Usa ++ae ++binvece.
Martin Sojka,

Risposte:


25

È necessario determinare la matrice di trasformazione dalle coordinate dello spazio delle tessere alle coordinate dello spazio dello schermo, quindi calcolare la matrice inversa per questo, che quando applicata alle coordinate dello spazio dello schermo le trasforma in coordinate dello spazio delle piastrelle.

A proposito: il tuo offset in realtà punta a un posto che sarebbe (0.0, 1.0) in qualsiasi sistema di coordinate sano, ma questo non è un grosso problema, solo qualcosa da tenere a mente. Ciò significa che l'offset dell'origine del sistema di coordinate trasformato è su (Offset + 32, 0).


Caso specifico

Quello che stai fondamentalmente facendo per trasformare le coordinate spazio-piastrella (a, b) in coordinate spazio-schermo (x, y) è eseguirlo attraverso la seguente matrice di trasformazione:

inserisci qui la descrizione dell'immagine

Definizioni: un e b per la piastrella (0, 0) sono nell'intervallo [0.0, 1.0) con (0.0, 0.0) è l'angolo superiore, (1.0, 1.0) in basso, (0.0, 1.0) l'angolo sinistro e (1.0, 0.0) l'angolo destro nello spazio dello schermo.

Estendiamo le definizioni delle coordinate di una terza coordinata costante (è sempre esattamente 1) per essere in grado di incorporare la traduzione nella matrice.

Ora puoi creare la matrice inversa per questa trasformazione. La formula di base è:

inserisci qui la descrizione dell'immagine

... con C è la matrice dei cofattori per A .

Nel tuo caso, il determinante | A | è sempre 1024, indipendentemente dall'offset, quindi la matrice inversa è:

inserisci qui la descrizione dell'immagine


Esempio di calcolo

Ora, per i tuoi dati di esempio ...

Inserisci il tuo numero per l'offset nella formula e otterrai:

inserisci qui la descrizione dell'immagine

Moltiplicando (105, 100, 1) (le coordinate dello schermo) con la matrice ottieni:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Poiché la terza coordinata è sempre 1, non è necessario calcolarla. Arrotonda per difetto al numero intero più vicino e otterrai (1, 4) come coordinate dello spazio delle tessere, come previsto.


Matrici generali di proiezione dimetrica

Se hai una prospettiva come questa con ogni riquadro di 2 w di larghezza (64 nell'esempio, quindi w = 32) e 2 h di altezza (32 nell'esempio, quindi h = 16) e l'offset del punto di origine nello spazio dello schermo essendo f x e f y rispettivamente per l'asse orizzontale e verticale (192 e 0 nell'esempio), le matrici appaiono come segue.

Affianca lo spazio allo spazio dello schermo

inserisci qui la descrizione dell'immagine

Spazio dello schermo per piastrellare lo spazio

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.