web-dev-qa-db-fra.com

Coordonnées de la grille hexagonale aux coordonnées des pixels

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

grid

Cette question parle de générer les coordonnées elles-mêmes, et est très utile. Mon problème est maintenant de convertir ces coordonnées vers et depuis les coordonnées réelles des pixels. Je cherche un moyen simple de trouver le centre d'un hexagone avec les coordonnées x, y, z. Supposons que (0,0) en coordonnées pixel est à (0,0,0) en coordonnées hexadécimales et que chaque hexagone a un bord de longueur s. Il me semble que x, y et z devraient chacun déplacer mes coordonnées sur une certaine distance le long d'un axe, mais elles sont interdépendantes d'une manière étrange, je ne peux pas vraiment envelopper ma tête autour d'elle.

Points bonus si vous pouvez aller dans l'autre direction et convertir n'importe quel point (x, y) en coordonnées pixel en l'hexagone auquel ce point appartient.

45
captncraig

Pour plus de clarté, laissez les coordonnées "hexagonales" être (r,g,b)r, g et b sont les rouge, - vert et ble coordonnées, respectivement. Les coordonnées (r,g,b) Et (x,y) Sont liées par les éléments suivants:

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 ne dépendait que de b. Chaque hexagone peut être divisé en six triangles équilatéraux avec des côtés de longueur s; les centres des hexagones d'une rangée sont à une longueur et demie de côté au-dessus/en dessous des centres de la rangée suivante (ou, peut-être plus facile à voir, les centres d'une rangée sont à 3 longueurs de côté au-dessus/en dessous des centres à deux rangées ), donc pour chaque changement de 1 dans b, y change 3/2 * s, donnant la première formule. La résolution de b en termes 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 r au point sur l'axe r qui est 3/2 * s De l'origine (similaire à la ci-dessus dérivation de y en termes de b). L'axe r a une pente -sqrt(3)/3, donc une ligne perpendiculaire à celle-ci a une pente sqrt(3); le point sur l'axe r et sur la ligne a les coordonnées (3sqrt(3)/4 * s * r, -3/4 * s * r); donc une équation dans x et y pour la ligne contenant les centres des hexagones avec r- coordonnée r est y + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r). La substitution de y en utilisant la première formule et la résolution de x donne la deuxième formule. (Ce n'est pas ainsi que j'ai dérivé celui-ci, 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 quelle que soit la formule pour la coordonnée x en termes 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 proviennent de la substitution de la deuxième formule à b et de la résolution de r ou g en termes 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.

41
Isaac