Знаходження граничних координат із заданого набору точкових координат?


18

Дано набір координат, Як знаходимо граничні координати.
набір координат <== Рисунок 1
З огляду на координати у наведеному вище наборі, Як я можу отримати координати на червоній межі. Межа - це багатокутник, який формується вхідними координатами для вершин, таким чином, щоб він максимізував площу.

Я працюю над додатком, який шукає властивості в межах «х» миль від міста . Що у мене є:

  1. Координати всіх властивостей.
  2. Набір координат для кожного міста (у мене одна координата на кожен поштовий індекс. А оскільки у більшості міст є більше одного блискавки, кожне місто має набір координат)

Причина, яку я прошу про максимальну площу, полягає в тому, що я не придумав багатокутник, як описаний нижче:

кривий багатокутник <== Малюнок 2

Мені потрібно алгоритм, щоб придумати набір координат для кордону. Алгоритм, який дозволить мені створити граничні координати для рисунка 1 .



4
Ні, не дублікат, це опуклий корпус, а не увігнутий
Nicklas Avén

1
Ви шукаєте код, теоретичні довідки чи рішення у конкретних існуючих програмних середовищах?
WolfOdrade

1
@Khaja Ні, ви не хочете максимально збільшувати площу, ви хочете мінімізувати її серед усіх опуклих багатокутників, що містять точки. (Єдиний спосіб максимально збільшити площу - використовувати весь світ як містить багатокутник.)
whuber

1
@whuber Так, тепер я бачу, що ти маєш на увазі, я хочу опуклий багатокутник з мінімальною площею. Моя кінцева мета - зробити пошук близькості. Ми хочемо, щоб наш пошук близькості працював: У даному місті (опуклий корпус), якщо ми шукаємо будинки (кожен будинок має координату) в межах "х" миль, він повинен дати мені всі будинки, які знаходяться всередині опуклий корпус або знаходяться на ортогональній відстані менше, ніж на "х" миль
Хаджа Міньядюддін,

Відповіді:


21

Існує багато алгоритмів для вирішення цієї проблеми ( Вікіпедія "Convex_hull_algorithms" ):

  • Упаковка подарунків aka Jarvis march - O (nh): Один з найпростіших алгоритмів. Він має O (nh) часову складність, де n - кількість точок у множині, а h - кількість точок у корпусі. У гіршому випадку складність становить O (n2).
  • Грейм-скан - O (n log n): дещо складніший, але набагато ефективніший алгоритм. Якщо точки вже відсортовані за однією з координат або за кутом до фіксованого вектора, то алгоритм займає час O (n). [ псевдокод ]
  • QuickHull: Як і алгоритм quicksort, він має очікувану складність у часі O (n log n), але в гіршому випадку може вироджуватися до O (nh) = O (n2). [ ілюстрований опис ]
  • Ділимо і перемагаємо - O (n log n): Цей алгоритм також застосовно до тривимірного випадку.
  • Монотонний ланцюг - O (n log n): Варіант сканування Грема, який сортує точки лексикографічно за їх координатами. Коли вхід вже відсортований, алгоритм займає час O (n).
  • Алгоритм нарощеного опуклого корпусу - O (n log n)
  • Шлюб перед завоюванням - O (n log h): Оптимальний алгоритм, залежний від виходу.
  • Алгоритм Чана - O (n log h): Простіший оптимальний алгоритм, що чутливий до виходу.

Дякуємо, що перерахували ці @underdark ... який з них обрали?
Марін




1

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

Ви зможете прискорити трасування, відкинувши спочатку пересічні лінії. Зовнішня межа не матиме перетинів.

btw - FME також зробить це з трансформаторами ConvexHullAccumulator або ConvexHullReplacer!


1

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

Див. ConvexHull.cs

Між іншим, NTS та купа інших бібліотек завернуті у класний проект під назвою DotSpatial, знайдений тут

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