重要な注意:この回答は実際の質問には答えませんが、リクエストごとに削除されずに残されました。恥ずかしいことに、六面体と六角形を混同しました。問題は、ポイントを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にはこれが組み込まれていますが、システムに組み込まれていない可能性があります。この場合、このような関数を効率的に実装する方法に関するこの質問を参照してください(または、処理するポイントが大量にない場合は、単純な線形時間実装を使用してください)。