Впорядкування набору неорганізованих точок по кривій


9

У мене є набір 3D-точок (які я відновлюю з бібліотеки, яка виконує тесселяцію твердого тіла), що належать кривій (тобто краю твердого тіла). Це означає, що крива, безумовно, проходить повз кожну з цих точок.

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

Чи є відомий підхід до подібного типу проблем?

Деякі додаткові відомості:

  • Криві загалом параметричні (сплайни / безьє, кружечки).
  • Точки задаються у вигляді координат з плаваючою комою.
  • Окуляри упаковані дуже щільно (але вони можуть бути такими ж щільними, як я хочу). Щоб дати вам уявлення, для кривої, яка займає 19 одиниць у х, 10 одиниць у х і 5 одиниць в z, я наводжу послідовність точок у відрізку кривої: (20.7622, ​​25.8676, 0) (20.6573, 25.856, 0) (20.5529, 25.8444, 0) (20.4489, 25.8329, 0) (20.3454, 25.8213, 0)

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

@joojaa Так, ти маєш рацію. Але оскільки упаковка очок дуже щільна, я не очікую, що вона буде точною. Якщо я все-таки отримаю правильний порядок, я планував з'єднати послідовність точок як полілінію.
andrea.al

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

@ MartinBüttner Так, у мене є доступ до параметричної форми кривої, якщо вона потрібна.
andrea.al

1
Будь ласка, покажіть типовий набір точок!
Ів Дауст

Відповіді:


6

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

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


4

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

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

  • Визначте двох найближчих сусідів до кожної точки. ЦеО(нжурналн)операція .
  • Вам доведеться провести певну обробку для кінцевих точок. Їх двома найближчими сусідами будуть наступні дві точки по кривій, а не одна з кожної сторони. Ви можете їх виявити евристично, якщо відношення відстаней до двох сусідів відрізняється більш ніж на деякий поріг (1,5 скажімо, залежить від плавності вашої кривої та наскільки щільно упаковані точки). Або ви можете ставитися до даних найближчого сусіда як до графіка, в якому ви побачите, що два сусіди кінцевих точок вказують один на одного (що не має відбуватися ніде в графіку).
  • Тепер ви можете просто вибрати одну кінцеву точку і пройтися по найближчих сусідів (завжди вибираючи ту, з якої ви не приїхали), щоб пройти точки по кривій.

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


3

Оскільки у вас є лише представлення точок з плаваючою комою, немає гарантії, що вони все ще лежать саме на кривій, через помилки округлення. Тому я думаю, що єдиний загальний підхід полягає в тому, щоб визначити, де на кривій вони опинилися, знайшовши найближчу точку на кривій до вашого зразка(Х,Y,Z). Наприклад, якщо ваша параметрична крива(х(т),у(т),z(т)) тоді ви можете спробувати мінімізувати

(Х-х(т))2+(Y-у(т))2+(Z-z(т))2

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

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

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