Для пикселизации геометрических примитивов - PullRequest
1 голос
/ 02 февраля 2012

Необходимо иметь матричное представление набора геометрических примитивов (т. Е. Линии, кривой, круга, прямоугольника, а также их заполненных форм).Для простоты вы можете предположить, что мы имеем дело только со строками, поэтому ответ уже на [ SO ] .Поэтому прямоугольники могут быть легко пикселированы.Однако для остальных примитивов мне задаются два вопроса:

1) Как сделать пикселизацию кривой, включая круг (~ замкнутая кривая)?
2) Как сделать пикселизацию заполненного/ сложная форма (прямоугольник, мульти-патч)?

Простейшим способом (используемым в настоящее время) может быть использование библиотеки визуализации (например, MatPlotLib для Python) для сохранениярезультат (карта геометрических примитивов) в виде пиксельного изображения на диске (или в ОЗУ), а затем повторно использовать его в целях интереса.По-видимому, этот метод может справиться с любой сложностью, поскольку в фоновом режиме независимо от того, что он (визуализатор) делает, получается 2D image, то есть 2D matrix.Однако в этом приложении возникают серьезные проблемы:

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

1 Ответ

3 голосов
/ 20 февраля 2012

То, что вы делаете, называется «преобразованием сканирования» геометрических примитивов.

Для сегментов линии вы уже знаете о алгоритме Брезенхема .

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

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

Для заполнения многоугольников доступен алгоритм линии сканирования (рассмотрите горизонтальную прямую и заполните между пересечениями контур многоугольника).

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

Соответствующие материалы вы найдете по адресу http://www.cse.ohio -state.edu / ~ gurari / course / cis681 / cis681Ch5.html

...