分段插值/Hermite插值

  • 1. 交互控制
  • 2. 埃尔米特曲线段
    • 2.1 埃尔米特混合函数
    • 2.2 艾尔米特导数

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

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

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

埃尔米特插值基于两点 P1P_1P1​ 和 P2P_2P2​ 以及两个切向量 P1tP_1^tP1t​ 和 P2tP_2^tP2t​。它计算从 P1P_1P1​ 开始朝向 P1tP_1^tP1t​ 到 P2P_2P2​ 结束朝向 P2tP_2^tP2t​ 的曲线段。下图显示了几个不同的埃尔米特曲线段,以及它们的端点切向量:
很明显,一个单独的艾尔米特片段可以有许多不同的形状。它甚至可以有一个尖,可以发展成一个循环。然而,一个完整的曲线,通常需要有几个连续的线段,样条方法构造这样的曲线将在之后讨论。

1. 交互控制

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

下图显示了如何通过修改矢量的振幅来编辑曲线。图中显示了三条曲线,开始在一个 45°45\degree45° 的方向,最后垂直下降。这里展示的效果很简单,随着起始切线的大小增加,曲线在原方向上继续延长。这种行为意味着段切线产生了一个曲线,改变了它的方向,并开始向终点直线移动。这样的曲线接近于直线段,因此我们得出结论,长切线会产生松曲线,而短曲线会产生紧曲线。

切线的大小(而不仅仅是方向)影响曲线形状的原因是,三维的艾尔米特段是一个三维参量,计算一个三次幂需包含四个系数,每一个都是三个一组,总共有 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)=at3+bt2+ct+d=(t3,t2,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) 的切向量为导数 dP(t)/dtdP(t)/dtdP(t)/dt,用 Pt(t)P^t(t)Pt(t) 来表示。因此,该曲线的切向量为:
Pt(t)=3at2+2bt+cP^t(t) = 3at^2+2bt+c Pt(t)=3at2+2bt+c
我们用 PPP 来表示两个给定点 P1P_1P1​ 和 P2P_2P2​ 以及两个给定的切线 P1tP^t_1P1t​ 和 P2tP^t_2P2t​。方程 P(0)=P1,P(1)=P2,Pt(0)=P1t,Pt(1)=P2tP(0)=P_1, P(1)=P_2, P^{t}(0)= P^t_1, P^{t}(1)= P^t_2P(0)=P1​,P(1)=P2​,Pt(0)=P1t​,Pt(1)=P2t​,其显式表示为:
a⋅03+b⋅02+c⋅0+d=P1a⋅13+b⋅12+c⋅1+d=P23a⋅02+2b⋅0+c=P1t3a⋅12+2b⋅1+c=P2t\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} a⋅03+b⋅02+c⋅0+da⋅13+b⋅12+c⋅1+d3a⋅02+2b⋅0+c3a⋅12+2b⋅1+c​=P1​=P2​=P1t​=P2t​​

很容易解得:
a=2P1−2P2+P1t+P2t,b=−3P1+3P2−2P1t−P2t,c=P1t,d=P1.\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=2P1​−2P2​+P1t​+P2t​,b=−3P1​+3P2​−2P1t​−P2t​,c=P1t​,d=P1​.

将这些解带入方程,整理可得:
P(t)=(2P1−2P2+P1t+P2t)t3+(−3P1+3P2−2P1t−P2t)t2+P1tt+P1=(2t3−3t2+1)P1+(−2t3+3t2)P2+(t3−2t2+t)P1t+(t3−t2)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\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)​=(2P1​−2P2​+P1t​+P2t​)t3+(−3P1​+3P2​−2P1t​−P2t​)t2+P1t​t+P1​=(2t3−3t2+1)P1​+(−2t3+3t2)P2​+(t3−2t2+t)P1t​+(t3−t2)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​

其中,
F1(t)=(2t3−3t2+1),F2(t)=(−2t3+3t2)=1−F1(t),F3(t)=(t3−2t2+t),F4(t)=(t3−t2).\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)=(2t3−3t2+1),F2​(t)=(−2t3+3t2)=1−F1​(t),F3​(t)=(t3−2t2+t),F4​(t)=(t3−t2).​

BBB 为队列 (P1,P2,P1t,P2t)T(P_1, P_2, P^t_1, P^t_2)^T(P1​,P2​,P1t​,P2t​)T,F(t)F(t)F(t) 为行 (F1(t),F2(t),F3(t),F4(t))(F_1(t), F_2(t), F_3(t), F_4(t))(F1​(t),F2​(t),F3​(t),F4​(t))。

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

F(t)=(t3,t2,t,1)(2−211−33−2−100101000)=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)⎝⎜⎜⎛​2−301​−2300​1−210​1−100​⎠⎟⎟⎞​=T(t)H

曲线现在可以写成:
P(t)=F(t)B=T(t)HB=(t3,t2,t,1)(2−211−33−2−100101000)(P1P2P1tP2t)\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)⎝⎜⎜⎛​2−301​−2300​1−210​1−100​⎠⎟⎟⎞​⎝⎜⎜⎛​P1​P2​P1t​P2t​​⎠⎟⎟⎞​

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

2.1 埃尔米特混合函数

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

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

函数 F4(t)F_4(t)F4​(t) 可作类似解释。它对 ttt 的大小几乎没有影响。它的最大值(实际上是最小值,因为它是负的)出现在 t=2/3t=2/3t=2/3 处,所以它只影响这个区域的曲线。当 ttt 的值接近 2/32/32/3,曲线近似为点 F2(t)P2F_2(t)P_2F2​(t)P2​(贡献大),点 F1(t)P1F_1(t)P_1F1​(t)P1​(贡献小) 和向量 −∣F4(t)∣P2t-|F_4(t)|P^t_2−∣F4​(t)∣P2t​ 的和。因为 F4(t)F_4(t)F4​(t) 是负的,这个和等于 (x−vx,y−vy)(x-v_x,y-v_y)(x−vx​,y−vy​),这就是曲线接近末端点 P2P_2P2​ 时向方向 P2tP_2^tP2t​ 移动的原因。

另一个埃尔米特权重函数的重要特征是,F1(t)F_1(t)F1​(t) 和 F2(t)F_2(t)F2​(t) 均为重心。它们一定是这样的,因为它们混合了两个点。从前面公式可知为什么是这样的:
a⋅03+b⋅02+c⋅0+d=P1a⋅13+b⋅12+c⋅1+d=P23a⋅02+2b⋅0+c=P1t3a⋅12+2b⋅1+c=P2t\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} a⋅03+b⋅02+c⋅0+da⋅13+b⋅12+c⋅1+d3a⋅02+2b⋅0+c3a⋅12+2b⋅1+c​=P1​=P2​=P1t​=P2t​​

第一个方程就是 d=P1d=P_1d=P1​,将第二项减小为了 a+b+c=P2−P1a+b+c=P_2-P_1a+b+c=P2​−P1​。第三个方程求解 ccc,第四个方程和第二个方程结合,最终被用来计算 aaa 和 bbb。所有这些说明 aaa 和 bbb 的形式是 a=α(P2−P1)+⋅⋅⋅,b=β(P2−P1)+⋅⋅⋅a=\alpha(P_2 - P_1)+\cdot \cdot \cdot, b=\beta(P_2-P_1)+ \cdot \cdot \cdota=α(P2​−P1​)+⋅⋅⋅,b=β(P2​−P1​)+⋅⋅⋅。因此最终的曲线有形式:
P(t)=at3+bt2+ct+d=(αP2−αP1+⋅⋅⋅)t3+(βP2−βP1+⋅⋅⋅)t2+(⋅⋅⋅)t+P1P(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_1P(t)=at3+bt2+ct+d=(αP2​−αP1​+⋅⋅⋅)t3+(βP2​−βP1​+⋅⋅⋅)t2+(⋅⋅⋅)t+P1​

其中省略号表示只依赖于切向量的部分,而不依赖于端点。当它重新排列时,结果为:
P(t)=(−αt3−βt2+1)P1+(αt3+βt2)P2+(⋅⋅⋅)P1t+(⋅⋅⋅)P2tP(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^tP(t)=(−αt3−βt2+1)P1​+(αt3+βt2)P2​+(⋅⋅⋅)P1t​+(⋅⋅⋅)P2t​
这就是为什么 P1P_1P1​ 和 P1P_1P1​ 的系数加起来就是 1。

2.2 艾尔米特导数

分段插值/Hermite插值相关推荐

  1. 【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】

    光滑曲线在数学上的定义是什么?? 原文链接:光滑曲线在数学上的定义是什么? 回答1: 定义:切线随切点的移动而连续转动. 若函数f(x)f(x)f(x)在区间(a,b)(a,b)(a,b)内具有一阶连 ...

  2. 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)

    文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...

  3. 数学建模之Hermite插值法和三次样条插值法(附上详细的matlab代码)

    插值算法 一般定义 若P(x)为次数不超过n的代数多项式,即 P(x)=a0+a1x+...+anxnP(x)=a_0+a_1x+...+a_nx^n P(x)=a0​+a1​x+...+an​xn ...

  4. Hermite插值是牛顿插值的极限情形

    Hermite插值可以看作牛顿插值的极限状况.为什么可以这么说呢?我们来看一个实例: 构造一个三次多项式 $p_3$ 使得 $p_3(0)=0$,$p_3(1)=1,p_3'(0)=1,p_3'(1) ...

  5. 埃尔米特(Hermite)插值

    Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值.对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况.在此情 ...

  6. c语言埃尔米特插值思路,【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值...

    1.埃尔米特(Hermite)插值 1.1.Hermite插值多项式 如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一阶.二阶甚至更高阶的导数值,这就是 Hermite 插值问 ...

  7. 艾尔米特插值的MATLAB实现,埃尔米特(Hermite)插值

    Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值.对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况.在此情 ...

  8. 插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值

    插值:求过已知有限个数据点的近似函数. 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小. 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似 ...

  9. C#实现拉格朗日、牛顿、Hermite插值

    拉格朗日.牛顿插值法 初始时需要至少两个参考坐标点,在参考点的基础之上构造插值函数y=f(x),然后由插值函数确定需要求解的x坐标的函数值.相较于拉格朗日插值,牛顿插值公式更加复杂,但是在增加一个参考 ...

  10. 【12月学习进度3/31—计算机图形学期末准备01】拉格朗日插值 + 三次Hermite插值

    相关概念 型值点:事先给定的离散点 插值:得到的曲线通过所有的型值点 逼近:不要求通过给定的所有型值点,用给定型值点控制曲线形状 Hermite多项式 拉格朗日插值 拉格朗日插值是当 j=0j=0j= ...

最新文章

  1. mpvue 小程序如何开启下拉刷新,上拉加载?
  2. [转]Photoshop Lab模式下保细节修复偏暗人物照片
  3. 【工具类】分布式文件存储-FastDFS
  4. scala学习手记28 - Execute Around模式
  5. linux SPI分析
  6. oracle异构迁移,异构数据库系统迁移到Oracle 工具 - Oracle SQL Developer
  7. P2422 良好的感觉
  8. 问题解决:你需要trustedinstaller提供的权限才能删除
  9. OpenGL第八版--初识OpenG
  10. 卖D版的抢Z版的钱,卖Z版的抢我的钱,都是流氓,我向着谁?
  11. 对许多张图片进行批量裁剪,看看我是如何快速做到的
  12. [模电]差模信号、共模信号的通俗解释
  13. BDP数据可视化分析工具,TAGUL数据可视化分析工具
  14. Gauss数据库初识
  15. [HAOI2014] 贴海报
  16. 无蓝光护眼台灯哪个牌子好?盘点几款无蓝光无频闪的护眼台灯
  17. 地塞米松/多柔比星/胡桃醌/丹皮酚-PLGA聚乳酸-羟基乙酸纳米粒
  18. 短视频动态贴纸的实现思路
  19. python程序函数执行时间
  20. Android 开源项目PhotoView遇到问题

热门文章

  1. C#【多线程篇】BackgroundWorker类使用总结
  2. CDN技术原理 CDN细节特点
  3. Discuz!代码大全
  4. HttpSession详解(简称session)
  5. HttpSession的简介
  6. java 正则表达式匹配_Java 正则表达式匹配
  7. EP100含有.S文件的bootloader
  8. 信号与噪声经过匹配滤波器后能量
  9. 5步绘制软件开发流程图
  10. 用python给游戏加上音效_添加声音到你的Python游戏