Использование линейного алгоритма Брезенхэма или аналогичного для заполнения прямоугольника

Я хотел бы создать заполненный прямоугольник из четырех точек, используя линейный алгоритм Брезенхема или аналогичный, чтобы получить гладкие стороны. Я наткнулся на этот ответ в Stack Overflow [link], который отлично подходит для создания линии между двумя точками. Как я могу использовать/изменить эту функцию для создания заполненного прямоугольника? Есть ли другой алгоритм, который мог бы лучше соответствовать моим потребностям?


person Blc    schedule 26.07.2017    source источник
comment
Прямоугольник всегда влезет в пиксели, ничего сглаживать не надо, может ты имеешь в виду четырехугольник?   -  person Gusman    schedule 27.07.2017
comment
@Gus: повернутый прямоугольник по-прежнему остается прямоугольником.   -  person TaW    schedule 27.07.2017
comment
Вы можете сначала создать прямоугольник, а затем выполнить заливку. Это действительно зависит от того, на какие примитивы вы ориентируетесь.   -  person TaW    schedule 27.07.2017
comment
@TaW Да, вы правы ... это проблема всегда использовать AABB XD, вы забываете о вращении.   -  person Gusman    schedule 27.07.2017
comment
Простую процедуру заливки см. здесь!   -  person TaW    schedule 27.07.2017
comment
использование заливки для этого медленно (но просто). В старые времена мы использовали заполнение выпуклым многоугольником, как в связанном дублирующем ответе. Вы создаете граничные интервалы с любой растеризацией линий, а затем просто визуализируете горизонтальные линии...   -  person Spektre    schedule 27.07.2017


Ответы (1)


Для произвольных повернутых прямоугольников:

Примечание: это описание соответствует реализации Wiki Wu с циклом for по оси OX, но эффективнее рисовать ребра по оси OY и заполнять горизонтальные линии.

Сортировать вершины по координате X
Сделать интервалы на горизонтальной оси разделенными вершинами
Для каждого интервала выбрать верхнюю и нижнюю кромки
Одновременно выполнить рисунок сглаживания Ву для верхней и нижней кромки

Для верхнего края нарисуйте верхний полупрозрачный пиксель

   draw: plot(ipart(intery)  , x, rfpart(intery))

и игнорировать нижний пиксель, использовать его позицию в качестве начала строки заполнения

   LineFrom(ipart(intery)+1, x)

Для нижнего края нарисуйте нижний полупрозрачный пиксель и используйте верхний как конец линии заливки.

Повторно инициализируйте отрисовку кромки при достижении угла.

person MBo    schedule 27.07.2017