Сортуйте хмару точок відносно неструктурованої сітки шестигранних комірок


11

Питання

Як би ви сортували хмару точок відносно неструктурованої сітки шестигранних комірок?

Кожна комірка має центр та унікальну мітку для її представлення. В основному є дві точки хмари (оригінальна хмара точок та хмара точок центрів комірок), але інформація про геометрію комірки (обмежувальна рамка) може бути корисною, я не впевнений.

Результати

Я кілька запитував і шукав літературу:

якщо сітка є шестигранною та неструктурованою, проблема зводиться до пошуку ортогонального діапазону. Для цього найчастіше використовують kd дерева. Якщо сітка вдосконалена на основі структури даних octree, навколо неї може бути побудований алгоритм пошуку діапазону. Мета полягає в тому, щоб уникнути роботи з геометрією прямої сітки та зосередитись на хмарній точці А - співвідношення хмарних точок В. Хмарна точка А: точки запиту, хмара точки В: центральні комірки сітки.


Чи можете ви уточнити, що ви маєте на увазі, говорячи "сортувати щодо (будь-якої) сітки"? Ви шукаєте алгоритм бінінгу (скільки балів у кожній комірці)?
Szabolcs

Я не розумію вашого питання досить чітко, яка мета сортування балів? Як зробити сітку більш регулярною?
Shuhao Cao

Існує окрема точкова хмара, розсіяна по неструктурованій сітці обсягу. Мені потрібно передавати дані з клітинних центрів до точки хмари та навпаки.
tmaric

1
@ tomislav-maric: Чи можете ви, будь ласка, написати своє рішення як відповідь, а потім прийняти власну відповідь? Ця процедура є загальноприйнятою практикою ефективно відповідати на власне запитання, а не додавати до питання тег "[SOLVED]"; Крім того, це заробить вам більше репутації, адже люди можуть підтримати вашу відповідь.
Джефф Оксберрі

Відповіді:


8

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


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

Математика - це те, що я знаю, тому я збираюся показати вам, як це зробити в Mathematica, але метод можна перенести на інші системи. Ідея полягає в тому, що шестикутна решітка є двоїстою трикутної: вона може формуватися як діаграма Вороного з точок у трикутному розташуванні. Точка від хмари належить даному шестикутнику, якщо він ближче до центру цього шестикутника, ніж до центру будь-якого іншого шестикутника.

Цей метод буде працювати і для сіток різної форми, доки вони можуть бути створені як діаграма Вороного деякого розташування точок. (Наприклад, шестикутники не повинні бути регулярними.)


Давайте генеруємо сітку. Це трикутна решітка:

pts = Join @@ Table[{x, Sqrt[3] y}, {x, 0, 4}, {y, 0, 2}];

points = Join[pts, TranslationTransform[{1/2, Sqrt[3]/2}] /@ pts];

Needs["ComputationalGeometry`"]
PlanarGraphPlot[points, LabelPoints -> False]

Графіка математики

Його подвійний - це шестикутний, який нас цікавить:

DiagramPlot[points, LabelPoints -> False]

Графіка математики

Це будує функцію, nfяка знаходить індекс центру шестикутника, до якого деяка точка хмари є найближчою. Це ключ до методу:

nf = Nearest[N[points] -> Range@Length[points]];

Тепер давайте генеруємо хмару з 1000 випадкових точок і сортуємо їх за nf:

cloud = RandomReal[{-1/2, 5}, {1000, 2}];

indices = First /@ nf /@ cloud;

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

Histogram[indices]

Графіка математики

... або кольором кожного з них ...

Show[
 DiagramPlot[points, LabelPoints -> False],
 Graphics@MapThread[{ColorData[3][#1], Point[#2]} &, {indices, cloud}],
 PlotRange -> All, AspectRatio -> Automatic
 ]

Графіка математики

... або робити якусь фантазійну візуалізацію, яку ми хочемо.

tally = Tally[indices];

ListDensityPlot[Join[points, List /@ Sort[tally][[All, 2]], 2], 
 InterpolationOrder -> 0, 
 Epilog -> (Text[#2, points[[#1]]] & @@@ tally), 
 PlotRange -> {{-.5, 5}, {-.5, 5}}, Mesh -> All, 
 ColorFunction -> (ColorData["BeachColors"][1 - #] &)]

Графіка математики


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


Дуже дякую! В основному, мені потрібно співвідношення, яке показує зв'язок між кожною точкою та "бункером", як ви його назвали (3-х мірна шестигранна коробка). Те, що ви пропонуєте, здається дуже цікавим, але я маю справу з мільйонами мільйонів коробок і сотнями тисяч точок потенційно .. Питання полягає в тому, що коштує більше: створення подвійної сітки або робота з обмежувальними полями "бункерів" і використанням kd дерево для пошуку. Я дуже новачок у цій темі, тому мені дуже не хочеться йти в неправильному напрямку.
tmaric

к

Не обов'язково видаляйте його, хтось може вважати його корисним! :) Можливо, вирішення проблеми може перетворити піут, я просто не можу його прийняти, поки не прочитаю про це.
tmaric

І дякую за таку детальну відповідь, якби я міг би, я дав би більше балів! :)
tmaric

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