Алгоритм рисования круга для n-пиксельной границы - PullRequest
1 голос
/ 11 сентября 2011

Я знаю bressenham и связанные с ним алгоритмы, и я нашел хороший алгоритм для рисования круга с границей шириной 1 пиксель. Существует ли какой-либо «стандартный» алгоритм для рисования круга с границей шириной в n-пиксель без восстановления рисования n кругов?

Рисование пикселя и n ^ 2 окружающих пикселей может быть решением, но оно рисует гораздо больше пикселей, чем необходимо.

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

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Считайте это проблемой растеризации:

Возьмите ограничительную рамку вашего кольца. Рассмотрим строки изображений, попадающие в ограничивающую рамку. Для каждой строки вычислите пересечение с 2 кружками (т.е. решите x ^ 2 + y ^ 2 = r ^ 2, поэтому x = sqrt (r ^ 2-y ^ 2) для каждого, для x, y относительно окружности центры. Заполните промежутки. Повторите для следующего ряда.

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

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

1 голос
/ 11 сентября 2011

Вычислите точки для одного октанта для обоих радиусов одновременно и одновременно воспроизведите его восемью путями, как обычно в любом случае рисуются круги Брезенхэма.Чтобы избежать перерисовки (например, для рисования XOR), второй октант должен быть ограничен для рисования вне x-экстентов первого октанта.

Обратите внимание, что этот подход ломается, если линия очень толстая по сравнению с радиусом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...