在c++中绘制一个抗混叠的圆角矩形

Draw an anti aliased rounded rectangle in c++

本文关键字:圆角 一个 c++ 绘制      更新时间:2023-10-16

如标题所述,我想在c++和linux环境(ubuntu)中绘制抗锯齿圆角矩形。我已经尝试了SDL_gfx,但抗锯齿在roundedBox形状上不可用。我也读过SDL_Draw,但我认为它既不提供抗混叠。

这就是为什么我问是否有人知道提供这种形状的框架,或者是否有人知道(光)反混叠算法(我需要这个实时视频处理)。


谢谢你Vjo,但我真的不想在我的软件中使用openGL…顺便说一下,我想我想出了另一种方法来绘制抗混叠圆角矩形!

我在第一篇文章中没有解释的是,我已经在我的程序中使用SDL和opencv。于是我有了一个主意:

  • 用SDL_gfx
  • 绘制1通道的圆角矩形
  • 使用cvSmooth平滑它以获得抗混叠alpha
  • 使用结果作为一个简单矩形的alpha通道

你觉得怎么样?我今晚就试试!

形状中唯一需要反锯齿化的部分是角。画四个反锯齿的四分之一圆,每个角一个(吴晓琳的圆算法是你最好的选择),用简单的线条弥合缝隙。如果形状不会被旋转(即所有直线不是垂直就是水平),则使用Bresenham的非抗锯齿直线算法,否则使用Wu的直线算法。Wu的抗混叠算法通常是最快的,并且给出了非常好的结果。

如果你真的想优化你的结果,并且熟悉x86汇编编程,我建议使用内联汇编语言编写绘图例程。经过适当调整,wu的行算法只需15条指令,而他的圆算法大约需要40-50条指令。