Я кодирую игру, и я хотел бы иметь возможность найти центр масс произвольной формы на черно-белом растровом изображении, например:
012345678
0.XX......
1..XXX....
2...XXX...
3..XXXXXXX
4...XXX...
Все "клетки" имеют одинаковый вес. Соседние по диагонали ячейки не считаются связанными, и форма всегда будет одиночной, поскольку до этого она уже разделялась другой функцией.
Он будет использоваться только для изображений с достаточно низким разрешением (возможно, не более 50х50) и не должен быть сверхточным, скорость предпочтительна.
У меня такое чувство, что есть правильный способ сделать это, но я не знаю, зачем искать Google.
Я кодирую это в 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;
}