[Math] Hexagonal Grid

개요

현재 게임에 육각형 타일로 타일맵을 생성해야한다.

따라서 직사각형 타일에서의 좌표계가 아닌 육각형에 맞는 좌표계로 맵을 생성해야한다.

Hexagonal Grid에 대해 잘 정리해놓은 글이 있어서 해당 글에서 현재 프로젝트에 필요한 부분만 정리해보았다.

https://www.redblobgames.com/grids/hexagons/

 

Red Blob Games: Hexagonal Grids

Amit's guide to math, algorithms, and code for hexagonal grids

www.redblobgames.com

Geometry

정육각형을 배치하는 방법을 2가지이다.

  •  Flat-top orientation
  • Pointy-top orientation

정육각형의 크기를 결정하는 방식도 2가지 이다.

  • inner circle : 중심에서 변까지의 거리
  • outer circle : 중심에서 꼭짓점까지의 거리

보통 outer circle을 기준으로 size를 정의한다.

 

Space

outer circle을 size로 하여 정육각형을 배치할 때 수평 거리와 수직 거리를 구하는 방법이다.

Flat-top 일때

horizontal Spacing = 3/2 * size

verticla Spacing = sqrt(3) * size

Pointy-top 일때

Flat-top과 반대다

vertical Spacing = 3/2 * size

horizontal Spacing = sqrt(3) * size

Cube Coordination

정육각형의 배치에서 좌표계의 종류는 아주 많지만 Cube Coordination를 사용하므로 이것만 정리한다.

q, s, r 총 3가지 축이 있다.

q + s + r = 0이라는 특징을 가지고 있다.

배치모양

Flat-top, Pointy-top 둘다 가능하다.

이웃찾기

cube_direction_vector에 해당하는 좌표를 더하면 이웃

거리

한 좌표에서 다른 좌표를 빼고 각 좌표의 절댓값을 /2 하면 거리가 나온다.

한 지점에서 범위에 해당하는 좌표 구하기

result는 해당 범위에서 좌표계에 있는 것만

비효율적이므로 다음 수식 사용