Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Рисование невыпуклого многоугольника со свечением

Подскажите алгоритм (можно и реализацию,желательно на C++) рисования многоугольника с регулируемыми мягкими краями.
Все что дано: координаты точек, последовательным соединением которых получаем многоугольник(возможно невыпуклый), квадратное изображение, для которого отсутствует возможность рисования каких либо примитивов. Можно изменять лишь байты, отвечающие за каналы пикселей в этом изображении.
Пример результата:
Чисто математический подход оказался слишком ресурсоемким. Пытался для каждой стороны(отрезка) многоугольника определить 1. с какой стороны относительно этого отрезка находится пиксель(точки расположены последовательно так, чтобы они соединялись линиями по часовой стрелке, то есть справа от отрезка всегда находилась внутренняя часть фигуры) 2. определить, может ли падать перпендикуляр от моей точки(пикселя) к отрезку 3. если может и 1 пункт выполняется, тогда пиксель возможно находится внутри фигуры. И если так работает для каждой стороны(в чем я не уверен, так как тестировал на примере трех сторон(только с выпуклой фигурой), тогда точка внутри 4. иначе находим точку пересечения отрезка и перпендикуляра(в случае выполнения пункта 2), перпендикулярно падающей от точки, находим расстояние - это и будет ответом, определяющим, на сколько нужно окрашивать пиксель, чтобы сделать плавный переход от краев. В другом случае, определять расстояние от ближней точки, образующей этот отрезок.
Вот такое оочень громоздкое получилось описание, а реализация еще требовательнее к ресурсам, даже не хочется смотреть, что где подкорректировать можно((


Ответ

Вот что получилось
Для каждой строки определил точки пересечения со сторонами многоугольника Отсортировал их по x координате Каждая пара этих координат и является началом и концом горизонтального отрезка, поэтому рисуем их
UPD: 4. для размытия краев применяется прямой blur ко всему изображению, что не очень продуктивно, поэтому лучше применять Distance Transform (кажется, этот метод применяется в графических редакторах для генерирования теней

Комментариев нет:

Отправить комментарий