> 文章列表 > 曲线平滑算法:三次Hermite曲线生成

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

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

目录

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

2. 三次Hermite曲线的绘制


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

图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曲线如下:

图2 两点三次Hermite曲线

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

图3 6点三次Hermite曲线