本文转载自网络:
作者:http://blog.csdn.net/lanzhengpeng2/archive/2007/12/14/1936661.aspx
我看了不少插值的方法,有的方法讲得莫名其妙,一个程序,一些系数,为什么这个系数是1,而不是0.5从来不讲,让人很怀疑其可用性。
后来做刀光的时候,采集的刀光的点不够圆滑,需要用到插值——想想自己的高数还没有完全忘光,干脆自己推导一个得了。
首先我们要明白什么叫做光滑的曲线,可以这么认为,这个曲线是一个运动物体,在时间[0,1]内运动的轨迹。而要求的光滑的曲线,就是要求物体运动 过程中没有速度的突变。且要求不同的曲线段之间,速度也不能有突变。据此,我们可以大约知道插值一段曲线,需要指导曲线其实点的位置和速度,结束点的位置 和速度。由于有四个已知变量,显然,用一个四次方程来描述这个曲线是再合适不过了。
方程如下:
f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d [0 <= t <= 1]
对f(t)求导,得到速度方程:
f'(t) = 3 * a * t ^ 2 + 2 * b * t + c [0 <= t <= 1]
所以
f(0) = d = x0(起始点位置)
f(1) = a + b + c + d = x1(结束点位置)
f'(0) = c = y0(起始点速度)
f'(1) = 3 * a + 2 * b + c = y1(结束点速度)
联合上面四个式子可解得
a = 2 * x0 - 2 * x1 + y0 + y1
b = 3 * x1 - 3 * x0 - y1 - 2 * y0
c = y0
d = x0
再利用
f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d [0 <= t <= 1]
就可以插值这断曲线了
当然,事情还没有完,通常情况下,我们得到的数据只有各个采样点的位置,没有速度。这个时候,速度怎么办?我的解决办法是,在有3个采样点的时候(p0,p1,p2),计算出p1采样点的速度,另外,再假设采样时间间隔是均匀的,因此:
v1 = (p2 - p0) * 0.5
在有N个采样的时候,特殊处理起始点和结束点的速度
v0 = p1 - p0;
vn = pn - p(n-1)
这样得到的曲线完全满足平滑的要求,缺点是,曲线开始插值的时候要延迟一个采样点的时间,有的时候,v0 速度很快,因此,会出现一条有缝隙刀光。针对当前项目,我在第一次采样的时候,将时间稍微往后加了0.001秒,按照当前的运动趋势多采样了一次,从而消 除了这个缝隙。因为预测的运动时间很短,即使预测错误,也不影响刀光的外观。
分享到:
相关推荐
曲线插值是B样条曲线的另一个重要应用。在C++中,通过已知的一系列数据点,我们可以使用B样条曲线进行插值,使得曲线通过所有这些点。这通常涉及寻找合适的控制点,使得曲线在特定参数位置与数据点匹配。在BSplines....
三次样条曲线插值法是一种在数学和计算机科学中广泛使用的数值分析技术,特别是在数据拟合和曲线平滑中。这种方法通过构建一个由多个三次多项式段组成的光滑连续曲线来逼近离散数据点,每个数据点处的曲线都会经过该...
在计算机图形学、数值分析和工程计算等领域,B样条(B-Spline)曲线插值是一种广泛应用的技术。本文将深入探讨三次B样条曲线插值算法,特别是De Boor算法,以及C++实现的细节。 B样条曲线是通过一组控制点来定义的...
B样条曲线插值是一种在计算机图形学、工程计算和数据拟合中广泛使用的数学方法。它通过构建一组控制点来定义一条平滑曲线,这些控制点可以灵活地调整以改变曲线形状,同时保持曲线的平滑性。B样条(B-Spline)一词...
对于贝塞尔曲线,我们可能需要实现一种插值算法,使得曲线经过指定的数据点,或者尽可能接近这些点。 线性插值是最简单的方法,适用于两点之间的数据。多项式插值则可以处理更多数据点,通过构造高次多项式函数来...
近年来,曲线插值拟合算法作为运动规划的一种重要手段,得到了广泛关注。本文将曲线插值拟合算法划分为三类:基于插值的规划算法、基于特殊曲线的规划算法和基于优化的规划算法,并回顾了这些算法的发展历程。 1. ...
提出基于Loop细分方法的曲线插值方法,不需要修改细分规则,只需以插值曲线的控制多边形为中心多边形,向其两侧构造对称三角网格带,该对称三角网格带将收敛于插值曲线。因此,包含有该三角网格带的多面体网格的极限曲面...
简单详细的均匀三次B样条曲线插值MATLAB代码,有注释
说明: 对于给定的数个离散数据点,使用3次NURBS(非均匀有理B样条曲线)进行插值拟合。该算法程序能够反算出NURBS曲线控制点并绘制经过给定离散点的插值曲线。 (For a given number of discrete data points, the 3...
总之,NURBS曲线插值生成是通过对给定的数据点进行参数化处理,计算节点矢量,确定边界条件,并反算控制顶点来实现的。在Matlab中,这一过程可以通过编写源码实现,从而灵活地创建符合特定需求的平滑曲线。对于深入...
三次样条曲线插值是一种在离散数据点之间构造平滑连续曲线的方法,它在计算机图形学、数据拟合和数值分析等领域有着广泛的应用。本文将深入探讨三次样条曲线插值的基本原理,并以C#语言为例,介绍其实现过程。 首先...
曲线插值和拟合是数值分析中的重要概念,它们在数据处理、工程计算、科学建模等领域广泛应用。本文将深入探讨这两个概念,并结合提供的“曲线插值拟合代码”进行详细解析。 首先,我们理解一下“插值”。插值是一种...
在MFC应用中,我们可以通过定义一系列控制点,然后利用Lagrange插值公式计算出各个点的坐标,进而绘制出平滑的曲线。用户在视图区域通过左键点击来设置这些控制点,右键点击则触发计算和绘制过程。 Bezier曲线,另...
总结来说,通过MATLAB实现NURBS曲线插值,关键步骤包括理解NURBS曲线的数学模型,对给定数据点进行预处理,设定初始控制点,然后用优化算法反求控制顶点。`nurbsfit`、`nurbscreate`、`nurbsset`和`nurbsval`等...
在计算机图形学中,"插值法画曲线"是一种常用的技术,用于在一系列离散数据点之间创建平滑连续的曲线。这种方法可以帮助我们理解和可视化数据,尤其在数据分析、科学计算和游戏开发等领域有着广泛的应用。插值法的...
三样条曲线插值C#实现
三次样条插值是一种在保持曲线平滑的同时保证连续性(一阶和二阶导数)的方法,广泛用于数据拟合和曲线生成。 平滑曲线则关注的是如何通过一组离散点构造出一条连续且尽可能光滑的曲线。这在数据分析中特别有用,...
在VC++环境中,这种插值方法可以用于构建连续、光滑的曲线,它通过对一系列离散数据点定义三次多项式函数来实现。三次样条插值的关键在于找到合适的多项式函数,使得这些函数在每个数据点处的导数也连续,从而确保...
在图形学中,曲线插值用于平滑地连接一系列离散数据点,形成连续的曲线。常见的曲线插值方法有直线插值、样条插值(如贝塞尔曲线和B样条)和 Hermite 插值等。这些方法在动画、路径规划和表面建模中都发挥着重要作用...
对给定的点进行三次B样条插值,得到插值曲线,这里给定的点可以是二维平面上的点或三维点,注意输入的点矩阵要每行为一个点坐标,里面都有注释,可以自己简单修改封装成自己想要的带参函数,里面有测试的点数据,...