样条之CatmullRom

所谓样条曲线是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。CatmullRom样条与上一节所讲的B样条很相似,不同在于CatmullRom样条的曲线会经过其每一个控制点。

The centripetal Catmull–Rom is a subclass of cubic Hermite spline that extends the Catmull–Rom implementation by allowing each of the four control points to be associated with an arbitrary time interval in the computation of a value on the curve. This modifies the behavior of the curve. The curve is an interpolation, and will intersect with all but the first and last control points. If the time intervals are uniform, the result will be the same as that of the original Catmull–Rom spline curve. The chordal curve uses the two dimensional Euclidean distance between control points to provide the time elements, while the centripetal curve uses the square root of the Euclidean distance. The principal reason for using the centripetal version is that it has been shown to be free of cusps and self-intersections.

关于插值与样条的介绍请看:http://www.cnblogs.com/WhyEngine/p/4020294.html

核心代码:

 1 void    YcCatmullRomSpline::BuildWeights()
 2 {
 3     ClearWeights();
 4
 5     for (Yuint i = 0; i < 4; i++)
 6     {
 7         m_splineWeights[i] = (Yreal*)malloc((m_subD)*sizeof(Yreal));
 8         m_tangentWeights[i] = (Yreal*)malloc((m_subD)*sizeof(Yreal));
 9     }
10
11     Yreal u, u_2, u_3;
12     for (Yuint i = 0; i < m_subD; i++)
13     {
14         u = (float)i / m_subD;
15         u_2 = u * u;
16         u_3 = u_2 * u;
17
18         // 参见"游戏编程精粹1"P333
19         m_splineWeights[0][i] = (-1.0f*u_3 + 2.0f*u_2 - 1.0f*u + 0.0f)*0.5f;
20         m_splineWeights[1][i] = ( 3.0f*u_3 - 5.0f*u_2 + 0.0f*u + 2.0f)*0.5f;
21         m_splineWeights[2][i] = (-3.0f*u_3 + 4.0f*u_2 + 1.0f*u + 0.0f)*0.5f;
22         m_splineWeights[3][i] = ( 1.0f*u_3 - 1.0f*u_2 + 0.0f*u + 0.0f)*0.5f;
23
24         m_tangentWeights[0][i] = (-3.0f*u_2 +  4.0f*u - 1.0f)*0.5f;
25         m_tangentWeights[1][i] = ( 9.0f*u_2 - 10.0f*u + 0.0f)*0.5f;
26         m_tangentWeights[2][i] = (-9.0f*u_2 +  8.0f*u + 1.0f)*0.5f;
27         m_tangentWeights[3][i] = ( 3.0f*u_2 -  2.0f*u + 0.0f)*0.5f;
28     }
29 }

切图:

相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip

时间: 2024-08-08 03:29:09

样条之CatmullRom的相关文章

插值与样条

先讲些题外话,前几天国庆回老家,在家中翻出了十年前大学时的一些教材课本,翻了几本看了看竟然如此的陌生.想当年考试前那么地刻苦学习,拼了命地上自——到如今变成了一场空,真令人唏嘘.其中有一本教材是<数值分析>,这门课也是挺难的,至少现在让我看是完全看不懂了.而<数值分析>一开始就是讲插值的,可以说插值是这门课的基础. 在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点.插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息. GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选. 一.              GDI+的特点和新增功能 GDI+与GDI一样,都具有设备无关性.应用程序的程序员可利用GDI+这样

插值技术之Catmull-Rom Spline Interpolating(2)

作者:i_dovelemon 来源:CSDN,http://www.dxstudio.com/guide_content.aspx?id=70a2b2cf-193e-4019-859c-28210b1da81f 日期:2015 / 8 / 25 主题:Catmull-Rom Spline Interpolating 引言 在游戏开发中,我们经常会遇到如下的情景:我们已知了一些路径点,我们希望我们的角色能够平滑的沿着这些路径点进行移动,而不是"直直的"从一个点走到另外一个点上去.对于这样

插值技术之Catmull-Rom Spline Interpolating

作者:i_dovelemon 来源:CSDN,http://www.dxstudio.com/guide_content.aspx?id=70a2b2cf-193e-4019-859c-28210b1da81f 日期:2015 / 8 / 25 主题:Catmull-Rom Spline Interpolating 引言 在游戏开发中,我们经常会遇到如下的情景:我们已知了一些路径点,我们希望我们的角色能够平滑的沿着这些路径点进行移动,而不是“直直的”从一个点走到另外一个点上去.对于这样的问题,在

样条参数与曲线长度间的互相求解

背景 在开发路径插件时,需要解决以下问题:获得路径上某一点到路径起点的曲线长度:给定曲线长度,返回路径上点的位置.路径是由三次样条(Spline)组成的,三次样条就是最高次数为 3 的一元多项式.设样条为 P(t) = f(t), 只要知道 t 就可以得到具体位置的坐标.一阶导等信息.设样条曲线长度为 s,那么要求的就是 t-s 和 s-t 的关系.不幸的是,曲线长度的计算没有解析解,只有数值方法.数值方法不适用于游戏中的时时运算,对性能影响太大.但是,如果事先对 s-t 或 t-s 曲线采样,

样条之埃尔米特(Hermite)

埃尔米特(Charles Hermite,1822—1901) 法国数学家.巴黎综合工科学校毕业.曾任法兰西学院.巴黎高等师范学校.巴黎大学教授.法兰西科学院院士.在函数论.高等代数.微分方程等方面都有重要发现.1858年利用椭圆函数首先得出五次方程的解.1873年证明了自然对数的底e的超越性.在现代数学各分支中以他姓氏命名的概念(表示某种对称性)很多,如“埃尔米特二次型”.“埃尔米特算子”等. 这种算法是由上一节讲的CatmullRom演变而成. 关于插值与样条的介绍请看:http://www

薄板样条差值(Thin plate spline)Java实现

最近一个项目里面需要用到图像变形,看了一些论文,提到几乎所有的生物有关的形变都可以使用薄板样条差值来近似.于是乎,我在网上搜索了一下薄板样条差值的代码. http://elonen.iki.fi/code/tpsdemo/有tps的c++代码.这份代码倒是可以运行(要自己另外配置opengl和boost),但是demo里面只有一个3D版本的,2D的版本只写了一个接口,并没有写demo.而我这个项目又是用java写的.于是,自己依据c++的2D版本的代码改写出了一份java版本的代码,为了方便大家

样条之抛物线(一元三点)插值函数

它是根据给定结点上的数值,用抛物插值计算指定插值点处的函数.一元三点插值算法是一种精度更高的插值算法,使用这种方法插值出来的曲线不像线性插值算法那样在分段点的地方出现折点,显得更为平滑.但它是使用二次函数来进行曲线的拟合,曲线中还是会有不平滑的情况. 关于插值与样条的介绍请看:http://www.cnblogs.com/WhyEngine/p/4020294.html 核心代码: /////////////////////////////////////////////////////////

B样条

在数学的子学科数值分析里,B-样条是样条曲线一种特殊的表示形式.它是B-样条基曲线的线性组合.B-样条是贝兹(贝塞尔)曲线的一种一般化,可以进一步推广为非均匀有理B样条(NURBS),使得我们能给更多一般的几何体建造精确的模型. 常数B样条 常数B样条是最简单的样条.只定义在一个节点距离上,而且不是节点的函数.它只是不同节点段(knot span)的标志函数(indicator function). 线性B样条 线性B样条定义在两个相邻的节点段上,在节点连续但不可微. 三次B样条 一个片断上的B