Comment convertir les coordonnées de la souris en index isométriques?

21

Je dessine une carte isométrique avec une tuile 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);
  }

Image illustrant ce code:

Image illustrant ce code:

Chers professionnels, aidez-moi avec une formule de transformation des coordonnées de la souris dans les index isométriques d'une cellule. Exemple: (105; 100) -> [1; 4].

Alexan-Dwer
la source
reproduction possible du rendu et de la sélection isométriques?
bummzack
Note côté: Si vous ne pas réellement souhaitez accéder à la valeur précédente d'une variable que vous êtes incrémenter, comme dans while(val = arr[i++])ou constructions similaires, ne l' utilisez pas . Utilisez ++aet à la ++bplace.
Martin Sojka

Réponses:

25

Vous devez déterminer la matrice de transformation des coordonnées de l'espace des tuiles aux coordonnées de l'espace de l'écran, puis calculer la matrice inverse pour cela, qui lorsqu'elle est appliquée aux coordonnées de l'espace de l'écran les transforme en coordonnées de l'espace des tuiles.

Soit dit en passant: votre décalage pointe en fait vers un endroit qui serait (0,0, 1,0) dans n'importe quel système de coordonnées sain, mais ce n'est pas un gros problème, juste quelque chose à garder à l'esprit. Cela signifie que le décalage de l'origine de votre système de coordonnées transformé est à (Offset + 32, 0).


Cas particulier

Ce que vous faites essentiellement pour transformer les coordonnées de l'espace de tuiles (a, b) en coordonnées d'écran (x, y), c'est de les exécuter à travers la matrice de transformation suivante:

entrez la description de l'image ici

Définitions: a et b pour la tuile (0, 0) sont dans la plage [0.0, 1.0) avec (0.0, 0.0) étant le coin supérieur, (1.0, 1.0) le coin inférieur, (0.0, 1.0) le coin gauche et (1.0, 0.0) le coin droit dans l'espace d'écran.

Nous étendons les définitions de coordonnées par une troisième coordonnée constante (c'est toujours exactement 1) pour pouvoir incorporer la traduction dans la matrice.

Vous pouvez maintenant créer la matrice inverse pour cette transformation. La formule de base est:

entrez la description de l'image ici

... avec C étant la matrice des cofacteurs pour A .

Dans votre cas, le déterminant | A | est toujours 1024, quel que soit le décalage, donc la matrice inverse est:

entrez la description de l'image ici


Exemple de calcul

Maintenant, pour vos données d'exemple ...

Mettez votre numéro de décalage dans la formule et vous obtenez:

entrez la description de l'image ici

La multiplication (105, 100, 1) (les coordonnées d'écran) avec la matrice vous donne:

entrez la description de l'image ici entrez la description de l'image ici

Puisque la troisième coordonnée est toujours 1, nous n'avons pas à la calculer. Arrondissez au nombre entier le plus proche et vous obtenez (1, 4) comme coordonnées de votre espace de tuile, comme prévu.


Matrices de projection dimétrique générales

Si vous avez une perspective comme celle-ci, chaque tuile ayant une largeur de 2 w (64 dans l'exemple, donc w = 32) et 2 h de hauteur (32 dans l'exemple, donc h = 16), et le décalage du point d'origine dans l'espace d'écran étant f x et f y pour l'axe horizontal et vertical respectivement (192 et 0 dans l'exemple), les matrices ressemblent à ce qui suit.

Espace de tuile pour l'espace d'écran

entrez la description de l'image ici

Espace d'écran à l'espace de tuile

entrez la description de l'image ici

Martin Sojka
la source