Нарисуйте сглаженный прямоугольник со скругленными углами в С++

Как написано в заголовке, я хотел бы рисовать сглаженные прямоугольники со скругленными углами в С++ и в контексте Linux (ubuntu). Я уже пробовал SDL_gfx, но сглаживание недоступно для фигур roundedBox. Я также читал о SDL_Draw, но я думаю, что он не обеспечивает сглаживания.

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


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

Что я не объяснил в первом посте, так это то, что я уже использую SDL и opencv в своей программе. Итак, у меня возникла идея:

  • нарисуйте 1-канальный прямоугольник со скругленными углами с помощью SDL_gfx
  • сгладьте его с помощью cvSmooth, чтобы получить альфу сглаживания
  • использовать результат как альфа-канал простого прямоугольника

Что ты об этом думаешь ? сегодня вечером попробую!


person rkohser    schedule 08.11.2011    source источник
comment
Это сработало, но все еще немного уродливо.   -  person rkohser    schedule 12.11.2011


Ответы (1)


Единственные части фигуры, которые необходимо сглаживать, — это углы. нарисуйте четыре сглаженных четвертных круга, по одному в каждом углу (лучше всего подойдет алгоритм круга Сяолинь Ву), и замкните промежутки простыми линиями. Если фигуры не будут вращаться (то есть все прямые линии будут либо вертикальными, либо горизонтальными), используйте алгоритм линии без сглаживания Брезенхема, в противном случае используйте алгоритм линии Ву. Алгоритмы сглаживания Ву обычно самые быстрые и дают очень хорошие результаты.

Если вы действительно хотите оптимизировать свой результат и знакомы с программированием на ассемблере x86, я предлагаю написать подпрограммы рисования, используя встроенный язык ассемблера. Правильно настроенный линейный алгоритм Ву может быть записан всего за 15 инструкций, а его круговой алгоритм — около 40-50 инструкций.

person Jamie Bertram    schedule 01.09.2012