Простір заповнення між випадковими 2D рядками


23

Розглянемо область (2D), заповнена рядками випадковим чином (наступний малюнок). Ми зацікавлені, щоб заповнити порожні проміжки між рядками, включаючи чотири граничні краї таким чином:

0- максимізація розміру посилок;
1- форма заповнення посилок квадратно вирівняна горизонтально або вертикально;
2- форма заповнення посилок - квадратна, тобто розслаблене вирівнювання ;
3- форма заповнення посилок - це будь-який чотирикутник. наше оригінальне запитання

Тож наразі існує три різних сценарії.
Зауважте, що рядки мають форму [x1,y1,x2,y2]точок форми , дійсні числа.

[* * *] Ідеї ​​можливих рішень / алгоритмів / фрагментів коду / тощо більше ніж вітаються.

введіть тут опис зображення


Оновлення 1: Ми можемо керувати рішенням у першому випадку:
введіть тут опис зображення
кроки:
1- рядок
2- растрові лінії в растрову карту;
3 - пошук довколишніх осередків для кожної комірки потрібного кольору (тобто одного кольору) з цільовою функцією для максимального використання площа, тобто кількість комірок.

Він працює добре, проте охоплює лише перший сценарій, а також повільно.


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


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

Математичний погляд на проблему можна викласти так:
2D: Знайдіть усі прямокутники, які можна було б дістати з даної 2D області, деякими лініями, оптимізованими для більшого розміру прямокутника.
3D: Знайдіть усі прямокутні кубики, які можна було б витягти з даної 3D-області з деякими підплощинами (краще: багатокутники), оптимізованими для більшого розміру блоку.


Оскільки це є частиною поточного дослідження, на деякі запитання в коментарях нижче немає певних відповідей. Ми вважаємо, що наданої тут інформації тут справді достатньо, щоб отримати загальну картину проблеми. Тим не менш, ми надаємо деякі деталі, наскільки це можливо, для переваг громади.
Ви можете поставити деякі обмеження щодо вирішення остаточного питання, хоча, на наш погляд, завжди можна додати більше пізніше. Наприклад, виконайте такі дії: {2D case}
Найкращий розмір блоку (економічно оптимальний прямокутник), який потрібно витягти за умов, зазначених вище, 1x1 mнаведено 10x10 mдля регіону в прикладі. Це одне обмеження, визначене на основі економічної цінності. Мінімальний працездатний розмір для різання тощо0.15x0.15 m; так що це друга межа розміру.
введіть тут опис зображення
На малюнку вище показана функція економічного значення залежно від розміру блоку. Тож для цього конкретного випадку кожен шматок гірської породи менше, ніж 0.15x0.15 mпросто відходи. Розмір блоку не буде більшим, ніж 1.7x1.7 mчерез обмеження експлуатації.


3
@RK - Я не згоден. Він / він уже чітко заявив, що шукає. Звичайно, існує декілька можливих рішень, але нічого не може зупинити їх корисність і голосування.
GIS-Jonathan

1
Оскільки це питання щодо алгоритміки, яке може бути досить важким з математики, ви можете спробувати - math.stackexchange.com
GIS-Jonathan

1
Тісно пов'язані: gis.stackexchange.com/questions/27303 . На це запитання, як зазначає @RK, немає однозначної відповіді, оскільки він недостатньо добре поставлений. Скільки прямокутників дозволено? Що означає "максимізувати розмір"? Зауважте також, що це не проблема "випадкових плиток": рядки просто визначають через їх доповнення площі, які можна зайняти; рішення точно не будуть випадковими. Також зауважте, що тут же доступне просте спрощення: проблему можна вирішити окремо у кожному компоненті доповнення.
whuber

1
@whuber: Ну, одна з прикладів, які ми зацікавлені в ньому, - це дізнатись про розподіл видобувних недоторканих блоків «скелі» в сильно розбитій «шахті». Ну, на нашу думку, ГІС здається перспективною для цієї проблеми. Це ми також додали до питання. Ми здогадуємось, що ГІС-спільнота може отримати користь від цієї ідеї для інших пов'язаних з цим проблем. У будь-якому випадку, від вас залежить, якщо ви перемістите його;)
Розробник

4
Як підказує @whuber, це насправді не питання ГІС (хоча я не ображаюся, що його тут задають.) Ви матимете набагато більше шансів отримати відповідь на форумі для обчислювальної геометрії чи оптимізації.
Llaves

Відповіді:


2

Я маю уявлення про те, як ви ітеративно працюєте від великих блоків до менших блоків за допомогою FME (від Safe Software.) Для запису я не працюю на них, але, здається, досить хваліть їх інструмент ...

  1. Використовуйте "BoundingBoxReplacer" у зоні, що цікавить.
  2. Відхиліть його в локальній системі координат (для подальшого, коли вам потрібно "плитка" в футах / метрах.)
  3. Буферні лінії з трансформатором "Bufferer". Вам потрібен лише довільний розмір, скажімо, .01 фут / метр. Ми шукаємо тут багатокутник лінії для наступного кроку.
  4. Додайте трансформатор "Плитка". Вкажіть великий (орієнтовний чи інший) розмір плитки в футах або метрах. Що ми тут робимо, це підбивати область інтересу в квадратні блоки. Залежно від набору даних, почніть великий, щоб дійсно отримати великих людей.
  5. Додайте трансформатор "Clipper". Ми робимо тут, по суті, розбиваємо набір даних, щоб побачити, які плитки є хорошими / поганими. На виході плитки, які знаходяться "Всередині", занадто великі. Однак плитки, які знаходяться «зовні», досить великі і готові до різання ...
  6. Ось де це складно, але не важко ... Ми збираємося обв’язати трансформатор, щоб ми повторно використовували оригінальний BoundingBox, але вирізали ділянки, які вже готові до різання. Отже, додайте машинку для відсікання та направляйте Кліппер як плитку "Вихід" на попередній вихід кліппера. Зараз у нас є один багатокутник, який готовий знову працювати.
  7. Скористайтеся плиткою ще раз, вказавши меншу плитку. Наприклад, якщо раніше ви використовували 100-метрову плитку, спробуйте 90 метрів.
  8. Додайте ще одну машинку для стрижки, при цьому вхідна машинка для стрижки є буферними лініями, а вхідна кліпса - меншими плитками як вхідними.

Промийте та повторіть стільки разів, скільки потрібно, використовуючи менші плитки кожен раз. Я додав початок верстака, який би використовував як один підхід.

Виходячи з вашого (добре деталізованого) опису, він наразі працюватиме лише з вашим варіантом 1. Не приділяючи занадто багато часу лише.

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

Приклад плитки FME

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.