Припустимо, у мене є 2D сітка, що складається з неонових трикутників , і набору точок { p i } M i = 1 ⊂ ∪ N k = 1 T K . Який найкращий спосіб визначити, у якому трикутнику лежить кожна з точок?
Наприклад, на наступному зображенні маємо , p 2 ∈ T 4 , p 3 ∈ T 2 , тому я хотів би функцію f, яка повертає список f ( p 1 , p 2 , p 3 ) = [ 2 , 4 , 2 ] .
Matlab має функцію pointlocation, яка робить те, що я хочу для мереж Delaunay, але воно не вдається для загальних сіток.
Моя перша (німа) думка полягає в тому, що для всіх вузлів перегляньте всі трикутники, щоб з'ясувати, в якому трикутнику знаходиться p i . Однак це вкрай неефективно - вам, можливо, доведеться перебирати трикутник для кожної точки, тому це може зайняти роботу O ( N ⋅ M ) .
Моя така думка, для всіх точок , знайти найближчий вузол сітки з допомогою найближчих сусідів пошуку, потім подивитися через трикутники , приєднані до цього найближчого вузла. У цьому випадку робота буде O ( a ⋅ M ⋅ l o g ( N ) ) , де a - максимальна кількість трикутників, приєднаних до будь-якого вузла в сітці. З цим підходом є кілька вирішуваних, але дратівливих проблем,
- Це вимагає здійснення ефективного пошуку найближчого сусіда (або пошуку бібліотеки, яка має його), що може бути нетривіальним завданням.
- Він вимагає збереження списку, який трикутники приєднані до кожного вузла, на який мій код наразі не налаштований - зараз є лише список координат вузла та список елементів.
Загалом це здається неелегантним, і я думаю, що повинен бути кращий шлях. Це має бути проблема, яка виникає дуже багато, тому мені було цікаво, чи хтось може порекомендувати найкращий спосіб підійти до пошуку трикутників, у яких є вузли, теоретично чи з точки зору наявних бібліотек.
Спасибі!