현재 다음과 같은 섬이 있습니다.
그리고 절차 적으로 다음과 같이 지역으로 세분화하고 싶습니다.
내가 찾고있는 알고리즘은 무엇입니까? 아래 그림과 같이 일관된 영역을 만드는 방법에 대한 제안이 있습니까? 당신의 도움에 감사드립니다.
현재 다음과 같은 섬이 있습니다.
그리고 절차 적으로 다음과 같이 지역으로 세분화하고 싶습니다.
내가 찾고있는 알고리즘은 무엇입니까? 아래 그림과 같이 일관된 영역을 만드는 방법에 대한 제안이 있습니까? 당신의 도움에 감사드립니다.
답변:
현실 세계에서, 이러한 주 경계는 종종 강과 같은 지질 학적 특징을 따르게됩니다.
그렇다면 섬의 지질학을 모델링하고 경계를 벗어나는 것이 좋은 방법일까요?
Red Blob Games에는이 주제에 관한 좋은 기사가 있으며 결과가 훌륭합니다.
그의 접근법 은 보로 노이 테셀레이션 (voronoi tessellation )을 사용하는 것과 관련이 있으며, 강을 세포 사이의 경계로 정의합니다.
그의 사이트에서 다른 기사를 확인하고, 그는 지도 생성 의 주제에 대해 많은 글을 썼다 .
Voronoi 다이어그램의 두 단계 로이 문제를 해결할 것입니다.
첫 번째 패스는 섬을 영역으로 대략 분할하기 위해 점의 다소 희소 한 분포 (즉, 점 사이의 거리가 상대적으로 커야 함)를 사용합니다 (점 생성에 대해서는 아래 참고 참조). 다음으로 이러한 점을 기반으로 Voronoi 다이어그램을 생성하십시오. 그러면 아래와 같이 섬이 각 점 주위의 다각형 영역으로 나뉩니다.
이제 섬이 여러 지역으로 분할되었으므로 다음 단계는 이들 사이의 경계를 '거칠게'만드는 것입니다. 그렇게하려면보다 작은 점 분포를 사용하여 새 점 층을 생성하고 (즉, 점 사이의 거리가 작아야 함)이 점을 다시 사용하여 다른 보로 노이 다이어그램을 만듭니다. 다음으로 작은 지역마다 '시드'지점을 확인하여 더 큰 지역에 할당하십시오. 이로 인해 더 큰 세분화 영역 사이에 경계가 더 뭉개집니다. 다음은 두 Voronoi 다이어그램이있는 모습을 보여줍니다.
그리고 마지막 영역 만 보여주는 동일한 영역이 있습니다.
포인트 생성과 관련하여, 나는 상대적으로 좋고 균일 한 포인트 분배 를 위해 Poisson 디스크 분배 를 사용하는 것을 좋아 합니다. 다른 일반적인 옵션은 유사하게 균일 한 분포를 얻는 것이 일련의 '정규'랜덤 포인트에 Lloyd의 알고리즘 을 사용하는 것입니다. LLoyd는 코딩하기가 쉽지만 시행 착오를 거쳐 원하는 결과를 얻기 위해 몇 번의 패스가 필요한지 결정할 수 있습니다.
이 방법의 한 가지 잠재적 인 문제는 첫 번째 패스 파티셔닝이 매우 작은 영역을 생성 할 수 있다는 것입니다. 최종 결과에서 원하지 않으면 임의의 인접한 지역과 단순히 병합합니다.
내가 제공 한 그림은 래스터 이미지가되지만이 기술은 다각형 / 벡터 표현에도 적용됩니다.
MineCraft는이를 훌륭하게 수행하며 세계 생성 알고리즘을 철저히 분석하고 문서화했습니다.
알고리즘에 대한 다양한 설명이 있습니다. https://github.com/UnknownShadow200/ClassiCube/wiki/Minecraft-Classic-map-generation-algorithm
알고리즘의 핵심은 Perlin 노이즈 생성기 입니다. 이것은 생물 군계 생성뿐만 아니라 동굴을 개척하는 후속 단계가 지표면을 바꿀 수 있기 때문에 고도를 직접 제어합니다. 생물 군계와 같은 것이 아마도 지역을 만드는 데 사용하려는 것일 것입니다.
(이전 버전)은 기본적으로 문서화되어 있으며 기본적으로 두 가지 Perlin 노이즈 생성기를 사용합니다. 하나는 "온도", 하나는 "침전", 두 가지 중에서 생물 군계를 선택합니다. 변수 자체 (온도와 강수량)는 나중에 게임에서 실제로 사용되지 않습니다. 예를 들어, 사막에는 비가 없지만, 게임은 이것을 원래의 강수량 값이 아니라 "사막"속성에서 결정합니다.
랜덤 시드에서 바이오 메 맵을 생성하는 다양한 온라인 도구가 있습니다. 바이오 메 mineatlas.com 입니다. 내부적으로 MineCraft 자체의 내부 클래스를 사용하는 Java 서버를 사용한다고 생각합니다. 소스 코드를 직접 사용할 수 있는지 모르겠습니다.
예를 들어 Azgaar ( 소스 코드 )에서 사용하는 일반적인 알고리즘 입니다. 대략 다음과 같습니다.
래스터 기반 접근 방식이 아닌 벡터 형식 으로이 작업에 관심이 있다면 얼마 전에 블로그 게시물을 작성했습니다.
http://blog.particracy.com/worlds-and-their-geography/
아이디어는 메쉬 (보로 노이 기반)로 시작하고 충분히 떨어져있는 무작위 시드 지점에서 동심으로 영역을 성장시키는 것입니다.