https://blog.csdn.net/left_la/article/details/6347373

感谢强大的google翻译。

我从中认识到了航位推算dead reckoning,立方体样条Cubic Splines 算法。

我单独查找了 Cubic Splines ,里面的原理简单说明:

Cubic Splines 认为在 x 在[a, b]区间中,y对应是一条平滑的曲线,所以 y = f(x); 的一阶导函数和二阶导函数是平滑连续可导的。

拟定用三次方程,所以得出了一般的三次方程和一阶导数方程和二阶导数方程。

然后求各个分部的解。

这是三次样条的基本原理。

但文中最开始的链接中所得出的

x = At3 + Bt2 + Ct + D

y = Et3 + Ft3 + Gt + H

t是percent(0~1)区间值,如果还有三维向量,我理解是同样的展开。

然后通过四个位置点来求出 A B C D … 各分部参数的值

A = x3 – 3x2 +3x1 – x0

B = 3x2 – 6x1 + 3x0

C = 3x1 – 3x0

D = x0



E = y3 – 3y2 +3y1 – y0

F = 3y2 – 6y1 + 3y0

G = 3y1 – 3y0

H = y0

相同分量展开。(如果有Z
分量的话)

学艺不精,无法从现有姿势推出这个分量求解过程。

实时运动游戏是通过预测其他玩家的位置来表现的,当服务器有新的输入的时候,本地玩家会发现其他玩家位置或状态发生一次跳变(瞬移)。

有两种思路,

一、预测未来

  1. 通过当前位置和速度,通过预测未来精度(1s或者0.5s)推测出未来位置.
  2. 得出公式参数,通过dt来平滑当前运动轨迹。

二、延迟渲染

  1. 通过延迟渲染参数(延迟1s,0.5s来)来获得其他玩家的过去状态位置。
  2. 得出公式参数,通过dt来平滑运动轨迹。

上述两种方案

  1. 如果参数一致,速度不改,则运动轨迹跟预测一致,如果玩家输入多变,则永远不会是真实的位置。
  2. 看到的玩家的过去位置,移动轨迹跟目标玩家运动轨迹基本保持一致。

https://gist.github.com/svdamani/1015c5c4b673c3297309#file-spline-c-L26

 1 /** Numerical Analysis 9th ed - Burden, Faires (Ch. 3 Natural Cubic Spline, Pg. 149) */
2 #include <stdio.h>
3
4 int main() {
5 /** Step 0 */
6 int n, i, j;
7 scanf("%d", &n);
8 n--;
9 float x[n + 1], a[n + 1], h[n], A[n], l[n + 1],
10 u[n + 1], z[n + 1], c[n + 1], b[n], d[n];
11 for (i = 0; i < n + 1; ++i) scanf("%f", &x[i]);
12 for (i = 0; i < n + 1; ++i) scanf("%f", &a[i]);
13
14 /** Step 1 */
15 for (i = 0; i <= n - 1; ++i) h[i] = x[i + 1] - x[i];
16
17 /** Step 2 */
18 for (i = 1; i <= n - 1; ++i)
19 A[i] = 3 * (a[i + 1] - a[i]) / h[i] - 3 * (a[i] - a[i - 1]) / h[i - 1];
20
21 /** Step 3 */
22 l[0] = 1;
23 u[0] = 0;
24 z[0] = 0;
25
26 /** Step 4 */
27 for (i = 1; i <= n - 1; ++i) {
28 l[i] = 2 * (x[i + 1] - x[i - 1]) - h[i - 1] * u[i - 1];
29 u[i] = h[i] / l[i];
30 z[i] = (A[i] - h[i - 1] * z[i - 1]) / l[i];
31 }
32
33 /** Step 5 */
34 l[n] = 1;
35 z[n] = 0;
36 c[n] = 0;
37
38 /** Step 6 */
39 for (j = n - 1; j >= 0; --j) {
40 c[j] = z[j] - u[j] * c[j + 1];
41 b[j] = (a[j + 1] - a[j]) / h[j] - h[j] * (c[j + 1] + 2 * c[j]) / 3;
42 d[j] = (c[j + 1] - c[j]) / (3 * h[j]);
43 }
44
45 /** Step 7 */
46 printf("%2s %8s %8s %8s %8s\n", "i", "ai", "bi", "ci", "di");
47 for (i = 0; i < n; ++i)
48 printf("%2d %8.2f %8.2f %8.2f %8.2f\n", i, a[i], b[i], c[i], d[i]);
49 return 0;
50 }

这个上面根据 https://fac.ksu.edu.sa/sites/default/files/numerical_analysis_9th.pdf#page=167

实现了对应 x 求 y 的函数,这里x可以替换成 时间t,分别求 t 跟x 、y、z的abcd参数,最终求出s(t)函数。

INPUT

n; x0, x1, ... , xn;

a0 = f (x0), a1 = f (x1), ... , an = f (xn).

OUTPUT aj, bj, cj, dj for j = 0, 1, ... , n − 1.

(Note: S(x) = Sj(x) = aj + bj(x − xj) + cj(x − xj)2 + dj(x − xj)3 for xj ≤ x ≤ xj+1.).

最后通过x在哪个区间调用某个区间的 S(x) 函数。注意S(x)函数是一组函数,x多区间。

(或许上面两个文章介绍的其实不是一种算法 0.0)

平滑算法:三次样条插值(Cubic Spline Interpolation)的更多相关文章

  1. 三次样条插值 cubic spline interpolation

    什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...

  2. Opencv 三次样条曲线(Cubic Spline)插值

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47707679 1.样条曲线简介 样条曲 ...

  3. java 三次样条插值 画光滑曲线 例子

    java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图  不光滑和光滑曲线前后对比:    代码: 执行类: p ...

  4. SRILM Ngram 折扣平滑算法

    关于n-gram 语言模型,大部分在这篇博客里 记过了,   SRILM 语言模型格式解读 , 其实看完了,ngram的大概用法都比较清楚了, 但是关于平滑算法,一直很模糊,就晓得一个"劫富 ...

  5. Ngram折扣平滑算法

    本文档翻译自srilm手册ngram-discount.7.html     NAME ngram-discount – 这里主要说明srilm中实现的平滑算法   NOTATION a_z      ...

  6. 使用Cubic Spline通过一组2D点绘制平滑曲线

    原文Draw a smooth curve through a set of 2D points with Cubic Spline I would like to provide you with ...

  7. maya中的顶点平滑算法(vertex smooth algorithm)

    继上文继续写.有了顶点迭代器之后就可以利用MItMeshVertex类的getConnectedVertices方法来获取相连点并代入平滑算法. 选择什么样的平滑算法呢?本人比较懒,直接打开了计算机图 ...

  8. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

  9. 三次样条插值matlab实现

    三次样条插值matlab实现 %三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zhangxiaolu201 ...

随机推荐

  1. HPSocket介绍与使用

    一.HPSocket介绍 HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系 ...

  2. 解决右键notepad++打开时提示, ShellExecute failed (2): Is this command correct?

    错误如下图: 解决方法: 右键notepad++.exe; 去掉管理员方式

  3. 从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数

    内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费.内存泄漏最终会导致OOM. 造成内存泄漏 ...

  4. PyQt(Python+Qt)学习随笔:QListView的modelColumn属性及困惑

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.modelColumn介绍 QListView的modelColumn属性用于控制视图中展现mo ...

  5. PyQt(Python+Qt)学习随笔:formLayout的layoutFormAlignment 属性

    一.引言 Qt Designer的表单布局(formLayout)中,layoutFormAlignment 用于控制表单布局中所有子部件在布局框内的对齐方式(与layoutLabelAlignmen ...

  6. XSS漏洞防御之HttpOnly

    WWW服务依赖于Http协议实现,Http是无状态的协议,所以为了在各个会话之间传递信息,就需要使用Cookie来标记访问者的状态,以便服务器端识别用户信息. Cookie分为内存Cookie和硬盘C ...

  7. bugku never give up

    打开网页,看到?id=1,很容易想到了爆破. 然后bp抓包爆破.(传说中的一秒爆破.) 看到了 1p.html . 直接访问 缓缓打出一个?(这是个锤子o,本来以为这里有flag,但是,这真的是论坛啊 ...

  8. Power BI八年回望记

    本人从事BI,数据仓库领域相关工作15个年头,这15年目睹了这个方向从火爆到逐渐被大数据领域不断吞食.中间零散关注Power BI好长时间,也算目睹了它的成长. 那天在网络上搜索power bi,无意 ...

  9. Robot Framework+adb框架自动化测试Android设备案例⑷——L2层关键字

    一.EMMC测试套件 L2层关键字.robot *** Settings *** Resource ../L3公共层.robot *** Keywords *** 一般录影文件列表(EMMC) ${f ...

  10. STL(标准模板库)

    STL 主要分为三类: container(容器) - 用来管理一组数据元素 lterator(迭代器) - 可遍历STL容器内全部或部分元素的对象 algorithm(算法) - 对数据进行处理(解 ...