相信LaTeX粉丝对绘图工具TikZ不会陌生。在TikZ中,有一条绘制三次Bézier 曲线的命令
\draw (起点).. controls (控制点1) and (控制点2).. (终点);
却没有绘制二次Bézier 曲线的命令。有人以为,如果控制点1和控制点2相同,就得到一个二次Bézier曲线
\draw (起点).. controls (控制点1) and (控制点1).. (终点);
相应地,该命令可以简化为
\draw (起点) .. controls (控制点1) .. (终点);
其实,这种看法是不正确的。
实际上,以P0 ,P1,P2 为控制点的二次Bézier曲线q(t) 和以P0,P1,P1,P2 为控制点的三次Bézier 曲线p(t)是不同的。可以证明,只要P0 ,P1,P2 不共线,曲线p(t)就不会退化为二次Bézier 曲线。
为了能够在TikZ中正确绘制二次Bézier曲线,我们可以借助三次Bézier曲线的命令,利用Bézier曲线的升阶算法,定义一个生成二次Bézier曲线的命令 \QuadraticBezier:
\newcommand{\QuadraticBezier}[3]{(#1) ..controls $(#1)!2/3!(#2)$) and ($(#3)!2/3!(#2)$)..(#3)}
例如,下图中的红蓝两条曲线,就可以分别采用下面两条语句来实现:
\draw[red] (0,0) .. controls (4,0) .. (2.5,3.5); % 绘制三次Bezier曲线
\draw[blue] \QuadraticBezier{(0,0)}{(4,0)}{(2.5,3.5)}; %绘制二次Bezier曲线
中图和右图分别演示用de Casteljau算法计算p(1/2)和q(1/2) 的过程。