육각형 격자로 타일 링 가져 오기


17

이 게시물 덕분에 6 각형 타일과 인접한 이웃을 찾아서 주어진 타일에 인접한 타일을 수집 할 수 있습니다. 그러나 나는 오프셋으로 지정된 타일의 "링"만주는 알고리즘에 거의 붙어 있습니다. 해당 스택 오버플로 게시물에 제공된 알고리즘은 타일을 수집하는 순서를 정확히 신경 쓰지 않습니다.

오프셋마다 6 개의 타일이 추가된다는 것을 알고 있습니다.

  • 오프셋 1은 6 개의 타일 (첫 번째 인접 타일)을 제공합니다.
  • 오프셋 2는 12를 제공합니다.
  • 오프셋 3은 18 등을 제공합니다.

각 오프셋마다 6의 지속적인 증가가 있습니다. 따라서 이러한 오프셋에 맞는 규칙이 있어야한다고 가정합니다. 나는 이것을 정확하게 알아낼 수 없다. 누군가?

답변:


23

반지름이 N 인 6 각형 링은 6 개의 직선으로 구성되며 각각은 길이가 N입니다. 아래의 매우 조잡한 예를 참조하십시오.) N = 2 :

여기에 이미지 설명을 입력하십시오

화살표는 각각 2 헥스를 덮습니다.

나는 당신에게 north (), southeast () 등과 같은 특정 방향으로 이웃 타일을 제공하는 함수가 있다고 가정합니다. 따라서 의사 코드의 알고리즘은 다음과 같아야합니다.

var point = startingPoint.north(N)
for i = 0..N-1:
    result.add(point)
    point = point.southeast(1);
for i = 0..N-1:
    result.add(point)
    point = point.south(1);
for i = 0..N-1:
    result.add(point)
    point = point.southwest(1);
for i = 0..N-1:
    result.add(point)
    point = point.northwest(1);
for i = 0..N-1:
    result.add(point)
    point = point.north(1);
for i = 0..N-1:
    result.add(point)
    point = point.northeast(1);

에지 사례 N = 1, 6 타일 반환, N = 0 빈 세트 반환에서도 작동합니다.

코드가 완벽하지 않다는 것을 알고 있습니다 :) 여기에 중복성이 있습니다. 규칙적으로 바둑판 식으로 배열 된지도 (육각형 또는 다른 방식)를 사용하는 프로젝트에는 보통 열거 형 "방향"이 있는데,이를 통해 더 원활하게 수행 할 수 있습니다.

var point = startingPoint.inDir(N, Direction.North)
var dir = Direction.SouthEast.
for d = 0..Direction.count():
    for i = 0..N-1:
        result.add(point)
        point = point.inDir(1, dir);
    dir = nextDirection(dir);

이것은 올바른 방향으로 나를 밀어야합니다. 감사!
Sidar

2
코드 샘플은 처음 5 개의 세그먼트에 대해 중복 포인트를 추가합니다. 그러나 좋은 대답입니다.
MichaelHouse

@ Byte56 그래 나는 생각했다. 그러나 적어도 나는 방향 전환 사이의 연결을 본다!
Sidar

1
@ Byte56 정말요? 흠. 나는 그것을 피하려고 노력했다 ... 0..N-1은 N = 2에 대해 0..1을 제공하므로 i = 0이고 i = 1이며 이는 2 값입니다. 각 방향에서 2 개의 값 6 방향은 12 타일입니다.
Liosan

아니. 네가 옳아. 각 루프가 마지막 루프에서 점을 추가하기 때문에 루프에 대해 하나씩 벗어났습니다. 영리한 알고리즘입니다.
MichaelHouse

2

나는 이 기사 가 육각형 격자 알고리즘에 대한 아주 좋은 참고 자료임을 알게 되었고, "거리"섹션은 두 타일 사이의 단계 수를 결정하는 방법을 제공한다. 당신이 당신의 변환하면 축 좌표 로 (XY)를 큐브 좌표 (| DX |, | DY |, | DZ |) (XYZ)의 거리가 항상 두 개의 타일, 또는 최대의 좌표 오프셋의 가장 큰과 같다.

원하는 거리에서 타일에 대한 전체 그리드를 철저히 검색합니다. 영형(2) 그리드 치수를 사용하지만 작은 그리드에 잘 작동하는 간단한 구현입니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.