절차 적으로 생성 된 맵에서 베이와 해협을 어떻게 확인할 수 있습니까?


40

Voronoi 셀을 사용하여 정의 된 해수면과 믿을 수있는 높이지도를 사용하여 절차 적으로 생성 된지도를 얻었습니다.

흐름

지금까지 토지, 바다, 호수, 강, 강어귀, 합류점, 산 및 생물 군계와 같은 특정 지형 기능에 라벨을 붙이는 데 성공했습니다. 생물 군계에는 툰드라, 대림, 초원 및 온대림이 포함됩니다. 거기에는 몇 가지 다른 생물 군계가 있지만 내 목적 상 지금은 중요하지 않습니다.

다음에 만과 해협에 레이블을 지정하고 싶지만, 올바르게 수행하는 방법에 대한 손실이 있습니다. 만은 바다와 직접 연결되는 오목한 해안 수역입니다.

해협은 자연적으로 형성된 좁은 수로로 바다의 두 부분을 연결합니다. 기본적으로 두 조각의 땅이 거의 닿아 있고 양쪽에 바다가 있습니다. "채널"이라고도합니다.

기능을 결정하기 위해 다음과 같이 유형별로 기능을 반복 할 수 있습니다.

for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
  // loop through lands
  for each (var cell:Cell in feature.cells)
  // loop through cells
    for each (var neighbor:Cell in cell.neighbors)
    // loop through a cell's neighbors
      trace(neighbor.hasFeatureType(Geography.LAND));

8
베이 시안 분류기를 권장합니다.
Acccumulation

1
@Acccumulation 이것은 "베이"에 말장난입니까 아니면 이것이 심각한 제안입니까? 후자 인 경우 이에 대한 적절한 답변을 작성해야합니다.
빌립보

나는 그가 농담을하고 있다고 99 % 확신합니다.
Olin Kirkland

답변:


29

Dragons Abound가 베이를 식별 하는 방법 은 해안선을 따라 걸으며 지점 사이의 직선 거리가 지점 사이의 해안선 거리보다 작은 해안선에서 두 지점을 찾는 것입니다. 이것이 두 지점 사이의 해안선 의 동요 입니다. 지점 사이의 직선 거리에 대한 sinuosity limit 및 limit을 선택하면 좁은 베이, 넓은 베이 등을 식별 할 수 있습니다.

이 그림에서 빨간색과 보라색 점은 두 개의 후보 점을 나타내고 녹색 선은 점 사이의 해안선입니다. sinuosity는이 두 길이의 비율입니다.

만의 예

또는 해안에서 두 점을 선택하고 두 점과 해안선을 두 점 사이에 연결하여 다각형을 만들 수 있습니다 (즉, 위의 녹색 선을 빨간색 점에서 보라색 점으로 연결). 이 다각형의 면적을 측정하십시오. 베이는 베이가 아닌 것보다 넓은 면적을 갖습니다.

내 경험상이 두 가지 조치의 조합은 사람들이 베이로 보는 것을 안정적으로 식별하는 데 가장 좋습니다.

이것도 포인트를 감지합니다. 만만 찾으려면만의 "내부"에 땅이 아닌 물이 포함되어 있는지 확인해야합니다. 이를위한 빠르고 쉬운 방법은 두 점 사이의 선의 중간 점을 확인하여 물인지 확인하는 것입니다. (이것은 속일 수 있지만 일반적으로 충분합니다.)

관련된 문제는 베이의 "입"을 식별하는 것입니다. 즉, 베이의 개구부를 표시하는 두 지점에 가장 적합한 선택입니다. 일반적으로 "입"에 대한 많은 후보자가 있습니다. 위의 예제 맵에서 해당 베이의 입을 추가 또는 추가로 배치 할 수 있습니다. 일반적으로 말하면 그것은별로 중요하지 않지만 합리적으로 잘 작동하는 휴리스틱 중 하나는 입을 가로 지르는 직선 거리를 최소화하는 것입니다.

나는 아직 해협을하지 않았지만, 직관은 해안선을 따라 다른 지점에서 가장 가까운 지점을 찾기 위해 지점을 확인하는 것입니다. 만약 그것이 정해진 한계 아래 있다면 그것은 해협입니다.


3
Dragons Abound에 필요한 답이 있다는 것을 알고 있어야합니다.
Olin Kirkland

48

다음은 이미지 처리 변환을 사용하여 관심있는 기능을 분리하는 대략적인 아이디어입니다.

  1. 모든 해양 세포의 마스크를 만들기 위해 해양 세포에서 홍수 채우기를 적용하십시오. 하천 설정 방법에 따라 바다 마스크가 내륙으로 흘러 가지 않도록하기 위해 추가 고도 또는 여유 기준이 필요할 수 있습니다. ;)

    오션 마스크

  2. 이 마스크의 가장자리에 로컬 스무딩을 적용하여 연결 / 토폴로지를 동일하게 유지하지만 산만 할 수있는 작은 시끄러운 해안선 기능을 부드럽게합니다. 이를 통해 작은 입구의 큰 만에 집중할 수 있습니다. 필터 커널의 폭 / 반복 횟수를 사용하여 보존하는 기능의 규모를 정교하게 제어 할 수 있습니다.

    여기에서 중간 필터를 몇 번 적용했습니다. 셀룰러 오토마타는 잡음이 많은 입력에서 부드러운 모양을 침식하는 또 다른 일반적인 방법입니다.

    부드러운 해안선

  3. 마스크를 거리 필드로 바꾸고, 각 셀은 부드러운 해안선과의 거리를 저장합니다.

    거리 필드

이제 몇 가지 유망한 기능이 강조 표시됩니다. 서명 된 거리 필드에서 베이와 해협은 양쪽으로 거리가 떨어지면서 예리한 능선으로 표시됩니다. 가장자리 감지 필터를 사용하여이 융기 부분을 튀어 나올 수 있습니다.

릿지 강조

그런 다음 능선을 따라 연결을 결정하여 베이와 해협을 구별 할 수 있습니다. 만은 해안을 향해 뻗어있는 릿지로, 끝에서 끝날 때까지지면에서 멀어지고 얕아집니다. 해협은 고 거리 지역을 다른 고 거리 지역과 연결하여 저 거리 지역을 통과하는 능선입니다.

또는 다른 방법으로 각 섬에 ID (연결된 구성 요소 검색)를 할당 한 다음 거리 필드를 만들 때 거리 경계와 함께 "가장 가까운 섬 ID"를 전파합니다. 그 후, 베이 또는 유입구는 양쪽에서 동일한 육지에 인접한 물에 융기 부인 반면, 수로는 두 개의 서로 다른 육지에 인접한 물을 분리하는 융 기부입니다.

예를 들어 지나치게 좁거나 넓은 해협을 배제해야하는 경우 라벨링 할 형상을 제어하기 위해 최소 및 최대 해안 거리 또는 리지 길이 제한을 설정할 수 있습니다.


9
이것은 정말 멋져 보이고 그래픽 표현이 아닌 다양한 단계를 적용하기 위해 셀 구조를 직접 사용하여 상당히 가속화 될 수 있습니다!
Quentin

7
두 번째 접근법 (각각의 고유 한 토지 질량을 ID로 지정하고 수역 양쪽에서 동일한 토지 질량인지에 따라 구별)은 가장 쉬운 방법으로 보입니다 ..
Monty Harder

"landmass ID"는 섬 이름을 생성하기 위해지도 라벨링에서 필요하기 때문에 어쨌든 좋은 생각입니다.
MSalters

6

기본적으로 베이 또는 해협에 의한 의미, 정확히 의미 및 왜 차별화해야하는지 (AI 계산 또는 랜드 마크 등의 레이블에 대해) 생각해야합니다. 당신에게 가장 적합한 것을 찾기 위해 몇 가지 정의를 가지고 놀아보십시오. 그런 다음 Voronoi 셀을 확인하기위한 조건을 공식화하십시오. 몇 가지 제안 :

  • 하나의 다른 해양 세포에만 연결되는 모든 해양 세포
  • OR : 해양 세포보다 더 많은 육지에 연결된 해양 세포
  • 또는 : 위와 동일하지만 경계 길이를 기준으로 기준이 적용됩니다 (예 : 물 경계보다 토지의 두 배)

좁은

  • 서로 인접하지 않은 정확히 두 개의 해양 세포에 연결된 모든 해양 세포
  • OR : 동일한 육상에 속하지 않는 두 개의 육상 세포에 연결된 모든 해양 세포 (먼저 어떤 육상 세포가 연결되어 있는지 확인하고 각 육상에 ID를 할당해야 함)
  • 또는 : 국경을 따라 행진하고 토지 / 물 및 물 / 땅 전환을 계산합니다. 각각 두 개 이상이 필요합니다.
  • 방법과 범주로 수행하려는 작업에 따라 베이로만 이어지는 해협을 제거하거나 대신 베이로 레이블을 지정할 수 있습니다.

2
해협이만으로 이어지는 경우,이 둘은 피요르드로 표시 될 수 있습니다.
빌립보

1
셀이 베이 / 해협의 크기에 비해 작은 경우, 인접 이웃을 넘어서 셀을 보려면이를 전파해야 할 수도 있습니다.
DMGregory

예, 스케일링은 약간의 문제이며 사물을 정의하고 '셀'을 선언하는 방법에 영향을 미칩니다. 캐나다지도를 고려하여 허드슨 베이, 제임스 베이, 세인트 로렌스 만, 베이 오브 펀디를 비교해보십시오. 원하는 관련 이름을 얻기 위해 이러한 규칙을 어떻게 안정적으로 적용합니까? 뉴 펀들 랜드와 노바 스코샤 사이에 "직선"이 있습니까?
TheLuckless
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.