EDITED: 06 сентября 2017
Это алгоритм, изобретенный мной, чтобы нарисовать круг по целочисленной матрице. Та же идея может быть использована для записи круга внутри BufferedImage. Если вы пытаетесь рисовать этот круг с помощью класса Graphics, это не ваше антивирусное ПО, которое вы ищете (если вы не хотите изменять каждое назначение цвета с помощью g.drawLine (x, y, x + 1, y), но оно может быть очень медленным).
protected boolean runOnCircumference(int[][] matrix, int x, int y, int ray, int color) {
boolean ret;
int[] rowUpper = null, rowInferior = null, rowCenterUpper = null, rowCenterInferior = null;
if (ret = ray > 0) {
if (ray == 1) {
matrix[y][x + 1] = color;
rowUpper = matrix[++y];
rowUpper[x] = color;
rowUpper[x + 2] = color;
matrix[y][x] = color;
} else {
double rRay = ray + 0.5;
int r = 0, c = 0, ray2 = ray << 1, ray_1 = ray - 1, halfRay = (ray >> 1) + ray % 2, rInf,
ray1 = ray + 1, horizontalSymmetricOldC;
// draw cardinal points
rowUpper = matrix[ray + y];
rowUpper[x] = color;
rowUpper[x + ray2] = color;
matrix[y][x + ray] = color;
matrix[ray2 + y][x + ray] = color;
horizontalSymmetricOldC = ray1;
rInf = ray2;
c = ray_1;
for (r = 0; r < halfRay; r++, rInf--) {
rowUpper = matrix[r + y];
rowInferior = matrix[rInf + y];
while (c > 0 && (Math.hypot(ray - c, (ray - r)) < rRay)) {
rowUpper[x + c] = color;
rowUpper[x + horizontalSymmetricOldC] = color;
rowInferior[x + c] = color;
rowInferior[x + horizontalSymmetricOldC] = color;
// get the row pointer to optimize
rowCenterUpper = matrix[c + y];
rowCenterInferior = matrix[horizontalSymmetricOldC + y];
// draw
rowCenterUpper[x + r] = color;
rowCenterUpper[x + rInf] = color;
rowCenterInferior[x + r] = color;
rowCenterInferior[x + rInf] = color;
horizontalSymmetricOldC++;
c--;
}
} // end r circle
}
}
return ret;
}
Я пробовал это много раз, проверяя вручную его правильность, поэтому я думаю, что это сработает. Я не делал проверку диапазона только для упрощения кода. Надеюсь, это поможет вам и всем желающим нарисовать круг по матрице (например, тех программистов, которые пытаются создать свои собственные видеоигры на чистом коде и должны управлять матрично-ориентированной карточкой игры для хранения объектов, лежащих на game-map [если вам нужна помощь по этому поводу, напишите мне]).