相对于非结构化六面体网格对点云进行排序


11

您将如何针对非结构化六面体网格对点云进行分类?

每个单元都有一个中心和一个代表它的唯一标签。基本上有两个云点(原始点云和单元中心的点云),但是我不确定单元格的几何信息(边界框)是否有用。

结果

我做了一些询问,并在文献中进行了搜索:

如果网格是六面体的并且是非结构化的,则问题将简化为正交范围搜索。为此,最常使用kd树。如果基于八叉树数据结构对网格进行细化,则可以在其周围构建范围搜索算法。目的是避免处理直接的网格几何,而专注于点云A-点云关系B。点云A:查询点,点云B:网格单元中心。


您能否澄清说“针对(任何一种)网格进行排序”的意思?您是否正在寻找分箱算法(每个单元格中有多少个点)?
Szabolcs'2

我不太清楚您的问题,对点进行排序的目的是什么?想要使网格更规则?
曹树浩2012年

在非结构化体积网格上散布着一个单独的点云。我需要将数据从单元中心传递到点云,反之亦然。
tmaric

1
@ tomislav-maric:能否请您将解决方案作为答案,然后接受您自己的答案?通常,此过程是有效回答您自己的问题的惯例,而不是在问题上添加“ [已解决]”标签;此外,它还会为您赢得更多声誉,因为人们可以投票支持您的答案。
Geoff Oxberry 2012年

Answers:


8

重要说明:此答案不能回答实际的问题,但每个请求都保留不变。令人尴尬的是,我混淆了六面体和六角形。问题是关于将点分类为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]

Mathematica图形

它的对偶是我们感兴趣的六角形:

DiagramPlot[points, LabelPoints -> False]

Mathematica图形

这建立了一个函数nf,该函数找到某个浊点最接近的六边形中心的索引。这是该方法的关键:

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

现在,让我们生成一个由1000个随机点组成的云,并按以下顺序对其进行排序nf

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

indices = First /@ nf /@ cloud;

indices包含每个浊点最接近的中心的索引。这就是我们需要的信息。现在我们可以从中制作直方图了...

Histogram[indices]

Mathematica图形

...或者给它们上色...

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

Mathematica图形

...或进行我们想要的任何形式的花式可视化。

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 - #] &)]

Mathematica图形


这里的关键点是找到最接近某点(Nearest)的函数。Mathematica内置了此功能,但您的系统可能没有。如果是这种情况,请参见此问题,以了解如何有效地实现这样的功能(或者,如果您没有大量要处理的点,则可以使用朴素的线性时间实现)。


非常感谢!基本上,我需要的是一种关系,该关系显示每个点与您所说的“ bin”(3维六面体框)之间的连接。您的建议似乎很有趣,但是我可能正在处理数以百万计的盒子和数十万个点的网格。搜索的树。我对这个话题还很陌生,所以我真的不想走错方向。
tmaric

@ tomislav-maric对不起,我误解了您的问题。不幸的是,我也是这个主题的新手,几天前我甚至还不熟悉 -d树(从链接到的SO问题中可以看到)。另外,我不确定您的网格是否完全对应于Voronoi细分(可能不是),因此我的方法在这里可能没有用。我认为最好删除此答案,因为这会误导您。k
Szabolcs

绝对不要删除它,有人可能会发现它有用!:)可能会把pout当作解决问题的方法,只是直到我读到它,我才接受它。
tmaric

感谢您提供这么详细的答案,如果可以的话,我想给您更多点!:)
tmaric 2012年

@ tomislav-maric查看投票结果,我很担心我的回答会减少您获得有用的答案或导致误解的机会。我认为如果删除它会更有效率。
Szabolcs'2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.