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