Coordonnées de grid hexagonale en coordonnées de pixels

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

la grille

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 en coordonnées réelles. 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 de pixel est à (0,0,0) dans les coefficients hexadécimaux et que chaque hexagone a une arête de longueur s. Il me semble que x, y et z devraient chacun déplacer ma coordonnée à une certaine distance le long d’un axe, mais ils sont interreliés d’une façon étrange.

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

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 liées par le suivant:

 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 sortingangles équilatéraux avec des côtés de longueur s ; les centres des hexagones d’une rangée mesurent un côté et demi au-dessus / au-dessous des centres de la rangée suivante (ou, peut-être plus facile à voir, les centres d’une rangée sont trois longueurs latérales au-dessus ou au centre) ), donc pour chaque changement de 1 en b , y change 3/2 * s , donnant la première formule. La résolution de b en termes de y donne la seconde 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 dérivation ci-dessus 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 des coordonnées (3sqrt(3)/4 * s * r, -3/4 * s * r) ; donc une équation de 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) . En remplaçant y par la première formule et en résolvant pour x obtient la seconde formule. (Ce n’est pas comme cela que j’ai en fait tiré celle-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 reflection 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 le contraire. Cela donne la troisième formule.

  • Les quasortingème et cinquième formules proviennent de la substitution de la deuxième formule pour b et de la résolution pour r ou g en termes de x et y .

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