渲染二维元素(圆形、圆角矩形、模糊等)的参考资料
我正在写一个Python模块,目的是为低级图形用户界面(GUI)平台提供一个简单的面向对象编程(OOP)接口。为了实现这个目标,需要创建一个包装类,这个类将被模块中的其他类使用。
这是目前基本实现的类图。
其实这个问题并不是关于包的设计,但如果你对它有疑问或者有什么更好的想法,我非常欢迎任何评论或批评。
DrawArea类是低级平台和包中类之间的桥梁。事件通常从这里开始,因为这个包装类应该能够识别鼠标和键盘事件,并将这些信息传递给它的子类。
现在,正如你所看到的,DrawArea类需要实现一些功能,以便在GUI上绘制基本元素。我想了解一下绘制圆形、圆角矩形、线条(带厚度的)以及抗锯齿的背后原理。这样做的一个原因是我对这个话题感兴趣,另一个原因是我想在这个包中提供一个实现。(这个实现会用C/C++写,我觉得Python在这种渲染操作上会太慢,对吧?)
现在我的问题是:
- 有没有好的参考资料,教我如何绘制圆形、椭圆、圆角矩形或线条(带厚度的,一像素线很简单)?
- 有没有好的参考资料,教我如何实现抗锯齿?
- 比如,抗锯齿是在绘制元素时完成,还是在所有绘制操作完成后再应用?
- 使用类似
Path
的类来进行渲染会不会更好?也就是说,用一种矢量化的方式表示要渲染的形状。这将有助于渲染任何类型的二维形状,但我不知道该如何实现。有没有好的参考资料来学习渲染矢量图形?
1 个回答
5
Anti-Grain Geometry - 高保真2D图形 - 一个高质量的C++渲染引擎 是一个编程库,这是我最喜欢用来渲染矢量图形的选择。
你可能想要为它做一个封装(可以查看一下文档),看看源代码或者其他相关内容……
跳转到研究部分,你可以找到很多关于如何做“高保真2D图形 - 高质量渲染”的信息。这里提到了贝塞尔曲线和其他主题。我最喜欢的部分是“文本光栅化曝光”,讲的是亚像素渲染。
如果你对如何优化绘制线条、多边形等,即使是在C+汇编层面感兴趣,
- 我建议你看看一本虽然旧但很棒的书(展示了在i386时代需要的技巧):《游戏编程大师的技巧》 by Andre Lamothe, John Ratcliff, Denise Tyler
- 如果你想要更多,另一本书是:“计算机图形学导论 James D. Foley, Andries van Dam, Steven K. Feiner, John F. Hughes, Richard L. Phillips” ref1 ref2
这里是许多2D计算机图形算法中的一个例子:
- Bresenham的线算法,因为它只使用整数加法、减法和位移,所以被广泛使用,这些是执行速度最快的指令。
- 有很多修改版本,包括多核处理的:Google Scholar: Bresenham的线算法
- 清晰易读的例子,展示如何将Bresenham应用于线条、圆形等:Bresenham算法的美
- 中点圆算法是绘制圆的经典例子。
- 但如果你想要在绘制算法中内置抗锯齿功能(而不是过采样),你可以看看:Xiaolin Wu的线算法
- 一个很好的地方来开始阅读网络上的算法,但我真的建议你看看《游戏编程大师的技巧》 by Andre Lamothe, John Ratcliff, Denise Tyler