METAFONT 的 draw z1..z2..z3 这种曲线,它的算法实际上远比想象的复杂。METAFONT: The Program 里面有大片篇幅介绍这种东西。这种曲线的核心问题就是:怎样生成一段刺穿若干点的平滑曲线?在明确定义「平滑」为曲率连续之后,Knuth 和 Hobby 给出了一个不错的近似解:考虑三次 Bezier 曲线段定义两端切线夹角为,则控制点可以用表示单位向量和张力参数表示:上面的描述中端点以及张力参数都是用户输入,现在有四个参数需要优化,首先切线「长」的优化是让所选曲线段的曲率变化最小,Knuth 和 Hobby 想出来的近似公式是:其中而切线角则是以使整条曲线曲率尽量连续确定的,在此过程里曲率被近似表示成切线角的线性函数:而同一顶点两侧的切线必须是共线(G1),又必须曲率相同(G2),于是优化曲线的过程就变成了解线性方程组,最终的结果就是 METAFONT 里的「..」构造了。这种曲线经过扩展(支持到 G4 连续、直线到曲线连续变化等)之后就是 Raph 的 spiro,是很多字体(比如Iosevka、Inconsolata)中使用的建模手段。(图:spiro 模型和生成的 Bezier 曲线)至于所谓多重母版,那东西技术上没有难度,不似这些样条的技术含量高。来源:知乎 www.zhihu.com作者:Belleve【知乎日报】千万用户的选择,做朋友圈里
...
继续阅读
(38)