151 votes

Comment puis-je représenter une grille hextile/hextile en mémoire ?

Disons que je construise un jeu de société avec une grille hexagonale, comme Les colons de Catan :

Hosted by imgur.com

Notez que chaque sommet et chaque arête peut avoir un attribut (une route et un village ci-dessus).

Comment faire une structure de données qui représente ce tableau ? Quels sont les modèles permettant d'accéder aux voisins, aux arêtes et aux sommets de chaque tuile ?

1 votes

Vous pouvez également utiliser une courbe de hilbert, ce sont des courbes de classement d'espacement telles que l'adjacence dans le plan est préservée dans un codage linéaire. consultez l'indexation spatiale et la façon dont elles sont utilisées ! v intéressant

203voto

a paid nerd Points 11716

Amit Patel a posté un étonnant page sur ce sujet. Elle est tellement complète et merveilleuse qu'elle doit être la réponse définitive à cette question : Grilles hexagonales

cubez

35 votes

Merci :) Cette page ne couvre pas les arêtes et les sommets, mais je les couvre dans la section Relations entre les parties de mon article sur les grilles à l'adresse suivante www-cs-students.stanford.edu/~amitp/game-programming/grids (les diagrammes sont pour les grilles carrées mais le tableau inclut les formules pour les grilles hexagonales axiales également)

0 votes

Je trouve le blog super confus, utilisant x,y,z et q,r,s puis la bibliothèque d'implémentation change les axes' et ensuite mon cerveau est de nouveau confus. Vous faites aussi la conversion axial->cube->axial pour l'arrondi, ce qui m'embrouille aussi car il n'y a pas vraiment d'explication sur la nécessité de le faire alors que l'axial peut techniquement être un cube tout le temps si vous ignorez l'option s variable, pourquoi les deux types existent-ils ?

1 votes

Merci, vous avez sauvé mon Avent du Code jour 24 ! Naviguer dans les hexagones comme des cubes n'est pas quelque chose que j'aurais inventé tout seul.

22voto

Joey Points 148544

Une telle grille peut être représentée dans un tableau à deux dimensions :

Si

   2
7     3
   1   
6     4
   5

est le numéro un avec ses voisins dans la grille hexagonale, alors vous pouvez le mettre dans un tableau 2D comme suit :

2 3
7 1 4
  6 5

Il est évident que dans cette grille, le voisinage est déterminé non seulement par le fait d'être adjacent horizontalement ou verticalement, mais aussi par l'utilisation d'une diagonale.

Mais vous pouvez aussi utiliser un graphique, si vous le souhaitez.

0 votes

Cool. Et les données pour les arêtes et les sommets ?

1 votes

Je les stockerai probablement séparément. Que vous regardiez principalement les tuiles ou les bords/vertices, l'autre moitié des données est soit pénible soit redondante à stocker.

0 votes

Voir l'article d'Amit Patel dans la réponse "a paid nerd".

13voto

zfedoran Points 1145

Cet article explique comment mettre en place un jeu à grille isomérique/exagonale. Je vous recommande de jeter un coup d'oeil à la Forcing Isometric and Hexagonal Maps onto a Rectangular Grid et la section du mouvement. Bien que cela soit différent de ce que vous recherchez, cela peut vous aider à formuler comment faire ce que vous voulez.

3voto

J'ai eu affaire à beaucoup d'hexagones. Dans des cas comme celui-ci, vous repérez chacun des 6 points pour les frontières de l'hexagone. Cela vous permet de le dessiner assez facilement.

Vous auriez un seul tableau d'objets représentant des hexagones. Chacun de ces objets hexagonaux possède également 6 "pointeurs" (ou un index vers un autre tableau) pointant vers un autre tableau de "côtés". Même chose pour les "sommets". Bien sûr, les sommets auront 3 pointeurs vers les hexagones adjacents, et les côtés en auront 2.

Ainsi, un hexagone peut être quelque chose comme : X, Y, Point(6), Sommets(6), Côtés(6)

Ensuite, vous avez un tableau Hex, un tableau Vertice et un tableau Side.

Il est alors assez simple de trouver les sommets/côtés d'un hexagone, ou autre.

Lorsque je parle de pointeur, il pourrait tout aussi bien s'agir d'un nombre entier pointant vers l'élément du tableau de sommets ou de côtés ou autre. Et bien sûr, les tableaux peuvent être des listes ou autres.

0voto

qba Points 788
   2
7     3
   1   
6     4
   5

Vous pouvez également essayer d'aplatir les rangées de votre carte. Pour cet exemple, ce serait :

  2
7 1 3
6 5 4

Il est parfois plus utile d'avoir des rangées dans une seule rangée :P

2 votes

Cela peut donner lieu à un code de vérification de voisinage désordonné, car, par exemple, 1 et 6 sont voisins, mais 3 et 5 ne le sont pas, alors qu'ils ont les mêmes positions relatives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X