平滑算法:三次样条插值(Cubic Spline Interpolation)
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
分量的话)
学艺不精,无法从现有姿势推出这个分量求解过程。
实时运动游戏是通过预测其他玩家的位置来表现的,当服务器有新的输入的时候,本地玩家会发现其他玩家位置或状态发生一次跳变(瞬移)。
有两种思路,
一、预测未来
- 通过当前位置和速度,通过预测未来精度(1s或者0.5s)推测出未来位置.
- 得出公式参数,通过dt来平滑当前运动轨迹。
二、延迟渲染
- 通过延迟渲染参数(延迟1s,0.5s来)来获得其他玩家的过去状态位置。
- 得出公式参数,通过dt来平滑运动轨迹。
上述两种方案
- 如果参数一致,速度不改,则运动轨迹跟预测一致,如果玩家输入多变,则永远不会是真实的位置。
- 看到的玩家的过去位置,移动轨迹跟目标玩家运动轨迹基本保持一致。
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)的更多相关文章
- 三次样条插值 cubic spline interpolation
什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...
- Opencv 三次样条曲线(Cubic Spline)插值
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47707679 1.样条曲线简介 样条曲 ...
- java 三次样条插值 画光滑曲线 例子
java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图 不光滑和光滑曲线前后对比: 代码: 执行类: p ...
- SRILM Ngram 折扣平滑算法
关于n-gram 语言模型,大部分在这篇博客里 记过了, SRILM 语言模型格式解读 , 其实看完了,ngram的大概用法都比较清楚了, 但是关于平滑算法,一直很模糊,就晓得一个"劫富 ...
- Ngram折扣平滑算法
本文档翻译自srilm手册ngram-discount.7.html NAME ngram-discount – 这里主要说明srilm中实现的平滑算法 NOTATION a_z ...
- 使用Cubic Spline通过一组2D点绘制平滑曲线
原文Draw a smooth curve through a set of 2D points with Cubic Spline I would like to provide you with ...
- maya中的顶点平滑算法(vertex smooth algorithm)
继上文继续写.有了顶点迭代器之后就可以利用MItMeshVertex类的getConnectedVertices方法来获取相连点并代入平滑算法. 选择什么样的平滑算法呢?本人比较懒,直接打开了计算机图 ...
- 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息
from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...
- 三次样条插值matlab实现
三次样条插值matlab实现 %三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zhangxiaolu201 ...
随机推荐
- CentOS下解压缩
1 #gz 2 //压缩gz格式文件 3 gzip aa 4 //解压缩gz格式文件 5 gunzip -d aa.gz 6 //查看 7 Gunzip -l aa.gz 8 9 #bz 10 //压 ...
- 关于深度学习之中Batch Size的一点理解(待更新)
batch 概念:训练时候一批一批的进行正向推导和反向传播.一批计算一次loss mini batch:不去计算这个batch下所有的iter,仅计算一部分iter的loss平均值代替所有的. 以下来 ...
- 微信小程序里如何使用npm?小程序集成友盟举例
1.执行npm初始化指令 小程序根目录,命令执行如下指令: npm init 执行后会让加载项目初始信息,具体截图如下: 2.执行安装npm包指令 在这我们举个例子,以接入友盟统计SDK为例,执行命令 ...
- SQL优化之SQL 进阶技巧(上)
由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...
- 0001_20190327_使用frp搭建内网穿透
1. 环境 a) 公网服务器为阿里云的ECS Windows 2008 R2服务器, 有公网IP地址; 这个作为frp的服务器 b) 内网是开发服务器, Cento ...
- Python中容器指的是什么?
容器:容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中. 容器是一种可以包含其他类型对象(如列表.元组.字典等)作为元 ...
- 第10.7节 Python包和子包的定义步骤
一. 包的定义步骤 按照包名创建或使用一个已有目录,目录名就是包名,必须注意包的目录必须位于Python加载模块的搜索路径中(具体请参考<第10.1节 Python的模块及模块导入>关于模 ...
- python 保存list,map方法
1. 保存list import numpy as np a = [1,2,3,4,5] np.save("number.npy", a) k = np.load("nu ...
- 记一次MacPro风扇一直转的问题排查
1.查看CPU占用最高的进程 借助活动监视器,查看CPU占用最高的进程,可以观察到是Chrome浏览器 2.打开Chrome的任务管理器 2.1.查看CPU占用最高的chrome进程 3.分析和结束进 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...