Hermite 与 Bezier 曲线的转换公式

您所在的位置:网站首页 转曲线怎么转成曲线形状 Hermite 与 Bezier 曲线的转换公式

Hermite 与 Bezier 曲线的转换公式

2024-07-15 09:05| 来源: 网络整理| 查看: 265

简介

本文给出 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)=p0​B0​(t)+p1​B1​(t)+p2​B2​(t)+p3​B3​(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)=[1​t​t2​t3​]⎣⎢⎢⎡​1−33−1​03−63​003−3​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​p0​p1​p2​p3​​⎦⎥⎥⎤​

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)=q0​H00​(t)+u0​H10​(t)+q1​H01​(t)+u1​H11​(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)=[1​t​t2​t3​]⎣⎢⎢⎡​10−32​01−21​003−2​00−11​⎦⎥⎥⎤​⎣⎢⎢⎡​q0​u0​q1​u1​​⎦⎥⎥⎤​

转换公式 推导

将 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} Ch​Cb​​=⎣⎢⎢⎡​q0​u0​q1​u1​​⎦⎥⎥⎤​=⎣⎢⎢⎡​p0​p1​p2​p3​​⎦⎥⎥⎤​​

由于 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)​=[1​t​t2​t3​]Mb​Cb​=[1​t​t2​t3​]Mh​Ch​​

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

于是:

M b C b = M h C h M_bC_b = M_hC_h Mb​Cb​=Mh​Ch​

所以有: 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−1​Mh​Ch​=⎣⎢⎢⎡​1111​01/32/31​001/31​0001​⎦⎥⎥⎤​⎣⎢⎢⎡​10−32​01−21​003−2​00−11​⎦⎥⎥⎤​Ch​=⎣⎢⎢⎡​1100​01/300​0011​00−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} ⎣⎢⎢⎡​p0​p1​p2​p3​​⎦⎥⎥⎤​=⎣⎢⎢⎡​1100​01/300​0011​00−1/30​⎦⎥⎥⎤​⎣⎢⎢⎡​q0​u0​q1​u1​​⎦⎥⎥⎤​​

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} p0​p1​p2​p3​​=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} q0​u0​q1​u1​​=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}


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3