Утворіть багатокутники з набору прямих, що перетинаються


10

Це просте і досить поширене питання, яке вже задавались для різних цілей (див. Це посилання, і це теж , наприклад), тут, однак, ми шукаємо не програмний пакет, а алгоритми, які ми могли б спробувати реалізувати, скажімо в Пітон .

Отже, як показано нижче, набір ліній відображається на карті (вони вже обрізані, BTW).
Алгоритми / ідеї для генерування полігонів (як показано червоних) ?

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


Чи відома межа Зовнішньої площі чи це теж слід читати із вхідних рядків?
Devdatta Tengshe

Відповіді:


6

Ну, ми ставимо тут відповідь, яка не є повною відповіддю на наше запитання, тобто питання залишатиметься " відкритим для відповіді ". Однак це рішення проблеми в питанні. Ось хитрість, яку ми використали:

Спочатку дозвольте побачити результати :
введіть тут опис зображення

Отже, задані лінії у leftпобудованих багатокутників показані на middle. Вони є справжніми багатокутниками, як показано на right;)

Для наведеного нижче алгоритму ми використовували Shapelyпакунок в Python .

  • рядки ==> MultiLineString {:: M}
  • додати крихітний buffer, скажімо eps{:: MB}
  • region ==> Polygon {:: P} (регіон тут - квадрат)
  • P.difference(MB) {отримані багатокутники}

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


4

JTS Topology Suite має клас Polygonizer, який в значній мірі робить це.

Ви можете подивитися вихідний код, доступний тут , і перетворити його на Python.


Оскільки в описі коду сказано, що він не працюватиме так, як очікував автор запитання: "краї повинні бути правильно введені; тобто вони повинні відповідати лише в їх кінцевих точках. Полігонізатор буде працювати на неправильно введеному вході, але не утворюватиме багатокутники з -номатовані краї »
Пабло

1
В межах JTS існує операція з правильного розбиття рядків на вершини. Можливо, і ОП міг би на це поглянути.
Devdatta Tengshe

3

Ви можете подивитися на пакет Python Shapely, зокрема полігонізувати ()


Швидка примітка, що полігонізація в Shapely ( from shapely.ops import polygonize) використовує GEOS.Polygonize від GEOS . Отже, це посилання, де є посилання на посилання ...: |
Розробник

Наші випробування з polygonizeвзагалі не були успішними. Однак дякую, що нагадали, Shapelyщо ми могли знайти рішення (насправді трюк), яке було опубліковане як відповідь.
Розробник

2

Ось ще одне рішення, яке ми могли б знайти.

Використовуючи DCELми можемо робити блоки з дотикових ліній.

Для Python є пакет {тут} . Це крихітна реалізація з деякими помилками. Тим не менш, з певними зусиллями його можна використати для вирішення цієї проблеми. Також зверніть увагу на наступні етапи:

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


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