Cardinal 与三阶 Bezier 相互转换

Cardinal 曲线与三阶 Bezier 曲线同为 3 次曲线,理论上可以相互转换。

Cardinal 曲线

根据定义,给定点集 { P k − 1 , P k , P k + 1 , P k + 2 } \{ \mathbf {P}_{k-1}, \mathbf {P}_k, \mathbf {P}_{k+1}, \mathbf {P}_{k+2} \} {Pk1,Pk,Pk+1,Pk+2} , 则 P k \mathbf {P}_k Pk P k + 1 \mathbf {P}_{k+1} Pk+1 之间的曲线可以由如下方程生成:
P ( u ) = [ u 3 u 2 u 1 ] [ − s 2 − s s − 2 s 2 s s − 3 3 − 2 s − s − s 0 s 0 0 1 0 0 ] [ P k − 1 P k P k + 1 P k + 2 ] \mathbf P(u) = \begin{bmatrix} u^3& u^2 & u & 1 \end{bmatrix} \begin{bmatrix} -s & 2-s & s-2 & s\\ 2s & s-3 & 3-2s & -s\\ -s & 0 & s & 0 \\ 0 & 1 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} \mathbf {P}_{k-1}\\ \mathbf {P}_k\\ \mathbf {P}_{k+1}\\ \mathbf {P}_{k+2} \end{bmatrix} P(u)=[u3u2u1]s2ss02ss301s232ss0ss00Pk1PkPk+1Pk+2
其中, s s s 用于控制曲线的松紧,取值范围为 [0, 1]。 0 表示最紧 (无平滑转角);1 表示最松弛。 Cardinal 曲线也可以使用一个取值范围为 [-1, 1] 的张度 t t t 来控制曲线松紧,此时 s s s t t t 关系为 s = ( 1 − t ) / 2 s = (1-t)/2 s=(1t)/2.

Cardinal 曲线若使用系数形式表示,则如下:
P ( u ) = a u 3 + b u 2 + c u + d d = P k c = s ( P k + 1 − P k − 1 ) b = 3 ( P k + 1 − P k ) − s ( P k + 2 − P k ) − 2 c a = ( P k + 1 − P k ) − c − b \begin {aligned} \mathbf{P}(u) & = \mathbf{a}u^3 + \mathbf{b}u^2 + \mathbf{c}u + \mathbf{d}\\ \mathbf{d} & =\mathbf {P}_k\\ \mathbf{c} & =s(\mathbf {P}_{k+1}-\mathbf {P}_{k-1})\\ \mathbf{b}& =3(\mathbf {P}_{k+1}-\mathbf {P}_k)-s(\mathbf {P}_{k+2}-\mathbf {P}_k)-2\mathbf{c}\\ \mathbf{a}& =(\mathbf {P}_{k+1}-\mathbf {P}_k) - \mathbf{c} - \mathbf{b}\\ \end {aligned} P(u)dcba=au3+bu2+cu+d=Pk=s(Pk+1Pk1)=3(Pk+1Pk)s(Pk+2Pk)2c=(Pk+1Pk)cb

三阶 Bezier 曲线

给定一组点 { P 0 , P 1 , P 2 , P 3 } \{ \mathbf {P}_0, \mathbf {P}_1, \mathbf {P}_2, \mathbf {P}_3 \} {P0,P1,P2,P3}, 其中 P 1 \mathbf {P}_1 P1, P 2 \mathbf {P}_2 P2 为控制点,则 P 0 \mathbf {P}_0 P0 P 3 \mathbf {P}_3 P3 之间的 Bezier 曲线可以由如下方程生成:
P ( u ) = [ u 3 u 2 u 1 ] [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] [ P 0 P 1 P 2 P 3 ] \mathbf {P}(u) = \begin{bmatrix} u^3& u^2 & u & 1 \end{bmatrix} \begin{bmatrix} -1 & 3 & -3 & 1\\ 3 & -6 & 3 & 0\\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} \mathbf {P}_0\\ \mathbf {P}_1\\ \mathbf {P}_2\\ \mathbf {P}_3 \end{bmatrix} P(u)=[u3u2u1]1331363033001000P0P1P2P3
写成系数方程如下:
P ( u ) = α u 3 + β u 2 + γ u + δ δ = P 0 γ = 3 ( P 1 − P 0 ) β = 3 ( P 2 − P 1 ) − γ α = ( P 3 − P 0 ) − β − γ \begin {aligned} \mathbf{P}(u) =& \boldsymbol{\alpha}u^3 + \boldsymbol{\beta}u^2 + \boldsymbol{\gamma}u + \boldsymbol{\delta}\\ \boldsymbol{\delta} =& \mathbf {P}_0\\ \boldsymbol{\gamma} =& 3(\mathbf {P}_1-\mathbf {P}_0)\\ \boldsymbol{\beta} =& 3(\mathbf {P}_2-\mathbf {P}_1)-\boldsymbol{\gamma}\\ \boldsymbol{\alpha} =& (\mathbf {P}_3-\mathbf {P}_0) - \boldsymbol{\beta} - \boldsymbol{\gamma}\\ \end{aligned} P(u)=δ=γ=β=α=αu3+βu2+γu+δP03(P1P0)3(P2P1)γ(P3P0)βγ

Cardinal 转换到 Bezier

Cardinal 曲线与 Bezier 曲线都经过两个点,因此有两个点可以方便求出。其它两点,根据系数方程,令系数相等即可求出:
P 0 ′ = P 1 P 1 ′ = s 3 ( P 2 − P 0 ) + P 1 P 2 ′ = s 3 ( P 1 − P 3 ) + P 2 P 3 ′ = P 2 \begin {aligned} \mathbf {P}'_0=& \mathbf {P}_1\\ \mathbf {P}'_1=& \frac{s}{3}(\mathbf {P}_2-\mathbf {P}_0)+\mathbf {P}_1\\ \mathbf {P}'_2=& \frac{s}{3}(\mathbf {P}_1-\mathbf {P}_3)+\mathbf {P}_2\\ \mathbf {P}'_3=& \mathbf {P}_2 \end{aligned} P0=P1=P2=P3=P13s(P2P0)+P13s(P1P3)+P2P2

Bezier 转换到 Cardinal

与上述方法一样,即可求出:
P 0 ′ = 3 s ( P 0 − P 1 ) + P 3 P 1 ′ = P 0 P 2 ′ = P 3 P 3 ′ = 3 s ( P 3 − P 2 ) + P 0 \begin {aligned} \mathbf {P}'_0 =& \frac{3}{s}(\mathbf {P}_0-\mathbf {P}_1)+\mathbf {P}_3\\ \mathbf {P}'_1 =& \mathbf {P}_0\\ \mathbf {P}'_2 =& \mathbf {P}_3\\ \mathbf {P}'_3 =& \frac{3}{s}(\mathbf {P}_3-\mathbf {P}_2)+\mathbf {P}_0 \end{aligned} P0=P1=P2=P3=s3(P0P1)+P3P0P3s3(P3P2)+P0

一般化

根据曲线的矩阵表示法,有:
U ⋅ M s p l i n e 2 ⋅ M g e o m 2 = U ⋅ M s p l i n e 1 ⋅ M g e o m 1 M g e o m 2 = M s p l i n e 2 − 1 ⋅ M s p l i n e 1 ⋅ M g e o m 1 = M s 1 → s 2 ⋅ M g e o m 1 M s 1 → s 2 = M s p l i n e 2 − 1 ⋅ M s p l i n e 1 \begin {aligned} \mathbf {U} \cdot \mathbf {M}_{spline2} \cdot \mathbf {M}_{geom2} & = \mathbf {U} \cdot \mathbf {M}_{spline1} \cdot \mathbf {M}_{geom1}\\ \mathbf {M}_{geom2} & =\mathbf {M}_{spline2}^{-1} \cdot \mathbf {M}_{spline1} \cdot \mathbf {M}_{geom1}\\ & = \mathbf {M}_{s1 \to s2} \cdot \mathbf {M}_{geom1} \\ \mathbf {M}_{s1 \to s2} &= \mathbf {M}_{spline2}^{-1} \cdot \mathbf {M}_{spline1} \end{aligned} UMspline2Mgeom2Mgeom2Ms1s2=UMspline1Mgeom1=Mspline21Mspline1Mgeom1=Ms1s2Mgeom1=Mspline21Mspline1
此方法适用一般曲线转换,但由于矩阵求逆较复杂,计算非常不便。

Cardinal 转换成 Bezier

M C a r → B e z = M B e z − 1 ⋅ M C a r = [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] − 1 ⋅ [ − s 2 − s s − 2 s 2 s s − 3 3 − 2 s − s − s 0 s 0 0 1 0 0 ] = [ 0 0 0 1 0 0 1 3 1 0 1 3 2 3 1 1 1 1 1 ] ⋅ [ − s 2 − s s − 2 s 2 s s − 3 3 − 2 s − s − s 0 s 0 0 1 0 0 ] = [ 0 1 0 0 − s 3 1 s 3 0 0 s 3 1 − s 3 0 0 1 0 ] P B e z = M C a r → B e z ⋅ P C a r = [ P 1 s 3 ( P 2 − P 0 ) + P 1 s 3 ( P 1 − P 3 ) + P 2 P 2 ] \begin {aligned} \mathbf {M}_{Car \to Bez} & = \mathbf {M}_{Bez}^{-1} \cdot \mathbf {M}_{Car}\\ & = \begin{bmatrix} -1 & 3 & -3 & 1\\ 3 & -6 & 3 & 0\\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix}^{-1} \cdot \begin{bmatrix} -s & 2-s & s-2 & s\\ 2s & s-3 & 3-2s & -s\\ -s & 0 & s & 0\\ 0 & 1 & 0 & 0\\ \end{bmatrix} \\ & = \begin{bmatrix} 0 & 0 & 0 & 1\\ 0 & 0 & \frac {1} 3 & 1\\ 0 & \frac 13 & \frac 23 & 1 \\ 1 & 1 & 1 & 1 \\ \end{bmatrix} \cdot \begin{bmatrix} -s & 2-s & s-2 & s\\ 2s & s-3 & 3-2s & -s\\ -s & 0 & s & 0\\ 0 & 1 & 0 & 0\\ \end{bmatrix} \\ & = \begin{bmatrix} 0 & 1 & 0 & 0\\ -\frac s3 & 1 & \frac {s} 3 & 0\\ 0 & \frac s3 & 1 & -\frac s3 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}\\ \\ \mathbf {P}_{Bez} & = \mathbf {M}_{Car \to Bez} \cdot \mathbf {P}_{Car}\\ & = \begin{bmatrix} \mathbf {P}_1\\ \frac s3(\mathbf {P}_2-\mathbf {P}_0)+\mathbf {P}_1\\ \frac s3(\mathbf {P}_1-\mathbf {P}_3)+\mathbf {P}_2\\ \mathbf {P}_2 \end{bmatrix} \end {aligned} MCarBezPBez=MBez1MCar=13313630330010001s2ss02ss301s232ss0ss00=0001003110313211111s2ss02ss301s232ss0ss00=03s00113s003s11003s0=MCarBezPCar=P13s(P2P0)+P13s(P1P3)+P2P2

Bezier 转换为 Cardinal

M B e z → C a r = M C a r − 1 ⋅ M B e z = [ − s 2 − s s − 2 s 2 s s − 3 3 − 2 s − s − s 0 s 0 0 1 0 0 ] − 1 ⋅ [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] = [ 1 1 s − 1 s 1 0 0 0 1 1 1 1 1 3 s 2 s 1 s 1 ] ⋅ [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] = [ 3 s − 3 s 0 1 1 0 0 0 0 0 0 1 1 0 − 3 s 3 s ] P C a r = M B e z → C a r ⋅ P B e z = [ 3 s ( P 0 − P 1 ) + P 3 P 0 P 3 3 s ( P 3 − P 2 ) + P 0 ] \begin {aligned} \mathbf {M}_{Bez\to Car} & = \mathbf {M}_{Car}^{-1} \cdot \mathbf {M}_{Bez}\\ & = \begin{bmatrix} -s & 2-s & s-2 & s\\ 2s & s-3 & 3-2s & -s\\ -s & 0 & s & 0\\ 0 & 1 & 0 & 0\\ \end{bmatrix}^{-1} \cdot \begin{bmatrix} -1 & 3 & -3 & 1\\ 3 & -6 & 3 & 0\\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \\ & = \begin{bmatrix} 1 & 1 & \frac {s-1} s & 1\\ 0 & 0 & 0 & 1\\ 1 & 1 & 1 & 1 \\ \frac 3s & \frac 2s & \frac 1s & 1 \\ \end{bmatrix} \cdot \begin{bmatrix} -1 & 3 & -3 & 1\\ 3 & -6 & 3 & 0\\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \\ & = \begin{bmatrix} \frac 3s & -\frac 3s & 0 & 1\\ 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 \\ 1 & 0 & -\frac 3s & \frac 3s \\ \end{bmatrix}\\ \\ \mathbf {P}_{Car} & = \mathbf {M}_{Bez \to Car} \cdot \mathbf {P}_{Bez}\\ & = \begin{bmatrix} \frac 3s (\mathbf {P}_0-\mathbf {P}_1) + \mathbf {P}_3\\ \mathbf {P}_0\\ \mathbf {P}_3\\ \frac 3s (\mathbf {P}_3-\mathbf {P}_2) + \mathbf {P}_0 \end{bmatrix} \end{aligned} MBezCarPCar=MCar1MBez=s2ss02ss301s232ss0ss0011331363033001000=101s3101s2ss101s111111331363033001000=s3101s3000000s3101s3=MBezCarPBez=s3(P0P1)+P3P0P3s3(P3P2)+P0

Cardinal 曲线生成

Cardinal 曲线生成可以参考另一篇博文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值