当前位置:  开发笔记 > 编程语言 > 正文

在2D位图上查找质心

如何解决《在2D位图上查找质心》经验,为你挑选了1个好方法。

我正在编写一个游戏,我希望能够在黑白位图上找到任意形状的质心,如下所示:

 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相同,除以你计算的点数,你得到质量中心.你可以通过在平均值中给出不同的权重来进一步使这一点复杂化,但这应该是你的主要方向.


这个问题让我想到了这个问题的扩展,我找不到一个好的答案.我在这里发布了这个问题:在矩阵/位图中查找质量簇



1> Yuval Adam..:

这个算法(伪代码)如何基于你的例子中的布尔矩阵:

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相同,除以你计算的点数,你得到质量中心.你可以通过在平均值中给出不同的权重来进一步使这一点复杂化,但这应该是你的主要方向.


这个问题让我想到了这个问题的扩展,我找不到一个好的答案.我在这里发布了这个问题:在矩阵/位图中查找质量簇

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有