45 votes

Coordonnées de la Grille Hexagonale en Coordoonées de Pixels

Je travaille avec une grille hexagonale. J'ai choisi d'utiliser ce système de coordonnées parce qu'il est assez élégant.

grid

Cette question parle de la génération des coordonnées elles-mêmes, et est assez utile. Mon problème maintenant est de convertir ces coordonnées en coordonnées de pixels réelles et vice versa. Je cherche un moyen simple de trouver le centre d'un hexagone avec les coordonnées x, y, z. Supposons que (0,0) dans les coordonnées de pixels soit à (0,0,0) dans les coordonnées hexagonales, et que chaque hexagone ait un côté de longueur s. Il me semble que x, y et z devraient chacun déplacer mes coordonnées d'une certaine distance le long d'un axe, mais ils sont interdépendants de manière étrange que je n'arrive pas vraiment à comprendre.

Des points bonus si vous pouvez aller dans l'autre sens et convertir tout point (x, y) dans les coordonnées de pixels à l'hexagone auquel appartient ce point.

41voto

Isaac Points 4557

Pour plus de clarté, laissez les coordonnées "hexagonales" être (r,g,b)r, g et b sont les coordonnées rouge, verte et bleue, respectivement. Les coordonnées (r,g,b) et (x,y) sont reliées par ce qui suit :

y = 3/2 * s * b
b = 2/3 * y / s
x = sqrt(3) * s * ( b/2 + r)
x = - sqrt(3) * s * ( b/2 + g )
r = (sqrt(3)/3 * x - y/3 ) / s
g = -(sqrt(3)/3 * x + y/3 ) / s

r + b + g = 0

Dérivation :

  • J'ai d'abord remarqué que toute rangée horizontale d'hexagones (qui devrait avoir une coordonnée y constante) avait une coordonnée b constante, donc y dépendait uniquement de b. Chaque hexagone peut être divisé en six triangles équilatéraux avec des côtés de longueur s; les centres des hexagones dans une rangée sont un et demi de la longueur d'un côté au-dessus/en-dessous des centres dans la rangée suivante (ou, peut-être plus facile à voir, les centres dans une rangée sont à 3 longueurs de côté au-dessus/en-dessous des centres de deux rangées plus loin), donc pour chaque changement de 1 en b, y change de 3/2 * s, donnant la première formule. En résolvant b en fonction de y donne la deuxième formule.

  • Les hexagones avec une coordonnée r donnée ont tous des centres sur une ligne perpendiculaire à l'axe des r au point sur l'axe r qui est à 3/2 * s de l'origine (similaire à la dérivation ci-dessus de y en fonction de b). L'axe des r a une pente de -sqrt(3)/3, donc une ligne perpendiculaire a une pente de sqrt(3); le point sur l'axe des r et sur la ligne a des coordonnées (3sqrt(3)/4 * s * r, -3/4 * s * r); donc une équation en x et y pour la ligne contenant les centres des hexagones avec une coordonnée r de r est y + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r). En substituant y en utilisant la première formule et en résolvant pour x donne la deuxième formule. (Ce n'est pas ainsi que je l'ai réellement dérivé, mais ma dérivation était graphique avec beaucoup d'essais et d'erreurs et cette méthode algébrique est plus concise.)

  • L'ensemble des hexagones avec une coordonnée r donnée est la réflexion horizontale de l'ensemble des hexagones avec cette coordonnée g, donc quel que soit la formule pour la coordonnée x en fonction de r et b, la coordonnée x pour cette formule avec g à la place de r sera l'inverse. Cela donne la troisième formule.

  • Les quatrième et cinquième formules viennent de substituer la deuxième formule pour b et de résoudre pour r ou g en fonction de x et y.

  • La formule finale est venue de l'observation, vérifiée par l'algèbre avec les formules précédentes.

4voto

Roberto Bonvallet Points 6336

Cette page contient quelques formules qui peuvent vous être utiles : http://www.cs.sunysb.edu/~skiena/392/lectures/week12/

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