Как заполнить круг с увеличением радиуса? - PullRequest
2 голосов
/ 17 марта 2011

В рамках более сложного алгоритма мне нужно следующее:

  • допустим, у меня есть круг с радиусом R1, нарисованный на дискретной сетке (изображение) (зеленый на изображении ниже)
  • Я хочу нарисовать круг с радиусом R2, который больше, чем R1, на один пиксель (красный на изображении ниже).
  • На каждом шаге алгоритма рисовать круги с увеличивающимся радиусом таким образом, чтобы каждый раз, когда я заполнялкружок.

enter image description here

Как найти точки, которые нужно заполнить на каждом шаге, чтобы в конце каждого шага я полностью подал кружок?

Я думаю о каком-то алгоритме растеризации круга, но это приведет к некоторым пробелам в заполнении.Другим способом является использование некоторой математической морфологической операции, такой как расширение, но это кажется вычислительно дорогостоящим делом.

Я обычно ищу способ сделать это для произвольной формы, но изначально будет достаточно алгоритма окружности.

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

Мое текущее решение для круга.

На основе хорошо известного Алгоритма окружности средней точки

  • создание набора точек для 1 октанта для радиуса R1 (светло-зеленыйпикселей)
  • создать набор точек для одного октанта для радиуса R2 (темно-оранжевые пиксели)
  • для каждой строки в изображении сравнить координату X для оранжевых и зеленых пикселей и получить 0 или 1 (или любое другое) число промежуточных пикселей (светло-оранжевый).
  • повтор для каждого октанта (где для некоторых октантов вместо столбцов нужно сравнивать столбцы)

Этот алгоритм может быть применендля других типов параметрических фигур (например, на основе кривой Безье)

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

enter image description here

2 голосов
/ 17 марта 2011

Лучший вариант - нарисовать и закрасить чуть большим красным кружком, а затем нарисовать и залить зеленым кружком. Затем повторите следующую итерацию.

Рисовать только границу в 1 пиксель довольно сложно. Ваш образец изображения даже не совсем соответствует. В некоторых местах белый пиксель находится по диагонали относительно зеленого пикселя, а в других местах этот пиксель красный.

Edit:

  • borderPixels = пустой набор
  • Для каждого зеленого пикселя, p
    • Для каждого соседа n до p
      • Если n - белый
        • Добавить n к * borderPixels`
  • Делайте что хотите с borderPixels (например, окрашивайте их в красный цвет)
1 голос
/ 17 марта 2011

Другой вариант - нарисовать круг / форму с красной рамкой шириной 2 пикселя, а затем нарисовать зеленый заполненный круг / форму без границы. Который должен оставить приблизительно 1px широкий край. Это зависит от того, как какой бы метод вы ни использовали, преобразует строки в пиксели.

Алгоритмы окружностей, как правило, оптимизированы для рисования окружностей ..... См. Ссылку здесь

...