섬에서 절차 적으로 지역 생성


29

현재 다음과 같은 섬이 있습니다.

섬

그리고 절차 적으로 다음과 같이 지역으로 세분화하고 싶습니다.

지역이있는 섬

내가 찾고있는 알고리즘은 무엇입니까? 아래 그림과 같이 일관된 영역을 만드는 방법에 대한 제안이 있습니까? 당신의 도움에 감사드립니다.


처음에 그 섬 이미지를 어떻게 얻었습니까? 생성 했습니까? 그렇다면 생성 한 방법은 무엇입니까?
Vaillancourt

온라인지도 생성기에서 가져 왔습니다.
domisum

답변 업데이트가 지연되어 죄송합니다. 원래 계획보다 집에 도착하는 데 시간이 더 걸렸습니다. 그림과 링크를 추가했습니다.
Pikalek

온라인 생성기에서 얻은 경우 Azgaar의 Fantasy Map Generator를 살펴보십시오 . 여기에는 사용자 정의 가능한 매개 변수가있는 지역과 이름이 있으며 WB.SE는 hello를 말합니다. github이므로 코드를 확인할 수 있습니다.
Anoplexian-복직 모니카

답변:


40

현실 세계에서, 이러한 주 경계는 종종 강과 같은 지질 학적 특징을 따르게됩니다.

그렇다면 섬의 지질학을 모델링하고 경계를 벗어나는 것이 좋은 방법일까요?

Red Blob Games에는이 주제에 관한 좋은 기사가 있으며 결과가 훌륭합니다.

그의 접근법보로 노이 테셀레이션 (voronoi tessellation )을 사용하는 것과 관련이 있으며, 강을 세포 사이의 경계로 정의합니다.

그의 사이트에서 다른 기사를 확인하고, 그는 지도 생성 의 주제에 대해 많은 글을 썼다 .

섬


3
실제 세계에서 정치 또는 행정 구역에는 때때로 임의의 구역이 있습니다.
Pablo H

2
@PabloH 좋은 점, 직선 경계는 매개체 후 식민지 시대 현상 인 것 같습니다. 그러나 OP 문제의 설정을 알지 못하기 때문에 관련이있을 수 있습니다
Sentry

27

Voronoi 다이어그램의 두 단계 로이 문제를 해결할 것입니다.

첫 번째 패스 : 지역 파티셔닝

첫 번째 패스는 섬을 영역으로 대략 분할하기 위해 점의 다소 희소 한 분포 (즉, 점 사이의 거리가 상대적으로 커야 함)를 사용합니다 (점 생성에 대해서는 아래 참고 참조). 다음으로 이러한 점을 기반으로 Voronoi 다이어그램을 생성하십시오. 그러면 아래와 같이 섬이 각 점 주위의 다각형 영역으로 나뉩니다.

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

두번째 패스 : 테두리 무작위 화

이제 섬이 여러 지역으로 분할되었으므로 다음 단계는 이들 사이의 경계를 '거칠게'만드는 것입니다. 그렇게하려면보다 작은 점 분포를 사용하여 새 점 층을 생성하고 (즉, 점 사이의 거리가 작아야 함)이 점을 다시 사용하여 다른 보로 노이 다이어그램을 만듭니다. 다음으로 작은 지역마다 '시드'지점을 확인하여 더 큰 지역에 할당하십시오. 이로 인해 더 큰 세분화 영역 사이에 경계가 더 뭉개집니다. 다음은 두 Voronoi 다이어그램이있는 모습을 보여줍니다.

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

그리고 마지막 영역 만 보여주는 동일한 영역이 있습니다.

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

포인트 생성에 대한 의견

포인트 생성과 관련하여, 나는 상대적으로 좋고 균일 한 포인트 분배 를 위해 Poisson 디스크 분배 를 사용하는 것을 좋아 합니다. 다른 일반적인 옵션은 유사하게 균일 한 분포를 얻는 것이 일련의 '정규'랜덤 포인트에 Lloyd의 알고리즘 을 사용하는 것입니다. LLoyd는 코딩하기가 쉽지만 시행 착오를 거쳐 원하는 결과를 얻기 위해 몇 번의 패스가 필요한지 결정할 수 있습니다.

이 방법의 한 가지 잠재적 인 문제는 첫 번째 패스 파티셔닝이 매우 작은 영역을 생성 할 수 있다는 것입니다. 최종 결과에서 원하지 않으면 임의의 인접한 지역과 단순히 병합합니다.

최종 노트

내가 제공 한 그림은 래스터 이미지가되지만이 기술은 다각형 / 벡터 표현에도 적용됩니다.


1
절차 적 평면도의 경우 이것은 내가하는 일입니다. 지역 (섬)의 지점에서 Voronoi 다이어그램을 수행하고 동일한 지역을 둘러싸는 그리드 (이 경우 직사각형이 될 필요는 없습니다) 그런 다음 그리드와 Voronoi의 부울 교차를 계산하고 영역을 계산하고 가장 작은 그리드 셀의 0.6 %에 따라 데이터 트리 (목록, 들쭉날쭉 한 배열 등 원하는 데이터 구조 목록)에 할당합니다. 누락 된 셀이 생길 수 있지만 컬링 된 격자를 원본과 비교하여 나무를 찾아 다시 할당 할 수 있습니다.
Felipe Gutierrez

이미지를 추가했습니다! 이것은 내가 다른 목적으로하는 일입니다.
Felipe Gutierrez

4

MineCraft는이를 훌륭하게 수행하며 세계 생성 알고리즘을 철저히 분석하고 문서화했습니다.

알고리즘에 대한 다양한 설명이 있습니다. https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm

알고리즘의 핵심은 Perlin 노이즈 생성기 입니다. 이것은 생물 군계 생성뿐만 아니라 동굴을 개척하는 후속 단계가 지표면을 바꿀 수 있기 때문에 고도를 직접 제어합니다. 생물 군계와 같은 것이 아마도 지역을 만드는 데 사용하려는 것일 것입니다.

(이전 버전)은 기본적으로 문서화되어 있으며 기본적으로 두 가지 Perlin 노이즈 생성기를 사용합니다. 하나는 "온도", 하나는 "침전", 두 가지 중에서 생물 군계를 선택합니다. 변수 자체 (온도와 강수량)는 나중에 게임에서 실제로 사용되지 않습니다. 예를 들어, 사막에는 비가 없지만, 게임은 이것을 원래의 강수량 값이 아니라 "사막"속성에서 결정합니다.

랜덤 시드에서 바이오 메 맵을 생성하는 다양한 온라인 도구가 있습니다. 바이오 메 mineatlas.com 입니다. 내부적으로 MineCraft 자체의 내부 클래스를 사용하는 Java 서버를 사용한다고 생각합니다. 소스 코드를 직접 사용할 수 있는지 모르겠습니다.


4

예를 들어 Azgaar ( 소스 코드 )에서 사용하는 일반적인 알고리즘 입니다. 대략 다음과 같습니다.

  1. 예를 들어들 로니 삼각 분할 (delauny triangulation) 또는 보로 노이 세포 (voronoi cells)를 통해 육지를 더 작은 영역으로 나누십시오.
  2. 자신의 문화, 영역, 종교 또는 시뮬레이션하려는 다른 곳의 "시작"위치를 (무작위로 또는 달리) 결정하십시오.
  3. 그들 각각에 대해 (임의로 또는 달리) "성장 인자"를 결정한다. 성장 인자의 차이가 클수록 최종지도의 균일 성이 떨어집니다.
  4. 이제 영역 (등)을 반복하고 성장 인자에 따라 전체 맵이 채워질 때까지 주변의 빈 타일로 퍼지게합니다.
  5. 자신의 색으로 이웃이 하나만 있고 다른 색으로 둘러싸인 셀을 전환하여 테두리를 약간 곧게 펴고 싶을 것입니다.

3

래스터 기반 접근 방식이 아닌 벡터 형식 으로이 작업에 관심이 있다면 얼마 전에 블로그 게시물을 작성했습니다.

http://blog.particracy.com/worlds-and-their-geography/

아이디어는 메쉬 (보로 노이 기반)로 시작하고 충분히 떨어져있는 무작위 시드 지점에서 동심으로 영역을 성장시키는 것입니다.


2

얼마나 재미있는 질문 :)이 접근법은 Vornoi 셀을 기반으로하지만 거리 측정법은 상당히 Euclidian이 아니며 (2.0 대신 1.5의 힘을 사용했습니다) 랜덤 성이 내장되어 있습니다. 이상적이지 않은 물 위로 뛰어 넘을 수 있습니다.

주변 지역을 합쳐서 더 흥미로운 모양을 만들 수 있습니다. 여기서 나는 N 개의 가장 가까운 이웃을 사용하여 이것을 결정했습니다.

관심이 있으시면 더 자세한 내용을 살펴보고 Python 코드를 공유 할 수 있습니다.

지도 1 지도 2

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