相信LaTeX粉絲對繪圖工具TikZ不會陌生。在TikZ中,有一條繪制三次Bézier 曲線的命令
\draw (起點).. controls (控制點1) and (控制點2).. (終點);
卻沒有繪制二次Bézier 曲線的命令。有人以為,如果控制點1和控制點2相同,就得到一個二次Bézier曲線
\draw (起點).. controls (控制點1) and (控制點1).. (終點);
相應(yīng)地,該命令可以簡化為
\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)}
例如,下圖中的紅藍(lán)兩條曲線,就可以分別采用下面兩條語句來實現(xiàn):
\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) 的過程。

學(xué)者網(wǎng)

評論 0