Hermite 与 Bezier 曲线的转换公式

简介

本文给出 Hermite 与 Bezier 曲线互转的公式及其推导过程。

Bezier 曲线

p ( t ) = p 0 B 0 ( t ) + p 1 B 1 ( t ) + p 2 B 2 ( t ) + p 3 B 3 ( t ) , t ∈ [ 0 , 1 ] \mathbf{p}(t) = \mathbf{p}_0 B_0(t) + \mathbf{p}_1 B_1(t) + \mathbf{p}_2 B_2(t) + \mathbf{p}_3 B_3(t), t \in [0, 1] p(t)=p0B0(t)+p1B1(t)+p2B2(t)+p3B3(t),t[0,1]
其中:
B 0 ( t ) = ( 1 − t ) 3 B 1 ( t ) = 3 ( 1 − t ) 2 t B 2 ( t ) = 3 ( 1 − t ) t 2 B 3 ( t ) = t 3 \begin{aligned} B_0(t) &= (1 − t)^3 \\ B_1(t) &= 3(1 − t)^2t \\ B_2(t) &= 3(1 − t)t^2 \\ B_3(t) &= t^3 \end{aligned} B0(t)B1(t)B2(t)B3(t)=(1t)3=3(1t)2t=3(1t)t2=t3

矩阵形式:

p ( t ) = [ 1 t t 2 t 3 ] [ 1 0 0 0 − 3 3 0 0 3 − 6 3 0 − 1 3 − 3 1 ] [ p 0 p 1 p 2 p 3 ] \mathbf{p}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ -3 & 3 & 0 & 0 \\ 3 & -6 & 3 & 0 \\ -1 & 3 & -3 & 1 \end{bmatrix} \begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \\ \mathbf{p}_2 \\ \mathbf{p}_3 \end{bmatrix} p(t)=[1tt2t3]1331036300330001p0p1p2p3

Hermite 曲线

q ( t ) = q 0 H 00 ( t ) + u 0 H 10 ( t ) + q 1 H 01 ( t ) + u 1 H 11 ( t ) , t ∈ [ 0 , 1 ] \mathbf{q}(t) = \mathbf{q}_0 H_{00}(t) + \mathbf{u}_0 H_{10} (t) + \mathbf{q}_1 H_{01}(t) + \mathbf{u}_1 H_{11}(t), t \in [0, 1] q(t)=q0H00(t)+u0H10(t)+q1H01(t)+u1H11(t),t[0,1]
其中:

H 00 ( t ) = ( 1 + 2 t ) ( 1 − t ) 2 H 10 ( t ) = t ( 1 − t ) 2 H 01 ( t ) = t 2 ( 3 − 2 t ) H 11 ( t ) = − t 2 ( 1 − t ) \begin{aligned} H_{00}(t) &= (1 + 2t)(1 − t)^2 \\ H_{10}(t) &= t(1 − t)^2 \\ H_{01}(t) &= t^2(3 − 2t) \\ H_{11}(t) &= −t^2(1 − t) \end{aligned} H00(t)H10(t)H01(t)H11(t)=(1+2t)(1t)2=t(1t)2=t2(32t)=t2(1t)

矩阵形式:

q ( t ) = [ 1 t t 2 t 3 ] [ 1 0 0 0 0 1 0 0 − 3 − 2 3 − 1 2 1 − 2 1 ] [ q 0 u 0 q 1 u 1 ] \mathbf{q}(t) = \begin{bmatrix} 1 & t & t^2 & t^3 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -3 & -2 & 3 & -1 \\ 2 & 1 & -2 & 1 \end{bmatrix} \begin{bmatrix} \mathbf{q}_0 \\ \mathbf{u}_0 \\ \mathbf{q}_1 \\ \mathbf{u}_1 \end{bmatrix} q(t)=[1tt2t3]1032012100320011q0u0q1u1

转换公式

推导

将 hermite 和 bezier 的参数写成矩阵 C h C_h Ch C b C_b Cb,如下:

C h = [ q 0 u 0 q 1 u 1 ] C b = [ p 0 p 1 p 2 p 3 ] \begin{aligned} C_h &= \begin{bmatrix} \mathbf{q}_0 \\ \mathbf{u}_0 \\ \mathbf{q}_1 \\ \mathbf{u}_1 \end{bmatrix}\\ C_b &= \begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \\ \mathbf{p}_2 \\ \mathbf{p}_3 \end{bmatrix} \end{aligned} ChCb=q0u0q1u1=p0p1p2p3

由于 bezier 和 hermite 是等价的,有:

x ( t ) = [ 1 t t 2 t 3 ] M b C b = [ 1 t t 2 t 3 ] M h C h \begin{aligned} x(t) &= \begin{bmatrix}1&t&t^2&t^3\end{bmatrix}M_bC_b \\ &= \begin{bmatrix}1&t&t^2&t^3\end{bmatrix}M_hC_h \end{aligned} x(t)=[1tt2t3]MbCb=[1tt2t3]MhCh

其中矩阵 M 是 hermite 和 bezier 矩阵形式中间的那个矩阵。

于是:

M b C b = M h C h M_bC_b = M_hC_h MbCb=MhCh

所以有:
C b = M b − 1 M h C h = [ 1 0 0 0 1 1 / 3 0 0 1 2 / 3 1 / 3 0 1 1 1 1 ] [ 1 0 0 0 0 1 0 0 − 3 − 2 3 − 1 2 1 − 2 1 ] C h = [ 1 0 0 0 1 1 / 3 0 0 0 0 1 − 1 / 3 0 0 1 0 ] C h \begin{aligned} C_b &= M_b^{-1}M_hC_h \\ &= \begin{bmatrix}1 & 0 & 0 & 0 \\1 & 1/3 & 0 & 0 \\1 & 2/3 & 1/3 & 0 \\1 & 1 & 1 & 1\end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -3 & -2 & 3 & -1 \\ 2 & 1 & -2 & 1 \end{bmatrix} C_h \\ &= \begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 1/3 & 0 & 0 \\ 0 & 0 & 1 & -1/3 \\ 0 & 0 & 1 & 0 \end{bmatrix} C_h \end{aligned} Cb=Mb1MhCh=111101/32/31001/3100011032012100320011Ch=110001/3000011001/30Ch

所以,Herimite 控制参数与 Bezier 控制参数的关系是:

[ p 0 p 1 p 2 p 3 ] = [ 1 0 0 0 1 1 / 3 0 0 0 0 1 − 1 / 3 0 0 1 0 ] [ q 0 u 0 q 1 u 1 ] \begin{aligned} \begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \\ \mathbf{p}_2 \\ \mathbf{p}_3 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 1/3 & 0 & 0 \\ 0 & 0 & 1 & -1/3 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} \mathbf{q}_0 \\ \mathbf{u}_0 \\ \mathbf{q}_1 \\ \mathbf{u}_1 \end{bmatrix} \end{aligned} p0p1p2p3=110001/3000011001/30q0u0q1u1

Hermite 转 Bezier

由推导的公式,可知:

p 0 = q 0 p 1 = q 0 + u 0 3 p 2 = q 1 − u 1 3 p 3 = q 1 \begin{aligned} \mathbf{p}_0 &= \mathbf{q}_0 \\ \mathbf{p}_1 &= \mathbf{q}_0 + \frac{\mathbf{u}_0}{3} \\ \mathbf{p}_2 &= \mathbf{q}_1 - \frac{\mathbf{u}_1}{3} \\ \mathbf{p}_3 &= \mathbf{q}_1 \end{aligned} p0p1p2p3=q0=q0+3u0=q13u1=q1

Bezier 转 Hermite

由推导的公式,可知:
q 0 = p 0 u 0 = 3 ( p 1 − p 0 ) q 1 = p 2 u 1 = 3 ( p 3 − p 2 ) \begin{aligned} \mathbf{q}_0 &= \mathbf{p}_0 \\ \mathbf{u}_0 &= 3(\mathbf{p}_1 - \mathbf{p}_0) \\ \mathbf{q}_1 &= \mathbf{p}_2 \\ \mathbf{u}_1 &= 3(\mathbf{p}_3 - \mathbf{p}_2) \end{aligned} q0u0q1u1=p0=3(p1p0)=p2=3(p3p2)

转换效果示例

可以看到,两条曲线完美重合。

上图为 Tikz 绘制,绘制代码为:

\begin{tikzpicture}[scale=8]
\draw[help lines,thick,color=gray,step=.5cm,
dashed] (0,0) grid (1,1);
\draw[->] (-0.2,0) -- (1.2,0) node[right] {$x$};
\draw[->] (0,-0.2) -- (0,1.2) node[above] {$y$};
% 0, 1, 0, 1 for bezier
\draw[scale=1,domain=0:1, samples=50, smooth, variable=\x,blue] plot ({\x},{ 0 * (1 - \x) ^ 3 + 3 * 1 * (1 - \x)^2 * \x + 3 * 0 * (1 - \x) * \x ^ 2 + \x ^ 3});
\node[down] at (0, 0.8) {$f(x) = 0 * B_0(x) + 1 * B_1(x) + 0 * B_2 (x) + 1 * B_3 (x)$};

\draw[scale=1,domain=0:1, samples=50, smooth,variable=\x,red] plot ({\x},{
0 + 3 * 1 * \x * (1 - \x) ^ 2 + 1 * \x ^ 2 * (3 - 2 * \x) + 3 * 1 * (-1) * \x ^ 2 * (1 - \x)
});
\node[down] at (1, 0.2) {$f(x) = 0 * H_{00}(x) + 3 * H_{10}(x) + 1 * H_{01}(x) + 3 * H_{11}(x)$};
\end{tikzpicture}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值