Заливка окружности методом прямого перебора пикселей

Метод заливки окружности с использованием прямого перебора пикселей заключается в том, чтобы проверить каждый пиксель внутри заданного радиуса и определить, находится ли он внутри окружности или нет. С помощью данного алгоритма можно заполнить (зарисовать) любую окружность.

Теоретическое обоснование метода заключаются в использовании свойства квадрата и теоремы Пито: "в выпуклый четырёхугольник можно вписать окружность тогда и только тогда, когда суммы его противоположных сторон равны" (см. Рис.1).


Рис.1. Теорема Пито: сумма длин противоположных сторон a+b+c+d = a+b+c+d

Из данного обоснования можно вывести идею, что если любую окружность можно вписать в квадрат, то перебирая все точки внутри квадрата, можно проверять каждую точку на принадлежность вписанной окружности, используя математическое уравнение круга: X2 + Y2 ≤ R2
Закрасив все такие точки, мы нарисуем и саму окружность, и круг, который этой окружностью ограничен (см. Рис.2).


Рис 2. Синий квадрат показывает границы квадрата ABDC, внутри которого происходит просчёт принадлежности точек кругу

Алгоритм (см. алгоритм заливки окружности на JS):

  1. Выбираем центр окружности (x0, y0) и радиус R.
  2. Перебираем все пиксели в пределах квадрата со стороной 2R вокруг центра (от x0-R до x0+R по оси X и от y0-R до y0+R по оси Y).
  3. Для каждого пикселя проверяем условие принадлежности к окружности: если расстояние от этого пикселя до центра меньше или равно радиусу, то закрашиваем его.
  4. Повторяем шаг 3 для всех пикселей.

Данный алгоритм имеет сложность O(N2) и выгодно отличается от обобщенного рекурсивного алгоритма заполнения многоугольников потребляемой памятью, имея примерно такое же время работы применимо к окружности. Также, данный алгоритм гарантированно не переполняет стек вызовов, что позволяет закрашивать ему окружность любого радиуса. Недостатками являются сравнительно малая скорость заполнения и сложность O(N2).