分段插值/Hermite插值

曲线和曲面的方法一般都是基于点的----使用多项式,可以很容易的构造通过给定一维数组或二维点网格的参数曲线段(或曲面贴片)。

这些方法的缺点在于它们不是交互式的。如果生成的曲线或曲面不是设计师想要的,那么修改它的唯一方法就是添加点。移动这些点不是一个选项,因为曲线必须经过原始数据点。添加点可以控制曲线的形状,但会降低计算速度。

一个实用的、有用的曲线/曲面设计算法应该是交互式的。它应该提供用户控制的参数,以可预测的、直观的方式修改曲线的形状。Hermite 插值 就是这样一种方法。

埃尔米特插值基于两点 P 1 P_1 P1 P 2 P_2 P2 以及两个切向量 P 1 t P_1^t P1t P 2 t P_2^t P2t。它计算从 P 1 P_1 P1 开始朝向 P 1 t P_1^t P1t P 2 P_2 P2 结束朝向 P 2 t P_2^t P2t 的曲线段。下图显示了几个不同的埃尔米特曲线段,以及它们的端点切向量:
在这里插入图片描述很明显,一个单独的艾尔米特片段可以有许多不同的形状。它甚至可以有一个尖,可以发展成一个循环。然而,一个完整的曲线,通常需要有几个连续的线段,样条方法构造这样的曲线将在之后讨论。

1. 交互控制

艾尔米特插值具有重要的优势:它是互动的。如果艾尔米特曲线段有一个错误的形状,用户可以通过修改切向量来编辑它。

下图显示了如何通过修改矢量的振幅来编辑曲线。图中显示了三条曲线,开始在一个 45 ° 45\degree 45° 的方向,最后垂直下降。这里展示的效果很简单,随着起始切线的大小增加,曲线在原方向上继续延长。这种行为意味着段切线产生了一个曲线,改变了它的方向,并开始向终点直线移动。这样的曲线接近于直线段,因此我们得出结论,长切线会产生松曲线,而短曲线会产生紧曲线。
在这里插入图片描述
切线的大小(而不仅仅是方向)影响曲线形状的原因是,三维的艾尔米特段是一个三维参量,计算一个三次幂需包含四个系数,每一个都是三个一组,总共有 12 个未知数。两个端点提供了 6 个已知量,两个切线提供了剩下的 6 个量。然而,如果我们只考虑向量的方向而不考虑它的大小,那么向量 ( 1 , 0.5 , 0.3 ) , ( 2 , 1 , 0.6 ) , ( 4 , 2 , 1.2 ) (1,0.5,0.3),(2,1,0.6),(4,2,1.2) (1,0.5,0.3),(2,1,0.6),(4,2,1.2) 都是相等的。在这种情况下,三个矢量分量中只有两个是独立的,两个矢量只提供四个独立的量。

2. 埃尔米特曲线段

艾尔米特曲线段很容易推导。它是一个有四个系数的三次幂曲线,其系数取决于两端点和两切线。三次曲线的基本方程为:
P ( t ) = a t 3 + b t 2 + c t + d = ( t 3 , t 2 , t , 1 ) ( a , b , c , d ) T = T ( t ) A . P(t)=at^3+bt^2+ct+d=(t^3,t^2,t,1)(a,b,c,d)^T=T(t)A. P(t)=at3+bt2+ct+d=(t3,t2,t,1)(a,b,c,d)T=T(t)A.

这是这条曲线的代数表示,其中四个系数仍然未知。一旦这些系数用已知的几何量表示出来,曲线就会以几何形式表示出来。

曲线 P ( t ) P(t) P(t) 的切向量为导数 d P ( t ) / d t dP(t)/dt dP(t)/dt,用 P t ( t ) P^t(t) Pt(t) 来表示。因此,该曲线的切向量为:
P t ( t ) = 3 a t 2 + 2 b t + c P^t(t) = 3at^2+2bt+c Pt(t)=3at2+2bt+c
我们用 P P P 来表示两个给定点 P 1 P_1 P1 P 2 P_2 P2 以及两个给定的切线 P 1 t P^t_1 P1t P 2 t P^t_2 P2t。方程 P ( 0 ) = P 1 , P ( 1 ) = P 2 , P t ( 0 ) = P 1 t , P t ( 1 ) = P 2 t P(0)=P_1, P(1)=P_2, P^{t}(0)= P^t_1, P^{t}(1)= P^t_2 P(0)=P1,P(1)=P2,Pt(0)=P1t,Pt(1)=P2t,其显式表示为:
a ⋅ 0 3 + b ⋅ 0 2 + c ⋅ 0 + d = P 1 a ⋅ 1 3 + b ⋅ 1 2 + c ⋅ 1 + d = P 2 3 a ⋅ 0 2 + 2 b ⋅ 0 + c = P 1 t 3 a ⋅ 1 2 + 2 b ⋅ 1 + c = P 2 t \begin{aligned} \mathbf{a} \cdot 0^{3}+\mathbf{b} \cdot 0^{2}+\mathbf{c} \cdot 0+\mathbf{d} &=\mathbf{P}_{1} \\ \mathbf{a} \cdot 1^{3}+\mathbf{b} \cdot 1^{2}+\mathbf{c} \cdot 1+\mathbf{d} &=\mathbf{P}_{2} \\ 3 \mathbf{a} \cdot 0^{2}+2 \mathbf{b} \cdot \mathbf{0}+\mathbf{c} &=\mathbf{P}_{1}^{t} \\ 3 \mathbf{a} \cdot 1^{2}+2 \mathbf{b} \cdot \mathbf{1}+\mathbf{c} &=\mathbf{P}_{2}^{t} \end{aligned} a03+b02+c0+da13+b12+c1+d3a02+2b0+c3a12+2b1+c=P1=P2=P1t=P2t

很容易解得:
a = 2 P 1 − 2 P 2 + P 1 t + P 2 t , b = − 3 P 1 + 3 P 2 − 2 P 1 t − P 2 t , c = P 1 t , d = P 1 . \mathbf{a}=2 \mathbf{P}_{1}-2 \mathbf{P}_{2}+\mathbf{P}_{1}^{t}+\mathbf{P}_{2}^{t}, \quad \mathbf{b}=-3 \mathbf{P}_{1}+3 \mathbf{P}_{2}-2 \mathbf{P}_{1}^{t}-\mathbf{P}_{2}^{t}, \quad \mathbf{c}=\mathbf{P}_{1}^{t}, \quad \mathbf{d}=\mathbf{P}_{1}. a=2P12P2+P1t+P2t,b=3P1+3P22P1tP2t,c=P1t,d=P1.

将这些解带入方程,整理可得:
P ( t ) = ( 2 P 1 − 2 P 2 + P 1 t + P 2 t ) t 3 + ( − 3 P 1 + 3 P 2 − 2 P 1 t − P 2 t ) t 2 + P 1 t t + P 1 = ( 2 t 3 − 3 t 2 + 1 ) P 1 + ( − 2 t 3 + 3 t 2 ) P 2 + ( t 3 − 2 t 2 + t ) P 1 t + ( t 3 − t 2 ) P 2 t = F 1 ( t ) P 1 + F 2 ( t ) P 2 + F 3 ( t ) P 1 t + F 4 ( t ) P 2 t = ( F 1 ( t ) , F 2 ( t ) , F 3 ( t ) , F 4 ( t ) ) ( P 1 , P 2 , P 1 t , P 2 t ) T = F ( t ) B \begin{aligned} \mathbf{P}(t)&=\left(2 \mathbf{P}_{1}-2 \mathbf{P}_{2}+\mathbf{P}_{1}^{t}+\mathbf{P}_{2}^{t}\right) t^{3}+\left(-3 \mathbf{P}_{1}+3 \mathbf{P}_{2}-2 \mathbf{P}_{1}^{t}-\mathbf{P}_{2}^{t}\right) t^{2}+\mathbf{P}_{1}^{t} t+\mathbf{P}_{1}\\ &=\left(2 t^{3}-3 t^{2}+1\right) \mathbf{P}_{1}+\left(-2 t^{3}+3 t^{2}\right) \mathbf{P}_{2}+\left(t^{3}-2 t^{2}+t\right) \mathbf{P}_{1}^{t}+\left(t^{3}-t^{2}\right) \mathbf{P}_{2}^{t} \\ &=F_{1}(t) \mathbf{P}_{1}+F_{2}(t) \mathbf{P}_{2}+F_{3}(t) \mathbf{P}_{1}^{t}+F_{4}(t) \mathbf{P}_{2}^{t} \\ &=\left(F_{1}(t), F_{2}(t), F_{3}(t), F_{4}(t)\right)\left(\mathbf{P}_{1}, \mathbf{P}_{2}, \mathbf{P}_{1}^{t}, \mathbf{P}_{2}^{t}\right)^{T} \\ &=\mathbf{F}(t) \mathbf{B} \end{aligned} P(t)=(2P12P2+P1t+P2t)t3+(3P1+3P22P1tP2t)t2+P1tt+P1=(2t33t2+1)P1+(2t3+3t2)P2+(t32t2+t)P1t+(t3t2)P2t=F1(t)P1+F2(t)P2+F3(t)P1t+F4(t)P2t=(F1(t),F2(t),F3(t),F4(t))(P1,P2,P1t,P2t)T=F(t)B

其中,
F 1 ( t ) = ( 2 t 3 − 3 t 2 + 1 ) , F 2 ( t ) = ( − 2 t 3 + 3 t 2 ) = 1 − F 1 ( t ) , F 3 ( t ) = ( t 3 − 2 t 2 + t ) , F 4 ( t ) = ( t 3 − t 2 ) . \begin{array}{c} F_{1}(t)=\left(2 t^{3}-3 t^{2}+1\right), \quad F_{2}(t)=\left(-2 t^{3}+3 t^{2}\right)=1-F_{1}(t), \\ F_{3}(t)=\left(t^{3}-2 t^{2}+t\right), \quad F_{4}(t)=\left(t^{3}-t^{2}\right). \end{array} F1(t)=(2t33t2+1),F2(t)=(2t3+3t2)=1F1(t),F3(t)=(t32t2+t),F4(t)=(t3t2).

B B B 为队列 ( P 1 , P 2 , P 1 t , P 2 t ) T (P_1, P_2, P^t_1, P^t_2)^T (P1,P2,P1t,P2t)T F ( t ) F(t) F(t) 为行 ( F 1 ( t ) , F 2 ( t ) , F 3 ( t ) , F 4 ( t ) ) (F_1(t), F_2(t), F_3(t), F_4(t)) (F1(t),F2(t),F3(t),F4(t))
在这里插入图片描述

函数 F i ( t ) F_i(t) Fi(t) 为 Hermite 混合函数。它们在曲线上创造了四个给定量的混合点,如上图所示。注意 F 1 ( t ) + F 2 ( t ) = 1 F_1(t)+F_2(t)=1 F1(t)+F2(t)=1 F 1 ( t ) F_1(t) F1(t) F 2 ( t ) F_2(t) F2(t) 两个函数混合点不是切向量,因此应该是重心函数。我们也可以写成 F 1 ( t ) = ( t 3 , t 2 , t , 1 ) ( 2 , − 3 , 0 , 1 ) t F_1(t)=(t^3,t^2,t,1)(2,-3,0,1)^t F1(t)=(t3,t2,t,1)(2,3,0,1)t F 2 ( t ) , F 3 ( t ) , F 4 ( t ) F_2(t),F_3(t),F_4(t) F2(t),F3(t),F4(t) 均有相似表示方式。矩阵表示变为了:

F ( t ) = ( t 3 , t 2 , t , 1 ) ( 2 − 2 1 1 − 3 3 − 2 − 1 0 0 1 0 1 0 0 0 ) = T ( t ) H \mathbf{F}(t)=\left(t^{3}, t^{2}, t, 1\right)\left(\begin{array}{rrrr} 2 & -2 & 1 & 1 \\ -3 & 3 & -2 & -1 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \end{array}\right)=\mathbf{T}(t) \mathbf{H} F(t)=(t3,t2,t,1)2301230012101100=T(t)H

曲线现在可以写成:
P ( t ) = F ( t ) B = T ( t ) H B = ( t 3 , t 2 , t , 1 ) ( 2 − 2 1 1 − 3 3 − 2 − 1 0 0 1 0 1 0 0 0 ) ( P 1 P 2 P 1 t P 2 t ) \mathbf{P}(t)=\mathbf{F}(t) \mathbf{B}=\mathbf{T}(t) \mathbf{H} \mathbf{B}=\left(t^{3}, t^{2}, t, 1\right)\left(\begin{array}{rrrr} 2 & -2 & 1 & 1 \\ -3 & 3 & -2 & -1 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \end{array}\right)\left(\begin{array}{l} \mathbf{P}_{1} \\ \mathbf{P}_{2} \\ \mathbf{P}_{1}^{t} \\ \mathbf{P}_{2}^{t} \end{array}\right) P(t)=F(t)B=T(t)HB=(t3,t2,t,1)2301230012101100P1P2P1tP2t

已知 P ( t ) = a t 3 + b t 2 + c t + d = ( t 3 , t 2 , t , 1 ) ( a , b , c , d ) T = T ( t ) A P(t)=at^3+bt^2+ct+d=(t^3,t^2,t,1)(a,b,c,d)^T = T(t)A P(t)=at3+bt2+ct+d=(t3,t2,t,1)(a,b,c,d)T=T(t)A,也就是 A = H b A=Hb A=Hb。矩阵 H H H 称为 Hermite 基矩阵

2.1 埃尔米特混合函数

继续分析上面示例中的四个混合函数,对这些函数的分析对于彻底理解艾尔米特插值方法是必不可少的。
在这里插入图片描述函数 F 1 ( t ) F_1(t) F1(t) 为分配给起始点 P 1 P_1 P1 的权重。它从最大值 F 1 ( 0 ) = 1 F_1(0)=1 F1(0)=1 F 1 ( 0 ) = 0 F_1(0)=0 F1(0)=0。这说明了为什么当 t t t 值很小时,曲线接近 P 1 P_1 P1 且说明了为什么对于较大的 t t t 值, P 1 P_1 P1 造成的影响很小或者说几乎没有影响。相反的结论对 F 2 ( t ) F_2(t) F2(t)(末端点 P 2 P_2 P2 的权重) 也成立。函数 F 3 ( t ) F_3(t) F3(t) 有点棘手。它从 0 开始,在 t = 1 / 3 t=1/3 t=1/3 处有一个最大值,然后慢慢下降到 0。这种行为的解释如下:

  1. 对于小的 t t t 值,函数 F 3 ( t ) F_3(t) F3(t) 几乎没有影响。曲线一直靠近 P 1 P_1 P1 \不管极端的切线或其他的什么。
  2. t t t 值在 1 / 3 1/3 1/3 左右时,权重 F 3 ( t ) F_3(t) F3(t) 对曲线有一定影响。对于这些 t t t 值,权重 F 4 ( t ) F_4(t) F4(t) 很小,曲线近似为点 F 1 ( t ) P 1 F_1(t)P_1 F1(t)P1(贡献大),点 F 2 ( t ) P 2 F_2(t)P_2 F2(t)P2(贡献小) 和向量 F 3 ( t ) P 1 t F_3(t)P^t_1 F3(t)P1t 的和。一个点 P = ( x , y ) P=(x,y) P=(x,y) 和 一个向量 v = ( v x , v y ) v=(v_x,v_y) v=(vx,vy) 的和是一个位于 ( x + v x , y + v y ) (x+v_x,y+v_y) (x+vx,y+vy) 的点,这就是权重 F 3 ( t ) F_3(t) F3(t) 如何沿着切向量方向 P 1 t P_1^t P1t ”拉“曲线。
  3. 对于较大的 t t t 值,函数 F 3 ( t ) F_3(t) F3(t) 再次几乎没有影响。曲线的移动更接近 P 2 P_2 P2 因为权重 F 2 ( t ) F_2(t) F2(t) 成为了主导。

函数 F 4 ( t ) F_4(t) F4(t) 可作类似解释。它对 t t t 的大小几乎没有影响。它的最大值(实际上是最小值,因为它是负的)出现在 t = 2 / 3 t=2/3 t=2/3 处,所以它只影响这个区域的曲线。当 t t t 的值接近 2 / 3 2/3 2/3,曲线近似为点 F 2 ( t ) P 2 F_2(t)P_2 F2(t)P2(贡献大),点 F 1 ( t ) P 1 F_1(t)P_1 F1(t)P1(贡献小) 和向量 − ∣ F 4 ( t ) ∣ P 2 t -|F_4(t)|P^t_2 F4(t)P2t 的和。因为 F 4 ( t ) F_4(t) F4(t) 是负的,这个和等于 ( x − v x , y − v y ) (x-v_x,y-v_y) (xvx,yvy),这就是曲线接近末端点 P 2 P_2 P2 时向方向 P 2 t P_2^t P2t 移动的原因。

另一个埃尔米特权重函数的重要特征是, F 1 ( t ) F_1(t) F1(t) F 2 ( t ) F_2(t) F2(t) 均为重心。它们一定是这样的,因为它们混合了两个点。从前面公式可知为什么是这样的:
a ⋅ 0 3 + b ⋅ 0 2 + c ⋅ 0 + d = P 1 a ⋅ 1 3 + b ⋅ 1 2 + c ⋅ 1 + d = P 2 3 a ⋅ 0 2 + 2 b ⋅ 0 + c = P 1 t 3 a ⋅ 1 2 + 2 b ⋅ 1 + c = P 2 t \begin{aligned} \mathbf{a} \cdot 0^{3}+\mathbf{b} \cdot 0^{2}+\mathbf{c} \cdot 0+\mathbf{d} &=\mathbf{P}_{1} \\ \mathbf{a} \cdot 1^{3}+\mathbf{b} \cdot 1^{2}+\mathbf{c} \cdot 1+\mathbf{d} &=\mathbf{P}_{2} \\ 3 \mathbf{a} \cdot 0^{2}+2 \mathbf{b} \cdot \mathbf{0}+\mathbf{c} &=\mathbf{P}_{1}^{t} \\ 3 \mathbf{a} \cdot 1^{2}+2 \mathbf{b} \cdot \mathbf{1}+\mathbf{c} &=\mathbf{P}_{2}^{t} \end{aligned} a03+b02+c0+da13+b12+c1+d3a02+2b0+c3a12+2b1+c=P1=P2=P1t=P2t

第一个方程就是 d = P 1 d=P_1 d=P1,将第二项减小为了 a + b + c = P 2 − P 1 a+b+c=P_2-P_1 a+b+c=P2P1。第三个方程求解 c c c,第四个方程和第二个方程结合,最终被用来计算 a a a b b b。所有这些说明 a a a b b b 的形式是 a = α ( P 2 − P 1 ) + ⋅ ⋅ ⋅ , b = β ( P 2 − P 1 ) + ⋅ ⋅ ⋅ a=\alpha(P_2 - P_1)+\cdot \cdot \cdot, b=\beta(P_2-P_1)+ \cdot \cdot \cdot a=α(P2P1)+,b=β(P2P1)+。因此最终的曲线有形式:
P ( t ) = a t 3 + b t 2 + c t + d = ( α P 2 − α P 1 + ⋅ ⋅ ⋅ ) t 3 + ( β P 2 − β P 1 + ⋅ ⋅ ⋅ ) t 2 + ( ⋅ ⋅ ⋅ ) t + P 1 P(t)=at^3+bt^2+ct+d=(\alpha P_2-\alpha P_1+\cdot \cdot \cdot)t^3+(\beta P_2-\beta P_1+ \cdot \cdot \cdot)t^2+(\cdot \cdot \cdot)t + P_1 P(t)=at3+bt2+ct+d=(αP2αP1+)t3+(βP2βP1+)t2+()t+P1

其中省略号表示只依赖于切向量的部分,而不依赖于端点。当它重新排列时,结果为:
P ( t ) = ( − α t 3 − β t 2 + 1 ) P 1 + ( α t 3 + β t 2 ) P 2 + ( ⋅ ⋅ ⋅ ) P 1 t + ( ⋅ ⋅ ⋅ ) P 2 t P(t)=(-\alpha t^3-\beta t^2+1)P_1+(\alpha t^3+\beta t^2)P_2+(\cdot \cdot \cdot)P_1^t + (\cdot \cdot \cdot)P_2^t P(t)=(αt3βt2+1)P1+(αt3+βt2)P2+()P1t+()P2t
这就是为什么 P 1 P_1 P1 P 1 P_1 P1 的系数加起来就是 1。

2.2 艾尔米特导数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泠山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值