跳转至

Bézier 字形轮廓

保留原始路径命令

GlyphOutline 保留移动、直线、二次、三次曲线与闭合命令,不会偷偷把曲线采样成折线。完成字形处理后的精确 Bézier 轮廓与部分控制多边形 的控制多边形直接来自这些命令。

二次与三次曲线

二次与三次 Bézier 分别为

\[ Q(t)=(1-t)^2 P_0+2(1-t)t P_1+t^2 P_2, \]
\[ C(t)=(1-t)^3 P_0+3(1-t)^2 t P_1+3(1-t) t^2 P_2+t^3 P_3, \quad 0\le t\le 1. \]

两者都精确通过端点,端点切线由相邻控制点决定。

GlyphOutline(glyph_id, commands, bounds, units_per_em, variation_coordinates=())

以字体坐标保存精确且不绑定绘图端的轮廓;截取时会展开复合字形。

MoveTo(point)

移到新轮廓的第一个点,不会画出线段。

LineTo(point)

画一条直线到指定端点。

QuadraticTo(control, point)

使用一个控制点画出二次 Bézier 曲线。

CubicTo(control1, control2, point)

使用两个控制点画出三次 Bézier 曲线。

封闭目前轮廓,并明确加入最后一条边。

将曲线自动细分为折线

flatten(outline, *, tolerance) → tuple[Polyline, ...]
outlineGlyphOutline

要近似的精确轮廓。

控制点与其弦之间的最大距离,单位为字体单位。

曲线扁平化(curve flattening)会递归细分曲线,直到控制点到弦的距离都不超过容许误差,再返回开放或闭合的 Polyline。

误差与细分

二次曲线以 \(d(P_1, \overline{P_0 P_2}) \le \epsilon\) 为停止条件;三次曲线同时检查两个内部控制点。未达条件时以 de Casteljau 法在 \(t = 1 / 2\) 细分。误差单位是字体单位;若调用端以像素指定误差,必须先换算回字体单位。

评论