我在这个区域有一个带有"点"的2D区域.我现在正试图检测点的"簇",即具有一定高密度点的区域.
有关如何优雅地检测这些区域的任何想法(或链接到有想法的文章)?
我正在编写一个游戏,我希望能够在黑白位图上找到任意形状的质心,如下所示:
012345678 0.XX...... 1..XXX.... 2...XXX... 3..XXXXXXX 4...XXX...
所有"细胞"具有相同的重量.对角相邻的单元格不被认为是连接的,并且形状将始终是单个单元格,因为在此之前它已经被另一个函数拆分.
它仅用于合理的低分辨率(最多50x50)图像,并且它不需要超精确,速度更好.
我觉得有一种正确的方法可以做到这一点,但我真的不知道谷歌的用途.
我在Actionscript 3中编写了这个代码,但是如果人们理解它们,那么任何语言的例子都会受到赞赏.
编辑:随意假设数据存储在您认为对您的示例最方便的任何数据结构中.我正在使用位图,但二维数组甚至单个数组也很好!
编辑:这是我最终使用的代码,它很可能会更快地完成,但我发现它非常易读:
// _bmp is a private BitmapData instance
public function getCenterOfMass():Point {
var avg :Point = new Point(0, 0);
var points :uint = 0;
for (var ix:uint = 0; ix < _bmp.width; ix++) {
for (var iy:uint = 0; iy < _bmp.height; iy++) {
if (_bmp.getPixel(ix, iy) == ACTIVE_COLOR) {
avg.x += ix;
avg.y += iy;
points++;
}
}
}
avg.x /= points;
avg.y /= points;
return …Run Code Online (Sandbox Code Playgroud) 我半回答了一个关于在位图中找到质量簇的问题.我说半答案是因为我把它放在一个条件下,我将位图中的所有点按质量分类并留给读者来过滤从同一个簇中删除点的列表.
然后在考虑这一步时,我发现解决方案并没有像我想象的那样跳出来.所以现在我要求你们帮忙.我们有一个像这样的质量点的列表(一个Python的元组列表,但你可以用任何语言表示它):
[ (6, 2, 6.1580555555555554),
(2, 1, 5.4861111111111107),
(1, 1, 4.6736111111111107),
(1, 4, 4.5938888888888885),
(2, 0, 4.54),
(1, 5, 4.4480555555555554),
(4, 7, 4.4480555555555554),
(5, 7, 4.4059637188208614),
(4, 8, 4.3659637188208613),
(1, 0, 4.3611111111111107),
(5, 8, 4.3342191043083904),
(5, 2, 4.119574829931973),
...
(8, 8, 0.27611111111111108),
(0, 8, 0.24138888888888888) ]
Run Code Online (Sandbox Code Playgroud)
每个元组的形式如下:
(x, y, mass)
Run Code Online (Sandbox Code Playgroud)
请注意,列表在此处排序.如果您的解决方案更喜欢不对它们进行排序,那就完全没问题了.
如果你还记得,那么挑战就是找到主要的质量集群.群集的数量尚不清楚.但是你知道位图的尺寸.有时,群集中的多个点的质量大于下一个(大小)群集的中心.所以我想做的是从更高质量的点开始并移除同一簇中的点(附近的点).
当我尝试这个时,我最终不得不一遍又一遍地浏览列表的一部分.我有一种感觉,我只是愚蠢.你会怎么做?伪代码或真实代码.当然,如果你能用Python代码从我离开的那个地方起飞,我就更容易进行实验.
下一步是弄清楚位图中确实有多少个簇.我仍然在努力定义这个问题所以我可能会回答一个问题.
编辑:我应该澄清,我知道这个问题没有"正确"的答案.问题的名称是关键.完成了我的聚类的第一阶段.我正在寻找一种快速,准确 - "足够"的方法来过滤掉附近的点.
如果你知道如何让问题更清楚,请告诉我.