如何将矢量图形转换成光栅图像的通用算法是什么?我找到了许多将基元(如线条、圆、贝塞尔曲线等)转换为光栅化的算法。但是对于通用的情况,我该怎么做呢?只需要遍历矢量图片中的每个矢量图形,获取其像素并将它们放入光栅图像中吗?还是有其他方法?
另外一个问题是,如何使用并发性能提升处理时间?例如,我可以分离矢量图形并同时获取它们的像素。但也许还有其他方法可以实现这一点吗?
如何将矢量图形转换成光栅图像的通用算法是什么?我找到了许多将基元(如线条、圆、贝塞尔曲线等)转换为光栅化的算法。但是对于通用的情况,我该怎么做呢?只需要遍历矢量图片中的每个矢量图形,获取其像素并将它们放入光栅图像中吗?还是有其他方法?
另外一个问题是,如何使用并发性能提升处理时间?例如,我可以分离矢量图形并同时获取它们的像素。但也许还有其他方法可以实现这一点吗?
(iii)(标记运行限制)将每个线段绘制到临时位图中。对于直线使用Bresenham算法;对于曲线,将其二等分,直到该线距离真实曲线不超过(比如)1/8像素为止,然后从起点到终点使用一条直线。在绘制时,以某种方式标记像素以指示(a)它们是否是运行的起点或终点-向下的线是起点,向上的线是终点;(b)覆盖范围-像素内部形状的分数。这就是算法在细节上有所不同的地方,也是区分缠绕规则(非零与奇偶)的地方。
(iv) (scan) 遍历临时位图,逐行扫描。对于每一行,从左到右扫描。通过(例如)将位图中存储的数字加到一个存储的数字中来维护一个状态,该状态指示当前位置是否在形状内部。在简单的单色光栅化中,这个数字在穿过边缘进入形状时为+1,在离开形状时为-1。累积相同状态下的像素运行。将运行发送到绘图模块:例如,FreeType发出由Y坐标、起始和结束X坐标以及从0到255的覆盖率组成的运行。绘图模块可以将覆盖率用作应用于当前绘图颜色的Alpha值,或者用作应用于纹理的掩码。FreeType的系统灵感来自Raph Levien的Libart。
Anti-Grain是另一个流行且有影响力的C++库。
还有Kiia Kallio实现的扫描线边缘标志系统,看起来很有前途,似乎比Anti-Grain更快。
大多数但不是全部这些库都接受由二次和三次贝塞尔样条以及直线段构成的形状。那些不接受(例如K. Kallio的库)仅接受直边多边形;但是将曲线“展平”为一系列距离实际曲线的最大距离更近的线段非常容易。FreeType在内部执行此操作,并且其代码可以在必要时借用。