matlab求曲线每点的斜率_3D曲线1:多项式曲线
1. 曲线概述
3D曲线1:多项式曲线
3D曲线1:多项式曲线1. 曲线概述
2.在图形学或者游戏编程中我们经常⽤到曲线,如:某物体沿曲线运动或者某效果的参数值按照曲线变化。本章将介绍常⽤的曲线内容。2.参数多项式曲线2.1 概念
2.1 概念
参数多项式曲线
所谓参数多项式曲线,顾名思义就是指可以通过具有独⽴参数的函数描述的曲线就是参数多项式曲线。eg: y = (1 - x²)½表⽰半径为1的2.2 多项式曲线
圆2.2 多项式曲线
多项式曲线是指曲线函数可以写为如下多项式形式的函数:
在形学或者实际游戏开发中,更多的时候我们并不知道具体曲线的多项式函数,⽽是通过其他⽅式反向模拟计算出该多项式函数(eg:
注:图形学中以三阶多项式函数的使⽤率最⾼,我们以此函数:P(t)=c0+c1*t+c2*t²+c3*t³为讨论重BezierLine)后续介绍。注:图形学中以三阶多项式函数的使⽤率最⾼,我们以此函数:P(t)=c0+c1*t+c2*t
点2.3 矩阵形式
当P(x)函数扩展到⼆维/三维空间时,曲线⽅程变为:X(t)=c10+c11*t+c12*t²+c13*t³ Y(t)=c20+c21*t+c22*t²+c23*t³ 这样的形式,
因此为了⽅便也会将曲线函数写成矩阵的形式:
注:如果我们将t看做曲线段的进度信息(时间),则t=0是为曲线的开始点t=1时未曲线段的终点。由此可知曲线段开始位置为P(0)
2.4 速度/加速度(曲线斜率)
= c0,曲线终点为P(1)=c0+c1+c2+c3。
= c0,曲线终点为P(1)=c0+c1+c2+c3。2.4 速度/加速度(曲线斜率)
由微积分的只是可知对曲线求导描述的是曲线的斜率(如果t表⽰含义是时间则斜率就是速度),对斜率再次求导则是曲线的曲率即斜率变化率
(如果t表⽰的含义是时间则⼆次求导的含义是在此时刻的加速度)
多项式差值:以上所有论述均是在已知多项式曲线函数的基础上进⾏的,但在图形学中可能更多遇到的情况是需要通过⼀3. 插值与曲线 多项式差值:
3. 插值与曲线
4. 由经过点和艾肯特算求曲线4.1 艾肯特算法求多项式函数
4.1 艾肯特算法求多项式函数
系列的经过点构造出⼀个对它们(这些经过点)差值的多项式函数4. 由经过点和艾肯特算求曲线
该算法的基本原理是将复杂问题拆为多个简单问题分别处理。具体到⽤N个经过点确定⼀条曲线的⽅法就是:将第1到N-1的经过点确定的曲
4.2 艾肯特算法⽰例
线与第2到第N个经过点确定的曲线进⾏融合得出此曲线的⽅式。4.2 艾肯特算法⽰例matlab求导
我们假设希望由三个经过点计算曲线。( 四个经过点时可以看做两个三经过点曲线的融合,五个经过点......)我们令yⁿm表⽰从第m个经过点
开始到m+n个经过点之间的曲线⽅程。如下图:
注:艾肯特算法的好处是易于实现,但是坏处也很明显他的本质是对经过点的直线的多次曲线化的模拟,可能与真实的曲线就较⼤
5. 由拉格朗⽇插值法求曲线5.1 引⼊原因
5.1 引⼊原因
出⼊。5. 由拉格朗⽇插值法求曲线
出⼊。
由于艾肯特算法得出来的曲线与真实曲线可能有较⼤误差,因此在对曲线有较⾼要求是不能使⽤此⽅式。对于N个经过点的曲线我们当然可以通过设定N-1阶曲线⽅程(N-1个曲线⽅程就有N个参数如:三
阶⽅程P(t)=c0+c1*t+c2*t²+c3*t³有c0,c1,c2,c3四个⽅程参数)并将经过点代⼊⽅程构成⽅程组算出⽅程变量c0~c3,如下图⽰例,但就计算机图形学来说这个计算消耗太⼤。因此需要引⼊拉格朗⽇差值发的算法来计算曲线⽅程。
5.2 拉格朗⽇插值法
拉格朗⽇插值法的基本原理是将过N个经过点的曲线分解成了N条曲线之和(F(x)=c0+c1*x+c2*x²+c3*x³+....+Cnx的n次⽅)。此处为了⽅便理解我们先假定N =3,理解原理后在将N扩展到任意值都可以。假定我们知道三个点(x1, y1),(x2, y2),(x3, y3)由拉格朗⽇的思想可以将过这三个点的曲线看作三条曲线之和,三条曲线分别:f1(x)该曲线在x=x1时为1,x = x2, x= x3是均为0。f
2(x)该曲线在x=x2时为1,x = x1, x= x3是均为0。f3(x)该曲线在x=x3时为1,x = x1, x= x2是均为0。拉格朗⽇发现把各曲线叠加融合之后得到的就是最终的曲线多项式: P(x) = y1*f1(x)+ y2*f2(x) +y3*f3(x)。(之所以⽤y1,y2,y3乘以对应值就是为了对三个曲线缩放后保证过最初的三个点(x1, y1),(x2, y2),(x3, y3))推导出在x1为1 x2,x3为0的f1(x)函数多项式很简单:f1(x) = (x-x2)*(x-x3)/(x1-x2)*(x1-x3)。我们将
f1(x)扩展到此⽰例中的三个维度则有:
因此由拉格朗⽇插值法反推出的曲线⽅程如下:
5.3 拉格朗⽇插值法⽰例
由以上拉格朗⽇插值法公式我们试着计算⼀个过四个点的曲线,四个点分布式p1(0,2),p2(1/3,3),p3(2/3,2),p4(1,3),第⼀步计算四个⼦((x-x2)/(x1-x2)) * ((x-x3)/(x1-x3)) * ((x-x4)/(x1-x4)) = ((x-1/3)/(0-1/3)) * ((x-2/3)/(0-2/3)) * ((x-
曲线⽅程f1(x)
f1(x) = ((x-x2)/(x1-x2)) * ((x-x3)/(x1-x3)) * ((x-x4)/(x1-x4)) =
1)/(0-1))
同样的⽅式可以求出f2(x), f3(x), f4(x) 最终的曲线⽅程: P(x) = y1 *f1(x) + y2 * f2(x) + y3 * f3(x) + y4 *f4(x)6. 总结
6. 总结
图形学中的曲线经常使⽤多项式函数来表⽰曲线⽅程,但并⾮所有曲线都可以⽤多项式函数表⽰。如:圆的⽅程式。
图形学/游戏中更多的情况并不知道曲线⽅程,反⽽是通过⼏个曲线经过的经过点来反向求曲线⽅程
常⽤根据经过点求曲线⽅程由两种⽅式:艾肯特算法和拉格朗⽇插值算法
艾肯特算法本质上是将N个点简化为两个N-1曲线叠加融合,在将N-1个点简化为两个N-2曲线叠加融合,直到N-M表⽰的是条直线。该做法简单性能⾼,计算出的曲线保证通过N个点,但计算出的曲线与实际真是的曲线误差度较⾼。
拉格朗⽇插值法本质上是将N个点简化为N条固定样式曲线的叠加曲线样式符合拉格朗⽇多项式
最终的曲线是多条拉格朗⽇多项式曲线的叠加
其好处是模拟的真实度⾼(完全⼀致的真实曲线),坏处是性能消耗相对较⾼。