Що таке визначення, алгоритми та практичні рішення для увігнутого корпусу? [зачинено]


116

Опуклий корпус

Опуклий корпус форми визначається як:

У математиці опуклий корпус або опукла оболонка для набору точок X у реальному векторному просторі V - мінімальний опуклий набір, що містить X ( Вікіпедія )

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

Увігнутий корпус

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

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

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

Мені не вдалося знайти належного визначення, алгоритму та практичного рішення для поняття увігнутий корпус. У Grass Wiki є деякі описи та зображення , а на concavehull.com є комерційне рішення .

Будь-які ідеї, алгоритми та посилання?


У якому контексті ви хочете створити увігнуті корпуси / форми альфа? У PostGIS, ArcMap, веб-карті, власне програмне забезпечення?
fmark

Як PostGIS, так і власний сценарій Python.
Адам Матан

Чи існує сумісна з C ++ Linux версія реалізації алгоритму увігнутого корпусу?
Sylv255

Якщо у вас є нове запитання, будь ласка, задайте його, натиснувши кнопку Задати питання . Додайте посилання на це питання, якщо це допомагає надати контекст. - З огляду
Злий геній

Бібліотека алгоритмів обчислювальної геометрії (CGAL) - це бібліотека C ++ з альфа-формами. Він завантажує Linux і ліцензується як GPL / LGPL для версії> = 4.0.
klewis

Відповіді:


57

Як вказує scw , ви хочете реалізувати α-фігури .

Альфа-форми можна вважати узагальненням опуклого корпусу. Вперше вони були описані в 1981 році:

Edelsbrunner, H .; Кіркпатрик, Д .; Seidel, R .; , "Про форму набору точок у площині", Інформаційна теорія, IEEE Угоди про, т.29, №4, стор 551- 559, липень 1983 р.

Реалізації з відкритим кодом існують для середовищ, які вас цікавлять:

PostGIS

Якщо ви використовуєте стек PostGIS, необов'язкове розширення pgRouting Driving Distance відкриває реалізацію альфа-форми. Я не впевнений, чи можна змінювати параметр альфа.

Використання нижче:

SELECT the_geom AS alpha_shape 
FROM 
  points_as_polygon(
    'SELECT id, ST_X(your_geom) AS x, ST_Y(your_geom) AS y FROM your_table');

Пітон

Напевно, існує багато модулів python, які ви могли б використовувати. Я чув хороші речі про CGAL , бібліотеку обчислювальної геометрії C ++. Обгортки Python існують для частин CGAL, включаючи розкриття реалізації альфа-форми CGAL на Python .

Пам’ятайте, що частини CGAL мають ліцензію відповідно до QPL, а це означає, що якщо ви розповсюджуєте свою програму, пов’язану з CGAL, вам може знадобитися випустити її під QPL. Добре зберігати свій код власним, якщо ви не перерозподілите код програми або бінарні файли.


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

2
@fmark: Друге посилання, яке ви опублікували, схоже, мертве.
radek

1
@fmark Посилання PostGIS, здається, мертві ..
radek

41

Ось що ви шукаєте.

Ви можете завантажити та протестувати програму: (в java, під ліцензією GPL)

alt текст

Документ, що представляє алгоритм, є:

Duckham, M., Kulik, L., Worboys, MF, Galton, A. (2008) Ефективне генерація простих багатокутників для характеристики форми множини точок у площині. Розпізнавання візерунків v41, 3224-3236


29

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

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

альфа-корпус техасу від флікр


1
OMG джерело написано FORTRAN :-)
Адам Матан

Існує пакунок ключів, написаний на C ++, якщо це вам більше підходить; але будьте обережні з ліцензуванням на CGAL: github.com/straup/Clustr
scw

2
Гарний приклад із реального світу.
DavidF


19

Я створив високоефективний інструмент, який називається [ласбундард] [1,2], який обчислює увігнутий корпус для LIDAR у форматі LAS / LAZ / SHP / ASCII і зберігає результат у вигляді векторного полігону в форматі ESRI Shapefile або гео -віднесений файл KML.

Ось приклад запуску:

C:\lastools\bin>lasboundary -i SerpentMound.las -o SerpentMound_boundary.shp
reading 3265110 points and computing convex hull for 3265110 points
growing inward towards concave hull (with concavity = 50)
outputting the concave hull
concave hull has 1639 points

Деякі результати результатів є тут .



10

Ось функція R, яка реалізує модель Альфа Халла. Вихід - об'єкт багатокутника sp. Приклад див. У заголовку. Для цього потрібні пакети sp, alphahull та maptools.

** Оновлення (15-15-2018) У результаті отриманих численних змін об’єктів, отриманих пакетом alphahull, відбулися численні зміни. Як таке, мені потрібно було переписати функцію. Я додав функцію izboxHull до пакету просторового Еко. Однак через обмеження ліцензування в пакеті alfahull ця функція доступна лише у розробній версії на GitHub. Версія розробки може бути встановлена ​​за допомогою:

library(devtools)
install_github("jeffreyevans/spatialEco")

Ось приклад використання функцій

library(sp)
library(spatialEco)
data(meuse)
 coordinates(meuse) = ~x+y
a <- convexHull(meuse, alpha=100000)
  plot(a)
    points(meuse, pch=19)

Перетворіть отримані SpatialLinesDataFrame в SpatialPolygonsDataFrame

library(sf)
a <- sf::st_as_sf(a) 
a <- sf::st_polygonize(a)
class( a <- as(a, "Spatial") )
  plot(a)

Перевірте кілька значень альфа

par(mfcol=c(2,2))
   for (a in c(500, 1500, 5000, 100000)) {
   ch <- convexHull(meuse, alpha = a)
     plot(ch)
      points(meuse, pch=19)
        title( paste0("alpha=", a))      
   }

різні альфа-параметри


+1 Чи можете ви пояснити, чим це відрізняється від пакета форм альфа ?
whuber

3
Вихідний об'єкт альфа-корпусу зберігається у вигляді матриці і повинен бути примушений до об'єкта sp, який може бути використаний. Я вважаю це функцією "помічником" для створення багатокутника, який можна експортувати у формат GIS. Ця функція використовує пакет alfahull для створення об'єкта матриці корпусу, створення об’єкта sp, а потім вибухує слот полігона, щоб він був об'єктом фрейму даних багатокутника. Ніщо не відображається в довідці про пакет, але може бути нещодавно реалізований власний примус до об'єкта sp класу, про який я не знаю. Якщо це так, будь ласка, повідомте мене, щоб я міг вийти з експлуатації цю функцію.
Джеффрі Еванс

Яка мова програмування?
Адам Матан

Дякую @JeffreyEvans, мені вдалося налагодити це. Чи могли б ви пояснити параметри? Я переглянув пов'язаний папір jstatsoft, але це досить непроникно.
геотеорія

9

JTS ( http://tsusiatsoftware.net/jts/main.html ) забезпечує реалізацію опуклого корпусу. Мартін Девіс також зазначив, що в роботі працює алгоритм Alpha Shape, тому ви, можливо, захочете перевірити сховище SVN, щоб перевірити, чи є в ньому ще, якщо це те, що ви хочете.


На сьогоднішній день, наскільки я можу сказати, жодна реалізація увігнутої форми корпусу / альфа на червень 2012 року.
blah238

Ще нічого в травні 2013 року
Crescent Fresh

JTS живий? Остання версія - з 19 грудня 2006 року. Vividsolutions.com/jts/JTSHome.htm
angelcervera

спробуйте посилання у відповіді
Ян Тертон

JTS зараз на Github, і наближається до версії 1.15: github.com/locationtech/jts Хоча, наскільки я можу сказати, все ще не існує реалізації Alpha Shapes.
Колін Вудбері


7

Ось програма, написана на С, яка обчислює опуклі корпуси, альфа-форми, трикутники Делані та обсяги Вороного:

  • Халл - Кен Кларксон (2002)

Інший алгоритм опуклого корпусу з реалізаціями C і Java тут:


7

Щоб додати до попередніх відповідей на цю посаду, принаймні станом на QGIS 2.6 є увігнутий алгоритм корпусу

Параметри
Шар точок введення [вектор: точка]
вводить сюди опис параметрів

Поріг (0-1, де 1 еквівалентний опуклому корпусу) [номер],
тут
описуємо параметр Опис за замовчуванням: 0,3

Дозволити отвори [boolean]
помістити тут опис параметрів
за замовчуванням: True

Розділити геометрію багаточастин на геометричні одночастинки [булева]
За замовчуванням: Неправильно

Виходи Увігнутий корпус [вектор]
поклав сюди опис виводу

Використання консолі
обработка.runalg ('qgis: concavehull', введення, альфа, отвори, no_multigeometry, output)

Також Esri має інструмент " Мінімальна гранична геометрія" (управління даними)

Що дозволяє вибрати тип геометрії, що включає опуклий корпус

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



3

Щоб допомогти з частиною вашого питання "правильне визначення"; ви, можливо, подивилися на https://en.wikipedia.org/wiki/Convex_hull і отримали те, що цілком можна вважати "правильним" визначенням, але виявило його відсутність, тому, можливо, більш "корисним" визначенням є:

Для кожної точки всередині опуклого корпусу пряма лінія до будь-якої точки, яка не знаходиться в корпусі, буде перетинати корпус лише один раз.

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

  • Жодного перетину точка не знаходиться в корпусі.
  • Одна точка перетину точка знаходиться на корпусі.
  • Два перетину точка знаходиться в межах корпусу
  • Пряма лінія не може перетинати опуклий корпус більше ніж двічі

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