TrueType 使用二阶,OpenType 使用三阶。为什么不更高?
那是因为它们的渲染时间/空间复杂度太大了吗?在那种情况下,我想知道它们在大 O 符号中的复杂性。
你不能 design 使用更高阶的贝塞尔曲线,这仍然是创建字体最重要的方面。具有间接影响曲线的浮动控制点会使工作更难,而不是更容易。因此,虽然使用三次曲线而不是二次曲线具有客观价值(更好的弧近似、更简洁的曲线表达式等),但使用四次(或更高)而不是三次曲线并没有明显的好处。事实上,二次/立方可以依赖的一些属性不适用于四次或以上,在设计阶段需要缓慢和 cpu 密集型算法,客观上使它们更难使用。因此,没有人提出允许它们的系统。
至于复杂性:绘制曲线的最坏情况(使用
s
步骤的简单扁平化)具有s
次(n-1)插值次(n-2)次插值等的复杂性,直到最终插值产生我们在t
的坐标,即s * n(n-1)/2
给我们一个O(n²)的大O符号。
虽然这里应该注意一些:在低
n
时,“好看”的曲线需要 s
的值,它可以 相当 比 n² 大,所以即使它在技术上是一个常数,它更有用看实际数字而不是大 O:
订单 | 坐标 | 插值 | 绘制曲线的插值次数 | 合理
|
---|---|---|---|---|
2 | 3 | 2+1 | 3秒 | 8~16 |
3 | 4 | 3+2+1 | 6s | 16~32 |
4 | 5 | 4+3+2+1 | 10s | 32~64 |
5 | 6 | 5+4+3+2+1 | 15s | ... |
6 | 7 | 6+5+4+3+2+1 | 21s | ... |
7 | 8 | ... | 28s | ... |
8 | ... | ... | 36s | ... |
曲线阶数越高,我们需要的步骤就越多,以确保事情看起来至少“合理”。
将其与使用“多个低阶曲线”进行比较:
立方数 | 绘制完整曲线的插值次数 |
---|---|
2 | 12s |
3 | 18s |
4 | 24s |
5 | 30s |
6 | 36s |
... | ... |
收益递减:使用三次 polyBeziers 绘制高阶曲线变得很多便宜,非常快。对于单个 8 阶贝塞尔曲线的相同价格,我们可以绘制 六个 三次贝塞尔曲线,并且当我们只想调整一小部分时,所得曲线将非常容易操作。