简介
本文给出 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)=(1−t)3=3(1−t)2t=3(1−t)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]⎣⎢⎢⎡1−33−103−63003−30001⎦⎥⎥⎤⎣⎢⎢⎡p0p1p2p3⎦⎥⎥⎤
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)(1−t)2=t(1−t)2=t2(3−2t)=−t2(1−t)
矩阵形式:
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]⎣⎢⎢⎡10−3201−21003−200−11⎦⎥⎥⎤⎣⎢⎢⎡q0u0q1u1⎦⎥⎥⎤
转换公式
推导
将 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=Mb−1MhCh=⎣⎢⎢⎡111101/32/31001/310001⎦⎥⎥⎤⎣⎢⎢⎡10−3201−21003−200−11⎦⎥⎥⎤Ch=⎣⎢⎢⎡110001/300001100−1/30⎦⎥⎥⎤Ch
所以,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/300001100−1/30⎦⎥⎥⎤⎣⎢⎢⎡q0u0q1u1⎦⎥⎥⎤
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=q1−3u1=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(p1−p0)=p2=3(p3−p2)
转换效果示例
可以看到,两条曲线完美重合。
上图为 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}