重要说明:此答案不能回答实际的问题,但每个请求都保留不变。令人尴尬的是,我混淆了六面体和六角形。问题是关于将点分类为3D的任意六面体单元,而此解决方案则将点分类为2D的规则六边形单元,或者对应于任何维数Voronoi镶嵌的不规则点。仅当首先将网格作为Voronoi镶嵌生成时,此方法才适用(这似乎是偶尔使用的方法)。
我不确定这里所说的排序是什么意思,但是我假设您想将点分类为平面上的六角形容器。
我知道Mathematica,所以我将向您展示如何在Mathematica中进行操作,但是该方法可以移植到其他系统中。这个想法是六角形格子是三角形格子的对偶:它可以生成为三角形排列点的Voronoi图。如果来自云的点比给定的六边形的中心更靠近该六边形的中心而不是任何其他六边形的中心,则该点属于该六边形。
该方法也适用于不同形状的网格,只要它们可以作为某些点排列的Voronoi图生成即可。(例如,六边形不必是规则的。)
让我们生成网格。这是一个三角形格子:
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内置了此功能,但您的系统可能没有。如果是这种情况,请参见此问题,以了解如何有效地实现这样的功能(或者,如果您没有大量要处理的点,则可以使用朴素的线性时间实现)。