平滑算法:三次样条插值(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 ...
随机推荐
- 【论文解读】【半监督学习】【Google教你水论文】A Simple Semi-Supervised Learning Framework for Object Detection
题记:最近在做LLL(Life Long Learning),接触到了SSL(Semi-Supervised Learning)正好读到了谷歌今年的论文,也是比较有点开创性的,浅显易懂,对比实验丰富, ...
- guava中的SettableFuture分析
当缓存中没有要找的数据时,则要从数据库中去查询,而当并发量比较大时可能会击穿数据库,所以guava cache对同一值的查询做了合并请求的处理.其中就用到了SettableFuture,类似一把锁,只 ...
- oracle 游标相关资料
游标 概述:游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果. 我们可以把游标理解为 PL/SQL 中的结果集,把游标当中一个集合 1:在声明区声明游标 cursor 游标名称 is ...
- docker数据持久化/共享---volume,bind-mount,tmpfs-mount
一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供 ...
- Python中对输入的可迭代对象元素排序的sorted函数
sorted根据输入可迭代对象中的项返回一个新的已排序列表,原输入参数对象中的数据不会发生变化. 具体可参考:<Python中与迭代相关的函数>的详细介绍 老猿Python,跟老猿学Pyt ...
- 第九章 Python文件操作
前一阵子写类相关的内容,把老猿写得心都累了,本来准备继续介绍一些类相关的知识的,如闭包.装饰器.描述符.枚举类.异常等,现在实在不想继续,以后再开章节吧.本章弄点开胃的小菜提提神,介绍Python中文 ...
- PyQt(Python+Qt)学习随笔:使用pyqtConfigure建立信号和槽的连接
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在PyQt中,一般信号和槽的连接是通过connect方法建立的,语法如下: connect(slot ...
- john破解kali密码
实验环境:kali 实验工具:john 所用命令: 1.查看/etc目录下的shadow文档,此文档记录了所有用户的用户名及密码hash值 2.使用命令echo 用户名:密码 > shadow, ...
- dataframe检查重复值,去重
flag = df.price.duplicated() # flag = df.duplicated() #参考:https://www.cnblogs.com/trotl/p/11876292.h ...
- 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...