Як можна визначити затоки та протоки в процедурно сформованій карті?


40

У мене є процедурно згенерована карта з використанням комірок Вороного, із визначеним рівнем моря та вірогідною картою висоти.

Поточний

Поки що я мав успіх у маркуванні певних географічних особливостей: суходолу, океану, озер, річок, лиманів, впадіння, гір та біомів. Біоми включають тундру, бореальний ліс, луки та помірний ліс. Там також є пара інших біомів, але для моїх цілей вони зараз не важливі.

Я хотів би позначити бухти і протоки поруч, але я втрачаю проблеми, як це зробити правильно. Бухта - це заглиблене прибережне водойма, яке безпосередньо з’єднується з океаном.

Пролива - це природний утворений вузький водний шлях, який з'єднує дві частини океану. В основному, де два шматки землі майже торкаються, а океан з обох боків. Також називається "канал".

Щоб визначити особливості, я можу переглядати будь-яку функцію за типом типу:

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
Я рекомендую базіанський класифікатор.
Накопичення

1
@ Накопичення Це каламбур на "бухті" чи це серйозна пропозиція? Якщо останнє, вам слід написати належну відповідь з цього приводу.
Філіп

Я на 99% впевнений, що він жартує.
Олін Кіркленд

Відповіді:


29

Те, як Драконівський багатство визначає затоки, - це пройти вздовж берегової лінії та знайти дві плями на узбережжі, де пряма відстань між плямами менша за відстань уздовж берегової лінії між плямами. Це синусність берегової лінії між двома плямами. Вибравши межу синусості та обмеження прямолінійної відстані між плямами, ви можете визначити вузькі глибокі затоки, широкі неглибокі затоки тощо.

На цьому малюнку червоні та фіолетові точки показують дві точки кандидата, а зелена лінія - берегову лінію між точками. Синусостійкість - це відношення цих двох довжин:

Приклад затоки

Крім того, ви можете виділити дві точки на узбережжі та створити багатокутник, з'єднавши дві точки та берегову лінію між двома точками (тобто з'єднайте вище зелену лінію від червоної точки до фіолетової точки). Виміряйте площу цього багатокутника. Бухта матиме більшу площу, ніж не затока.

На мій досвід, поєднання цих двох заходів було найкращим для надійного визначення того, що люди сприймають як затоки.

Зверніть увагу, що це також виявить точки. Щоб знайти лише затоки, потрібно перевірити, чи «всередині» затоки міститься вода, а не земля. Швидкий і простий спосіб зробити це - перевірити середину лінії між двома точками, щоб побачити, чи це вода. (Це можна обдурити, але зазвичай достатньо.)

Пов'язана проблема полягає у визначенні "гирла" затоки - тобто, найкращого вибору для двох точок, які позначають отвір для заливу. Зазвичай у вас буде купа кандидатів на "рот". У наведеній вище прикладі карти ви можете поставити гирло цієї затоки далі або далі. Взагалі кажучи, це, мабуть, не має великого значення, але одна евристика, яка працює досить добре, - це мінімізувати відстань прямолінійно через рот.

Я ще не робив протоки, але моя інтуїція полягає в тому, щоб перевірити пункти вздовж берегової лінії, щоб знайти найближчу точку на будь-якій іншій береговій лінії; якщо це знаходиться під деякою встановленою межею, це протока.


3
Я мав би знати, що Дракони рясніють, мені потрібні відповіді.
Олін Кіркленд

48

Ось приблизна ідея з використанням перетворень обробки зображень для виділення особливостей, що цікавлять:

  1. Нанесіть заливку від океанічної клітини, щоб зробити маску з усіх океанських клітин. Залежно від того, як налаштовані ваші ріки, вам може знадобитися додатковий критерій підняття або кліренсу, щоб запобігти течії океанської маски у внутрішні місця. ;)

    Океанська маска

  2. Нанесіть локальну розгладжування до краю цієї маски, зберігаючи таку саму зв'язаність / топологію, але вирівнюючи невеликі галасливі риси берегової лінії, які можуть відволікати увагу. Це дозволяє зосередити увагу на великих затоках над крихітними впускними отворами. Ви можете використовувати ширину ядра фільтра / кількість ітерацій, щоб тонко контролювати масштаб збережених функцій.

    Тут я кілька разів застосував середній фільтр. Стільникові автомати - ще один популярний спосіб стирання гладких фігур із галасливого введення.

    Згладжена берегова лінія

  3. Перетворіть маску в поле відстані, де кожна клітина зберігає свою відстань від згладженої берегової лінії.

    Відстань Поле

Тепер ми бачимо деякі перспективні основні моменти. У підписаному відстані поле і затоки, і протоки виявляються різкими хребтами, при цьому відстань падає в сторони. Ми можемо використовувати фільтр виявлення країв, щоб вискочити ці пасма:

Ріджі виділені

Потім можна розрізнити затоки та протоки, дотримуючись хребта, щоб визначити його зв’язність. Бухта - це хребет, який проходить до узбережжя, стає дрібнішим і дрібнішим (на відстані від суші), поки не закінчиться в точці. Пролива - це хребет, який з'єднує область великої відстані з іншою областю на великі відстані, проходячи через область нижньої відстані по шляху.

Або інший спосіб - присвоїти кожному острову ідентифікатор (пошук підключеного компонента), тоді, коли ви робите поле відстані, поширюйте "найближчий ідентифікатор острова" поруч з межею відстані. Затока або вхідний отвір - це хребет у воді, що примикає до однієї і тієї ж суші з обох сторін, тоді як канал - це хребет, який розділяє воду, що прилягає до двох різних земельних масивів.

Ви можете встановити мінімальні та максимальні обмеження відстані до берега або довжини хребта, щоб контролювати функції, які слід позначити, наприклад, якщо вам потрібно виключити надмірно вузькі / широкі протоки.


9
Це виглядає дуже здорово, і, ймовірно, його можна значно прискорити, використовуючи безпосередньо структуру комірок для застосування різних етапів, а не графічного зображення!
Квентін

7
Другий підхід (присвоєння кожній окремій сухопутній ідентифікації та розрізнення виходячи з того, чи є це однакова суша з обох сторін водойми) здається найпростішим ділом ..
Monty Harder

"Ідентифікатор наземної маси" в будь-якому випадку є хорошою ідеєю, оскільки він вам також знадобиться в маркуванні карт для створення назв островів.
MSalters

6

В основному, вам потрібно подумати про те, що саме ви маєте на увазі затоку або протоку, і чому ви хочете їх диференціювати (це для розрахунків AI, або для позначення орієнтирів чи щось інше?). Пограйте з кількома визначеннями, щоб знайти те, що вам найбільше подобається. Потім сформулюйте умови, щоб перевірити свої клітини Вороного. Кілька пропозицій:

затока

  • Будь-яка океанічна клітина, яка з'єднується лише з однією іншою океанічною клітиною
  • АБО: Будь-яка океанічна клітина, яка з'єднується з більшою сушею, ніж океанічні клітини, з усіма океанічними клітинами поруч
  • АБО: Те саме, що вище, але з критерієм, що базується на довжині кордону (наприклад, вдвічі більше суходолу, ніж водний кордон)

Протока

  • Будь-яка океанічна клітина, яка з'єднує рівно дві океанічні клітини, які не знаходяться поруч
  • АБО: Будь-яка клітина океану, яка з'єднується з двома наземними осередками, які не належать до однієї сухопутної маси (потрібно з’ясувати, які наземні клітини з'єднані першими, і призначити ідентифікатори для кожної сухопутної маси)
  • АБО: березень біля кордону та рахуйте переходи землі / води та води / суші. Вам потрібно щонайменше два з кожного.
  • Залежно від вашого методу та того, що ви хочете зробити з категоріями, ви можете усунути протоки, які ведуть лише до бухти, або позначити їх як залив.

2
Коли протока веде до бухти, то ці два разом можуть бути позначені фіордом.
Філіп

1
Якщо клітини невеликі щодо розміру затоки / протоки, то, можливо, вам доведеться поширити це, щоб подивитися на клітини за межами сусідніх сусідів.
DMGregory

Так, масштабування - це проблема, яка вплине на те, як ви визначаєте речі та оголошуєте "комірки". Розгляньте карту Канади та порівняйте наступне: Гудзонова затока, Джеймс-Бей, затока Св. Лоуренса та Бухта Фунді. Як ви надійно застосовуєте ці правила, щоб отримати бажані пов’язані імена? - Чи існує "пряма" між Ньюфаундлендом та Новою Шотландією?
TheLuckless
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.