16 진 맵에서 동일한 영역 생성


13

예를 들어 큰 (X x Y) 16 진수 맵을 사용하여 국가를 시뮬레이션하기 위해 연결된 헥스의 N 영역으로 어떻게 나눌 수 있습니까?

목표는 모양은 다르지만 크기는 같은 국가를 가진 실제지도처럼 보이는 16 진지도를 생성하는 것입니다.

답변:


13

Lloyd 's Algorithm 을 사용해 보셨습니까 ? 절차는 매우 간단하며 실행 횟수에 따라 상당히 규칙적으로 보이는 영역을 생성합니다.

  1. 빈 육각형으로 맵을 타일링하여 시작하십시오.
  2. 무작위로 N 헥스를 선택하십시오 . 이들은 각 국가의 "질량 중심"을 나타냅니다.
  3. 가장 가까운 중심 16 진수로 각 16 진수 태그를 지정하십시오 ( Voronoi Diagram ). 국가 ii 번째 중심 육각에 가장 가까운 모든 육각형 의 집합입니다 .
  4. 각 국가의 새로운 질량 중심을 계산합니다.
  5. 생성 된 영역을 부드럽게하려면 3 단계와 4 단계를 반복하십시오.

멋진 맵을 만들기 위해 아주 오래 실행할 필요는 없습니다. 이 예 에서는 세 번만 반복하면됩니다.


예를 들어서 매우 친절하고 +1하지만, 이것들이 너무 규칙적 이라고 조금 걱정할 것입니다 ! 즉, 결과는 특히 그 규모에서 정말 화려하게 보이고 다른 방법을 파종하는 훌륭한 방법이기도합니다.
Steven Stadnicki 2016 년

1
내 예제는 다각형 맵 생성 에 대한 블로그 게시물에서 영감을 얻었습니다 . 저자는 각 영역의 가장자리에 약간의 노이즈를 추가하여 들쭉날쭉하게 보이게했습니다 (아래로 스크롤하여 볼 수 있음). 실행 가능한 옵션을 만드는 것보다 훨씬 많은 육각형을 사용해야하지만 확실히 가능합니다.
Michael Kristofik

3

시도 할 수있는 간단한 방법입니다.

  1. 16 진수를 무작위로 선택하십시오 n. 각각은 그룹을 시작합니다.
  2. 각 그룹마다 초기 16 진수를 임의의 방향으로 확장하십시오.
  3. 선택한 16 진수 주위의 모든 육각형이 점유되면 탭된 것으로 표시하고 16 진수를 변경하십시오.
  4. 각 그룹의 길이가 20 진수이거나 확장 할 공간이 없을 때까지 반복하십시오 (모든 육각형 탭).

나는 테스트하지 않았지만 이것은 제도를 생성하고 다소 긴 괄호를 피해야합니다. 또한 이웃 경계가있을 가능성이 높지만 반드시 각 경계선이 서로 접촉 할 필요는 없으며 밀도는의 값에 따라 다릅니다 n.
일부 그룹은 다른 그룹에 의해 코너링되어 20 개 미만의 크기에 도달 할 수 있습니다. 스타터 헥스를 최소 간격으로 생성하여 공간을 확보 할 수 있습니다.
필요에 따라 테스트하고 조정하십시오.


: 또한이 문제와 관련이없는 있지만, 칸 작업에 매우 유용합니다,이 페이지를 방문 http://www.redblobgames.com/grids/hexagons/#basics를
그것으로 하나의 장소에서 진수 정보의 전체 무리를 집계 좋은 시각.


그룹 B가 그룹 A와 접하고 다른 곳이없는 경우 그룹 A에 노드를 그룹 B에 제공하는 메커니즘을 포함해야합니다. 그룹 A에 손실 된 노드를 대체하기 위해 확장 할 빈 공간이있는 한. 그런 다음 어디에서 시작했는지는 중요하지 않습니다. 이것은 "후퇴"와 같은 역할을하기 때문에.
MichaelHouse

나는 한 번에 한 국가를 시작하여 모퉁이 그룹을 먼저 형성 한 다음 가장자리가 내가 원하는 것을 줄 것이라고 생각합니다. 집에 도착하면해볼 게요.
MadCatPT

@ Byte56 네, 실제로 점심 시간에는 이런 식으로 생각했습니다. 모서리가있는 그룹이 아무데도 성장하지 않으면 다른 그룹의 16 진수를 가져 와서 다음 반복에서 해당 그룹이 빈 공간을 찾게합니다. 두 개의 모퉁이 그룹이 서로를 괴롭히는 것을 피하기 위해 몇 가지 안전 장치가 있어야합니다.
petervaz 2016 년

실제 국가는 종종 강이나 산에 경계가 있습니다. 임의의 방향으로 확장 할 때 다음 16 진수가 강이나 산마루의 다른쪽에 있으면 확장 가능성을 줄이십시오.
amitp 2016 년

@amitp OP가 이러한 요소를 고려할 것으로 예상되면 아마도 언급했을 것입니다. 나는 원래의 전제 안에서 일한다고 가정하지 않습니다.
petervaz

2

나는 확실히 어떤 유형의 그래프 구조가 이것을 가능하게 할 것이라고 생각합니다. 기본적으로 전체 맵을 시뮬레이트하기 위해 두 개의 Hex 노드가 서로 옆에 있으면 가장자리를 만듭니다. 그러나 해당지도 내에서 "국가"를 생성하는 정확한 알고리즘을 잘 모르겠습니다. 문제는 국가가 어떻게 "보고"원하는지에 따라 다른 알고리즘이 필요하다는 것입니다.

내 머리 꼭대기에서, 나는 포인트를 고르고 거기에서 바깥쪽으로 이동하여 나라의 일부가 아닌 인접한 타일이있는 "성장하는 국가"에서 무작위 타일을 선택하는 것이 좋습니다.

전략 유형을 사용하여 원하는 국가 유형에 따라 알고리즘을 전환 할 수 있습니다. http://en.wikipedia.org/wiki/Strategy_pattern 즉, 칠레처럼 얇은 해안선 국가를 원하십니까? 아니면 더 둥글고 포함 된 것을 원하십니까?

그래프 속성을 사용하면 최종 "국가"모양을 조정할 수 있습니다. http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)

큰 나라를 원하십니까? 그래프 속성을 조정하고 생성 된 국가 (단지 그래프)가 원하는 "모양"을 제공하는 속성을 갖도록합니다.

마지막으로 그래프는 국가 간 경계를 정의하는 데 매우 유용합니다. 국가가 서로 경계가있는 경우 두 노드 사이에 연결된 그래프를 작성할 수 있습니다. 게임에서 어떤 유형의 파티셔닝에 유용 할 수 있으며 개발 과정에서 특정 사항을 더 최적화 할 수 있습니다.


2

작은 메모 : '모양이 다르지만 크기가 같은 국가를 가진 실제지도처럼 보인다'고 말하지만 '실제'국가는 특정 지역 내에서도 크기가 크게 다릅니다. 유럽의 '대규모'국가조차도 예를 들어 프랑스는 이탈리아보다 두 배 이상 큽니다. 그렇게 말하면, 크기를 대략 동일하게 유지하려고 시도하는 게임 플레이 영역이 있습니다. 여기서 약간의 변형이 아마도 좋은 것입니다!

이 문제에 대한 나의 초기 접근 방식은 귀하의 지역을 '성장'하는 대신 '진화'하는 것입니다.

  • 지도를 구체적으로 직선으로 대략 같은 크기의 덩어리로 나눕니다 (예를 들어, 6 개국을 원한다면지도를 3 개의 수평 슬라이스로 분할 한 다음 각 슬라이스를 '대각선으로'분할 할 수 있습니다) 두 조각으로). 프로그래밍 방식으로 수행하는 것은 매우 쉽습니다. 특히 매우 정확할 필요는 없기 때문에 (실제로 정확하지 않아야합니다).
  • 부서에 대한 초기 패스를 수행하여 '경계'데이터 구조를 구축하십시오. 일부 이웃은 현재 다른 국가에 속해 있습니다. 또한 각 국가에 몇 개의 육각형이 있는지 계산하기에 좋은시기입니다.

이제 원하는만큼 다음 의사 코드를 실행하십시오.

Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
  change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
  change hex B to belong to A's country;
} else {
  flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
  undo and reject this move;
} else {
  update the boundary list around the changed hex and its neighbors;
}

이렇게하면 두 이웃 국가의 규모가 대략적으로 균형을 유지하게되며 '단순한 홍수 채우기 알고리즘으로 수행 할 수있는'연결이 끊어진 '검사를 통해 국가가 부서지지 않도록 할 수 있습니다. 바운더리리스트를 업데이트하는 것은 일정한 시간 작업입니다. 변경된 16 진수는 항상 바운더리에있을 것입니다. 6 개의 이웃을 검사하여 그중 하나가 바운더리 셀이되었는지 확인할 수 있습니다. 필요에 따라 경계 세트를 수정하여 (이웃 국이 같은 국가에 있기 때문에) 다른 국가) 또는 경계 셀이 중지되었습니다.

이 접근 방식을 개선하기 위해 두 국가를 항상 '균형 조정'하지 않고 16 진수로 무작위로 변경하는 조건을 만들 수도 있습니다. 항상 특정 확률로 스왑을 만들고 점차 그 확률을 감소시킬 수 있습니다 시간 (냉각 과정과 유사 시뮬레이션 어닐링 알고리즘 )이 거의 동일한 크기가되도록 시작합니다.

이것은 모든 영역이 정확히 동일한 크기를 보장하지는 않으며 (N이 그리드 크기를 완벽하게 나누지 않는 한 불가능합니다) 모든 국가가 영역에서 서로 16 진수 내에 있다고 보장하지는 않습니다. 그러나 각 국가가 바로 인접한 각 국가보다 크거나 작지 않다는 것을 보장 해야합니다 (충분한 반복으로 실행).

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