Bonsoir,
Après un rapide examen, il semblerait qu'il soit beaucoup plus intéressant de déplacer les lignes impaires d'une demi-case vers la droite, plutôt que les colonnes homologues vers le bas :
1 2 3 4 5 6 7 8 9 10 11
| / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <- Ligne 0
\ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <- Ligne 1
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <- Ligne 2
\ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <- Ligne 3
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <- Ligne 4
\ / \ / \ / \ / \ / \ / \ / \ / \ / \ / |
Dès lors, il est effectivement possible d'assimiler ce maillage à une grille carrée ordinaire, même en avançant une ligne sur deux d'une demi-case :
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
… et comme toutes les lignes contiennent de toutes façons le même nombre de case, et que les « décalages » ne se cumulent pas, alors tu peux l'assimiler à une grille normale, puisque tu peux toujours accéder à la même cellule en passant les mêmes coordonnées :
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
… et de là, sur cette dernière grille, quelque soit la cellule examinée, tu peux poser deux postulats :
- Les cases gauche, droite, inférieure et supérieure sont toujours voisines ;
- Les case inférieures et supérieures gauches sont voisines dans le cas des lignes paires et les cases inférieures et supérieures droites le sont pour les lignes impaires ;
Ce qui donne :
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
… ou :
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
Pour le reste, je pense que le problème vient justement du fait que vous n'avez pas clairement défini votre référentiel : « conserver les coordonnées de la boule au niveau de la boule » ne veut rien dire en soi. :-) En principe, on considère que les coordonnées sont celles de la cellule hexagonale qui contient ou non une boule.
Si, au contraire, les hexagones ne servent qu'à définir des parcelles officielles et qu'une boule (ou tout autre objet) peut se déplacer librement sur un terrain rectangulaire, fût-il partitionné en parcelles, et qu'une même boule peut occuper différentes positions à l'intérieur d'un hexagone, alors cela veut dire que votre référentiel restent les coordonnées cartésiennes sur le terrain. Il faut donc les utiliser par défaut et faire une fonction qui renvoie le numéro d'une cellule en fonction de ces coordonnées.
Partager