Сортировка облака точек по неструктурированной сетке из шестигранных ячеек


11

Вопрос

Как бы вы отсортировали облако точек относительно неструктурированной сетки шестигранных ячеек?

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

Полученные результаты

Я немного расспросил и искал литературу:

если сетка является шестигранной и неструктурированной, задача сводится к поиску ортогонального диапазона. Для этого чаще всего используются деревья kd. Если сетка уточняется на основе структуры данных октодерева, алгоритм поиска диапазона может быть построен вокруг нее. Цель состоит в том, чтобы избежать работы с прямой геометрией сетки и сконцентрироваться на облаке точек A - отношении облака точек B. Облако точек A: точки запроса, облако точек B: центры ячеек сетки.


Можете ли вы уточнить, что вы имеете в виду, когда говорите «сортировать по (любому) типу сетки»? Вы ищете алгоритм биннинга (сколько точек в каждой ячейке)?
— Сабольч

Я не совсем ясно понимаю ваш вопрос, какова цель сортировки баллов? Как сделать сетку более регулярной?
— Шухао Цао

По неструктурированной сетке объема разбросано отдельное облако точек. Мне нужно передать данные из сотовых центров в облако точек и наоборот.
— tmaric

1
@ tomislav-maric: Не могли бы вы написать свое решение в качестве ответа, а затем принять свой собственный ответ? Эта процедура, как правило, является общепринятой практикой для эффективного ответа на ваш собственный вопрос, а не для добавления тега «[решено]» к вопросу; Кроме того, это заработает вам больше репутации, потому что люди могут поднять ваш ответ.
— Джефф Оксберри

Ответы:


8

Важное примечание: этот ответ не отвечает на фактический вопрос, но он был оставлен без ответа для каждого запроса. Я смущенно перепутал шестигранные и шестиугольные. Речь идет о сортировке точек в произвольные гексаэдрические ячейки в 3D, в то время как это решение сортирует точки в правильные шестиугольные ячейки в 2D, или нерегулярные, которые соответствуют некоторому тесселяции Вороного в любом измерении. Этот метод применим только в том случае, если сетка была сгенерирована как тесселяция Вороного в первую очередь (что, кажется , иногда используется подход ).


Я не уверен, что вы подразумеваете под сортировкой здесь, но я предполагаю, что вы хотите отсортировать точку в шестиугольные ячейки на плоскости.

Mathematica - это то, что я знаю, поэтому я собираюсь показать вам, как это сделать в 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). В Mathematica это встроено, но есть шанс, что ваша система этого не делает. Если это так, пожалуйста, ознакомьтесь с этим вопросом о том, как эффективно реализовать такую ​​функцию (или просто используйте наивную линейную реализацию времени, если у вас нет большого количества точек для обработки).


Большое спасибо! По сути, мне нужны отношения, которые показывают связь между каждой точкой и «корзиной», как вы ее назвали (трехмерная шестигранная коробка). То, что вы предлагаете, кажется очень интересным, но я имею дело с сетками из миллионов ящиков и сотен тысяч точек потенциально. Вопрос в том, что стоит дороже: создание двойной сетки или работа с ограничивающими блоками "корзин" и использование kd дерево для поиска. Я очень новичок в этой теме, поэтому я действительно не хочу идти в неправильном направлении.
— tmaric

@ tomislav-maric Извините, я неправильно понял ваш вопрос. К сожалению, я также новичок в этой теме, и несколько дней назад я даже не был знаком с -d деревьями (как вы можете видеть из вопроса SO, с которым я связан). Кроме того, я не уверен, что ваша сетка может вообще соответствовать тесселяции Вороного (вероятно, нет), поэтому мой метод может быть здесь бесполезен. Я думаю, лучше удалить этот ответ, поскольку он вводит в заблуждение. k
— Сабольч

Не удаляйте это, кто-то может найти это полезным! :) Это может превратиться в дуться, чтобы решить проблему, просто я пока не могу принять это, пока не прочитал об этом.
— tmaric

И спасибо за такой подробный ответ, если бы я мог, я бы дал вам больше очков! :)
— tmaric

@ tomislav-maric Глядя на голоса, я беспокоюсь, что мой ответ уменьшит вероятность того, что вы получите полезный ответ, или внесет вклад в недоразумение. Я думаю, что это более продуктивно, если я удалю.
— Сабольч
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.