Если вы сами обрабатываете свои пиксели, и ваша цель - повысить производительность, вы можете просто сфокусироваться на квадрате [x - radius; x + radius] * [y - radius; y + radius]
, поскольку точки вашего круга живут здесь.Это избавит вас от множества бесполезных итераций, если, конечно, вы МОЖЕТЕ сфокусироваться на этой области (т.е. ваши пиксели - это не просто массив без индекса на строку и столбец).
Вы даже можете быть уверены, что пикселив квадрате [x - radius*sqrt(2)/2; x + radius*sqrt(2)/2] * [y - radius*sqrt(2)/2; y + radius*sqrt(2)/2]
должен быть цветным, с базовой тригонометрией (максимальный квадрат внутри круга).
Так что вы можете сделать:
import math
half_sqrt = math.sqrt(2) / 2
x_max = x + half_sqrt
y_max = y + half_sqrt
for (i in range(x, x + radius + 1):
for (j in range(y, y + radius + 1):
if (x <= x_max and y <= y_max):
colorize_4_parts(i, j)
else:
pixel = get_pixel(i, j)
if (pixel.x - circle.x)**2 + (pixel.y - circle.y)**2 <= circle.radius:
# Apply same colors as above, could be a function
colorize_4_parts(i, j)
def colorize_4_parts(i, j):
# Hoping you have access to such a function get_pixel !
pixel_top_right = get_pixel(i, j)
pixel_top_right.set_color(circle.color)
pixel_top_left = get_pixel(2 * x - i, j)
pixel_top_leftt.set_color(circle.color)
pixel_bot_right = get_pixel(i, 2 * y - j)
pixel_bot_right.set_color(circle.color)
pixel_bot_left = get_pixel(2 * x - i, 2 * y - j)
pixel_bot_leftt.set_color(circle.color)
Это оптимизировано для сокращения дорогостоящих вычислений доминимум.
РЕДАКТИРОВАТЬ: функция обновлена, чтобы быть более эффективной снова: я забыл, что у нас была двойная симметрия горизонтальная и вертикальная, поэтому мы можем вычислять только для верхнего правого угла!