Предположим, у вас есть матрица из белых пикселей с небелым кружком внутри. Чтобы обнаружить круг, я бы сделал это следующим образом:
for(int x = 0; x < matrix.width; x++){
for(int y = 0; y < matrix.height; y++){
if(matrix[x][y] != white) {
GetCircleCenter(x, y);
return;
}
}
}
Теперь, когда вы знаете, что пиксель (x, y) является частью круга, давайте создадим метод, чтобы найти его центр.
Предположим, найденный вами пиксель отмечен желтым цветом. Теперь наша цель - найти два пикселя, отмеченные синим цветом:
Чтобы найти это, давайте сгенерируем два небольших значения v1 и v2, скажем v1 = v2 = 1.
Теперь мы проверим это:
Color c = matrix[x][y];
int v1 = 1, v2 = 1;
while(matrix[x - v1][y] == c) v1 *= 2;
while(matrix[x + v2][y] == c) v2 *= 2;
Когда этот метод завершится, вы знаете, что левый синий пиксель будет находиться между (x - v1) и (x - v1 / 2), а правый синий пиксель будет между (x + v2 / 2) и (x + v2). Вы можете выполнить двоичный поиск, чтобы быстро найти точные пиксели.
Когда вы найдете оба пикселя, вы узнаете горизонтальный центр круга. Теперь проделайте то же самое с вертикальным центром, и вы получите центр вашего круга.