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:
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].
mathematics
algorithm
isometric
Alexan-Dwer
la source
la source
while(val = arr[i++])
ou constructions similaires, ne l' utilisez pas . Utilisez++a
et à la++b
place.Réponses:
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.
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:
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:
... 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:
Exemple de calcul
Maintenant, pour vos données d'exemple ...
Mettez votre numéro de décalage dans la formule et vous obtenez:
La multiplication (105, 100, 1) (les coordonnées d'écran) avec la matrice vous donne:
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
Espace d'écran à l'espace de tuile
la source