Ca fait quelque temps que j'avance trèèèès lentement sur différents système de carte au format hexagonal.
A l'époque, j'avais déjà parlé d'un système de coordonnées basé sur trois valeurs (x/y/z).
Je profite d'un creux dans mon après midi de boulot pour expliquer rapidement de quoi il en retourne. Je m'excuse par avance de ma méconnaissance du vocabulaire mathématique qui fera certainement défaut dans les explications suivantes. Je laisse aux puristes le soin de rectifier mes approximations linguistiques et syntaxiques.
Le système à trois coordonnées utilise les trois axes d'un hexagone pour le positionner sur la carte. Le plus souvent, on utilise un système de coordonnées x/y pour affecter des coordonnées aux hexagones. En fonction de l'orientation, ça peut donner un truc comme ça.
Rien à dire sur la visualisation mais sur les travaux annexes, c'est plutôt compliqué sans surcharger de tests. De plus, en fonction de la méthode choisie, il sera peut être nécessaire de connaître l'orientation de la carte pour faire les bons calculs.
Par exemple
Comment tracer une ligne d'un hexagone A vers un hexagone B ?
Comment savoir facilement si un ennemi est à portée ?
A quelle distance est un hexagone donné ?
Comment afficher ma carte avec un champ de vision de X hexagones ?
Une solution simple sur j'ai trouvée au détour du net est de passer par ces fameuses triples coordonnées. Les hexagones sont alors référencées de la manière suivante
Chaque hexagone est repéré grâce à trois coordonnées (x,y,z).
Si au départ cela semble compliquer un peu les choses, au final, cela s'avère plutôt utile.
Note : En fonction du modèle de représentation des coordonnées choisis, la validité d'un hexagone peut se déterminer selon des formules simples.
Dans le 1er schéma, X+Y-Z doit être égale à 0
Dans le 2e X-Y+Z doit être égale à 0.
Les avantages de cette modélisation sont évidents lorsqu'on doit travailler avec les coordonnées.
Reprenons les questions du début. Dans les exemples suivant, les coordonnées x1/y1/z1 représentent ma position et x2/y2/z2 celle que je veux tester
Comment tracer une ligne d'un hexagone A vers un hexagone B ?
Il suffit de faire évoluer les coordonnées du point de départ vers le point d'arrivée en modifiant à chaque pas les deux plus grand écart en valeur absolue.
Pour aller de 1,1,0 vers -1,3,4
1er Déplacement
L'écart absolu entre [1,1,0] et [-1,3,4] donne [2,2,4]. A supposer que l'on teste dans l'ordre x->y->z, les deux axes a modifier seront x (-1) et z (+1). J'arrive alors en 0,1,1
2e Déplacement
L'écart absolu entre [0,1,1] et [-1,3,4] donne [1,2,3]. Les deux axes a modifier seront y (+1) et z (+1). J'arrive en 0,2,2
3e Déplacement
L'écart absolu entre [0,2,2] et [-1,3,4] donne [1,1,2]. Les deux axes a modifier seront encore une fois x (-1) et z (+1). J'arrive en -1,2,3
etc
Comment savoir facilement si un ennemi est à portée ?
L'ennemi est à portée si le plus grand écart entre ses coordonnées x/y/z et les mienne est inférieur ou égal à ma portée
A quelle distance est un hexagone donné ?
Même formule que précédemment
Comment afficher ma carte avec un champ de vision de X hexagones ?
Soit V mon rayon de vision, une simple requête SQL me donne le résultat
Bref, cela simplifie largement bon nombre de calculs.
Et pour l'affichage
Étonnamment, c'est aussi très simple.
Pas de décalage à gérer
Dans un affichage avec la pointe de l'hexagone en haut (partie gauche des dessins)
position x = Y * [3/4 Largeur de l'hexagone]
position y = X + Z * [1/2 hauteur de l'hexagone]
Dans un affichage avec un bord en haut, il suffit d'inverser
position x = X + Z * [1/2 largeur de l'hexagone]
position y = Y * [3/4 hauteur de l'hexagone]
Il vous suffit simplement d'appliquer un offset sur ces coordonnées pour bien placer votre carte.
A l'époque, j'avais déjà parlé d'un système de coordonnées basé sur trois valeurs (x/y/z).
Je profite d'un creux dans mon après midi de boulot pour expliquer rapidement de quoi il en retourne. Je m'excuse par avance de ma méconnaissance du vocabulaire mathématique qui fera certainement défaut dans les explications suivantes. Je laisse aux puristes le soin de rectifier mes approximations linguistiques et syntaxiques.
Le système à trois coordonnées utilise les trois axes d'un hexagone pour le positionner sur la carte. Le plus souvent, on utilise un système de coordonnées x/y pour affecter des coordonnées aux hexagones. En fonction de l'orientation, ça peut donner un truc comme ça.
Rien à dire sur la visualisation mais sur les travaux annexes, c'est plutôt compliqué sans surcharger de tests. De plus, en fonction de la méthode choisie, il sera peut être nécessaire de connaître l'orientation de la carte pour faire les bons calculs.
Par exemple
Comment tracer une ligne d'un hexagone A vers un hexagone B ?
Comment savoir facilement si un ennemi est à portée ?
A quelle distance est un hexagone donné ?
Comment afficher ma carte avec un champ de vision de X hexagones ?
Une solution simple sur j'ai trouvée au détour du net est de passer par ces fameuses triples coordonnées. Les hexagones sont alors référencées de la manière suivante
Chaque hexagone est repéré grâce à trois coordonnées (x,y,z).
Si au départ cela semble compliquer un peu les choses, au final, cela s'avère plutôt utile.
Note : En fonction du modèle de représentation des coordonnées choisis, la validité d'un hexagone peut se déterminer selon des formules simples.
Dans le 1er schéma, X+Y-Z doit être égale à 0
Dans le 2e X-Y+Z doit être égale à 0.
Les avantages de cette modélisation sont évidents lorsqu'on doit travailler avec les coordonnées.
Reprenons les questions du début. Dans les exemples suivant, les coordonnées x1/y1/z1 représentent ma position et x2/y2/z2 celle que je veux tester
Comment tracer une ligne d'un hexagone A vers un hexagone B ?
Il suffit de faire évoluer les coordonnées du point de départ vers le point d'arrivée en modifiant à chaque pas les deux plus grand écart en valeur absolue.
Pour aller de 1,1,0 vers -1,3,4
1er Déplacement
L'écart absolu entre [1,1,0] et [-1,3,4] donne [2,2,4]. A supposer que l'on teste dans l'ordre x->y->z, les deux axes a modifier seront x (-1) et z (+1). J'arrive alors en 0,1,1
2e Déplacement
L'écart absolu entre [0,1,1] et [-1,3,4] donne [1,2,3]. Les deux axes a modifier seront y (+1) et z (+1). J'arrive en 0,2,2
3e Déplacement
L'écart absolu entre [0,2,2] et [-1,3,4] donne [1,1,2]. Les deux axes a modifier seront encore une fois x (-1) et z (+1). J'arrive en -1,2,3
etc
Comment savoir facilement si un ennemi est à portée ?
L'ennemi est à portée si le plus grand écart entre ses coordonnées x/y/z et les mienne est inférieur ou égal à ma portée
Code :
max(abs(x1-x2),abs(y1-y2), abs(z1-z2)) <= portée
A quelle distance est un hexagone donné ?
Même formule que précédemment
Code :
max(abs(x1-x2), abs(y1-y2), abs(z1-z2)) = Distance de la cible
Comment afficher ma carte avec un champ de vision de X hexagones ?
Soit V mon rayon de vision, une simple requête SQL me donne le résultat
Code :
SELECT * from carte where
x BETWEEN x1 - V AND x1 + V AND
y BETWEEN y1 - V AND y1 + V AND
z BETWEEN z1 - V AND z1 + V
Bref, cela simplifie largement bon nombre de calculs.
Et pour l'affichage
Étonnamment, c'est aussi très simple.
Pas de décalage à gérer
Dans un affichage avec la pointe de l'hexagone en haut (partie gauche des dessins)
position x = Y * [3/4 Largeur de l'hexagone]
position y = X + Z * [1/2 hauteur de l'hexagone]
Dans un affichage avec un bord en haut, il suffit d'inverser
position x = X + Z * [1/2 largeur de l'hexagone]
position y = Y * [3/4 hauteur de l'hexagone]
Il vous suffit simplement d'appliquer un offset sur ces coordonnées pour bien placer votre carte.
Quand on te dit qu'un projet est terminé à 90%, prépare toi pour les 90% suivant
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC