曲线平滑算法:三次Hermite曲线生成

目录

 1.三次Hermite曲线的参数方程

2. 三次Hermite曲线的绘制


         Hermite曲线是通过给定曲线的两个端点的位置矢量P_{0}P_{1}以及两个端点处的切线矢量R_{0}R_{1}来描述曲线的,如图1所示。这里先对Hermite曲线进行数学公式推导,然后讲述如何绘制Hermite曲线。(这里是算法代码)

曲线平滑算法:三次Hermite曲线生成_第1张图片 图1 Hermite曲线

 1.三次Hermite曲线的参数方程

        三维空间中的自由曲线用三次参数方程表示可以用以下的形式:

\left\{\begin{matrix} x(t)=a_{x}t^{3}+b_{x}t^{2}+c_{x}t+d_{x}\\ y(t)=a_{y}t^{3}+b_{y}t^{2}+c_{y}t+d_{y} \\ z(t)=a_{z}t^{3}+b_{z}t^{2}+c_{z}t+d_{z} \end{matrix}\right.

或者:

Q(t)=at^{3}+bt^{2}+ct+d

其中,参数t的取值范围是t\in [0,1],这是归一化坐标,表示从端点1到端点2的的相对距离。

将以上参数方程改写为矩阵形式为:

Q(t)=\begin{bmatrix} t^{3} &t^{2} & t& 1 \end{bmatrix} \begin{bmatrix} a\\ b\\ c\\ d \end{bmatrix}

若令

T=\begin{bmatrix} t^{3} & t^{2} &t & 1 \end{bmatrix}

C=\begin{bmatrix} a &b &c & d \end{bmatrix}^{T}

Q(t)=T\cdot C

对参数t的一阶导数得:

Q^{'}(t)=\begin{bmatrix} 3t^{2} &2t &1 &0 \end{bmatrix}\cdot C

        假定已知曲线的两个端点的位置矢量P_{0}P_{1}以及两个端点处的切线矢量R_{0}R_{1},如图1所示。注意位置矢量和切线矢量都有x,y等分量。这四个量实际上对应于将t=0好t=1代入Q(t)Q^{'}(t)得到的结果,即:

P_{0}=Q(0)=\begin{bmatrix} 0 & 0& 0 & 0 \end{bmatrix}\cdot C

P_{1}=Q(1)=\begin{bmatrix} 1 & 1 &1 &1 \end{bmatrix}\cdot C

R_{0}=Q^{'}(0)=\begin{bmatrix} 0 & 0& 1 & 0 \end{bmatrix}\cdot C

R_{1}=Q^{'}(1)=\begin{bmatrix} 3 & 2 & 1 & 0 \end{bmatrix}\cdot C

用矩阵方程表示为:

\begin{bmatrix} P_{0}\\ P_{1}\\ R_{0}\\ R_{1} \end{bmatrix}=\begin{bmatrix} 0 & 0& 0& 1\\ 1& 1 &1 & 1\\ 0 & 0& 1 &0 \\ 3& 2& 1 & 0 \end{bmatrix}\cdot C

C=\begin{bmatrix} 0 & 0&0 &1 \\ 1& 1& 1 &1 \\ 0& 0& 1& 0\\ 3& 2 & 1 & 0 \end{bmatrix}^{-1}\begin{bmatrix} P_{0}\\ P_{1}\\ R_{0}\\ R_{1} \end{bmatrix}=\begin{bmatrix} 2 & -2& 1&1 \\ -3& 3 & -2 & -1\\ 0& 0 & 1& 0\\ 1& 0& 0 & 0 \end{bmatrix}\begin{bmatrix} P_{0}\\ P_{1}\\ R_{0}\\ R_{1} \end{bmatrix}

M_{h}=\begin{bmatrix} 2 & -2 & 1 &1 \\ -3& 3 & -2 &-1 \\ 0& 0& 1& 0\\ 1& 0& 0& 0 \end{bmatrix}

G_{h}=\begin{bmatrix} P_{0} & P_{1} & R_{0} & R_{1} \end{bmatrix}^{T}

M_{h}即为Hermite矩阵,为常数,G_{h}为Hermite几何矢量。

C=M_{h}\cdot G_{h}

于是曲线又可以表示为:

Q=T\cdot M_{h}\cdot G_{h}

因为上面的QG_{h}都是三维空间的矢量,有x,y,z三个分量:

G_{hx}=\begin{bmatrix} P_0x & P_{1x} &R_{0x} &R_{1x} \end{bmatrix}^{T}

G_{hy}=\begin{bmatrix} P_0y & P_{1y} &R_{0y} &R_{1y} \end{bmatrix}^{T}

G_{hz}=\begin{bmatrix} P_0z & P_{1z} &R_{0z} &R_{1z} \end{bmatrix}^{T}

于是将曲线Q展开成分量形式如下:

x=T\cdot M_{h}\cdot G_{hx}

y=T\cdot M_{h}\cdot G_{hy}

z=T\cdot M_{h}\cdot G_{hz}

        显然,只要给定G_{h},就可以在0\leq t\leq 1的范围内求出Q(t),形成曲线上点的轨迹。T\cdot M_{h}称之为Hermite基函数。对基函数进行进一步展开,得到四个分量:

F_{0}(t)=2t^{3}-3t^{2}+1

F_{1}(t)=-2t^{3}+3t^{2}

F_{2}(t)=t^{3}-2t^{2}+t

F_{3}(t)=t^{3}-t^{2}

于是曲线上的轨迹点,又可以通过以下公式表示:

x(t)=P_{0x}\cdot F_{0}(t)+P_{1x}\cdot F_{1}(t)+R_{0x}\cdot F_{2}(t)+R_{1x}\cdot F_{3}(t)

y(t)=P_{0y}\cdot F_{0}(t)+P_{1y}\cdot F_{1}(t)+R_{0y}\cdot F_{2}(t)+R_{1y}\cdot F_{3}(t)

z(t)=P_{0z}\cdot F_{0}(t)+P_{1z}\cdot F_{1}(t)+R_{0z}\cdot F_{2}(t)+R_{1z}\cdot F_{3}(t)

2. 三次Hermite曲线的绘制

       这里是代码下载链接:Hermite曲线绘制代码

        三次Hermite曲线的绘制,需要四个参数进行控制,分别是两个端点坐标和两个端点处的切线矢量,比如给定两个点的三维坐标P0(1,4,0)、P1(2,6,0),以及两个端点的切线矢量R0(1,-1,0)、R1(1,-1,0),其绘制的Hermite曲线如下:

曲线平滑算法:三次Hermite曲线生成_第2张图片 图2 两点三次Hermite曲线

         对于多点Hermite平滑,则是从头到尾,逐步取相邻的两个点,分别求出两点之间的Hermite曲线轨迹,比如,6个散点的Hermite曲线绘制的图像如下:

曲线平滑算法:三次Hermite曲线生成_第3张图片 图3 6点三次Hermite曲线

你可能感兴趣的:(Hermite曲线,曲线平滑,曲线拟合,三次Hermite曲线)