CG-三次样条函数
CG-三次样条函数
推导
参数连续性
给定2条曲线:
曲线和是连续的,如果它们从阶导数至阶导数在处完全相同
根据定义有:
连续:曲线上的点连续,不存在尖点
连续:曲线上点的一阶导数存在且连续
连续:曲线上点的二阶导数存在且连续
几何连续性
由于参数连续性过于严格,在集合设计中不太直观,连续性依赖于参数的选择,同一条曲线,参数不同,连续阶也不同。但是,可以通过引入参数变换使其满足参数连续。
设
性质:
- 条件
保证了曲线上没有奇点 - 几何连续性与参数选择无关,是曲线本身固有的性质
的条件比 要宽,曲线类型更多
根据定义有:
连续
对于
曲线经过点
曲线经过点
由于
$$
\boldsymbol{F^{‘}i}(t{i+1}) = \boldsymbol b_i + 2\boldsymbol{c_i}(t_{i+1} - t_i) + 3\boldsymbol{d_i}(t_{i+1}-t_i)^2 = \boldsymbol b_i + 2\boldsymbol{c_i}h_i + 3\boldsymbol{d_i}h_i^2 \tag6
$$
$$
\boldsymbol{F^{‘}{i+1}}(t{i+1}) = \boldsymbol b_{i+1} + 2\boldsymbol{c_{i+1}}(t_{i+1} - t_{i+1}) + 3\boldsymbol{d_{i+1}}(t_{i+1}-t_{i+1})^2 = \boldsymbol b_{i+1} \tag7
$$
联立(6)(7)式可得:
由于
设
根据(9)式得:
得到:
联立(5)(12)式可得:
联立(4)(8)(10)(12)(13)可得:
此时还缺少两个方程才能解出曲线的未知参数,有如下约束可以选择:
自由端:指定曲线在两个端点的二阶导数,即
该样条为自然三次样条夹持端:指定曲线在两个端点的一阶导数
其他:
- 曲线两端为抛物线
- 周期端
- 混合边界条件
这里以自然边界条件为例,则线性方程组为:
$$
6
$$
将该方程组的第1行第1列,最后1行最后1列去掉,满足三对角矩阵和对角线占优,可以使用追赶法求解方程组,具体方法见:
实现
github代码:
https://github.com/olleh-dlrow/Vortex/blob/master/Sandbox/src/CubicSplinesTest.h
数据结构
型值点具有如下信息:
- 位置
- 一阶左导数
- 一阶右导数
- 参数t
- 几何连续性类型
绘制自然三次样条
输入:型值点
输出:拟合后的三次样条曲线,型值点的参数值、导数值
根据公式计算每段曲线的未知参数,并初始化型值点的参数值和导数值,最后根据曲线计算若干离散点进行绘制
编辑型值点
选中型值点后,进入编辑模式,可以通过调整切线的控制点改变该点的切线值,根据点的几何连续性类型有如下情况:
移动型值点
在编辑模式下,拖动型值点即可移动该点,此时需要更新型值点两端的曲线,根据曲线两端点的函数值和一阶导数得到4个方程,可以解得曲线
$$
\boldsymbol{d_i} = \frac{2\boldsymbol{F_i}(t_i) + \boldsymbol{F^{\‘}{i+}}(t_i) h_i + \boldsymbol{F^{\‘}{i-}}(t_{i+1})h_i - 2\boldsymbol{F_i}(t_{i+1})}{h_i^3}
$$
$$
\boldsymbol{c_i} = \frac{\boldsymbol{F^{\‘}{i-}}(t{i+1}) - \boldsymbol{F^{\‘}{i+}}(t{i}) - 3\boldsymbol{d_i}h_i^2 }{2h_i}
$$
添加型值点
在完成初始化后,添加新的型值点不再需要保证
根据条件建立4个方程,可以解得4个未知参数如下,其中
$$
\boldsymbol{b_i} = \boldsymbol{F^{‘}{i+}}(t_i) = \boldsymbol{F^{‘}{i-}}(t_i)
$$
该方法生成的切线向量长度适中,比较适合进一步编辑
删除型值点
鼠标悬停在某个型值点上后,按下E键即可删除该点,此时需要更新所有点的参数