我正在编写一个游戏,我希望能够在黑白位图上找到任意形状的质心,如下所示:
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 avg; }
Yuval Adam.. 19
这个算法(伪代码)如何基于你的例子中的布尔矩阵:
xSum = 0 ySum = 0 points = 0 for point in matrix if point is marked xSum += pointX ySum += pointY points++ return (xSum/points, ySum/points)
没有什么太复杂,计算X最大的存在,Y相同,除以你计算的点数,你得到质量中心.你可以通过在平均值中给出不同的权重来进一步使这一点复杂化,但这应该是你的主要方向.
这个问题让我想到了这个问题的扩展,我找不到一个好的答案.我在这里发布了这个问题:在矩阵/位图中查找质量簇
这个算法(伪代码)如何基于你的例子中的布尔矩阵:
xSum = 0 ySum = 0 points = 0 for point in matrix if point is marked xSum += pointX ySum += pointY points++ return (xSum/points, ySum/points)
没有什么太复杂,计算X最大的存在,Y相同,除以你计算的点数,你得到质量中心.你可以通过在平均值中给出不同的权重来进一步使这一点复杂化,但这应该是你的主要方向.
这个问题让我想到了这个问题的扩展,我找不到一个好的答案.我在这里发布了这个问题:在矩阵/位图中查找质量簇