Важлива примітка. Ця відповідь не відповідає дійсному запитанню, але вона залишалася невизначеною на запит. Збентежено я переплутав шестигранну та шестикутну. Питання полягає у сортуванні точок у довільних шестигранних осередках у 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
). Математика має вбудований, але є ймовірність, що ваша система цього не зробить. Якщо це так, будь ласка, перегляньте це питання про те, як ефективно реалізувати таку функцію (або просто піти з наївною лінійною реалізацією часу, якщо у вас немає величезної кількості балів).