[原][算法][earth]三段smooth,传入时间,返回距离。仿谷歌视角飞跃处理
算法需求:
传入【0~1】的时间time,返回【0~1】的路程。
整个路程distance【0~1】分为三段路径:
第一段:在0.25time的时间里,速度从0,位置从distance:0加速移动到距离distance:K
第二段:在0.25time时间里,位置从distance:k减速移动到某距离distance:1 – ratio
第三段:在0.5time时间里,位置从distance:1 – ratio减速移动到distance:1
但是变化率由第一段1/4总时间经过的路程K和总路程长度distance大小决定:如果总路程超过10000米,。如果总路程不超过10000米,第三段就用0.2*distarationce
已知参数:
|
初速度 |
末速度 |
时间 |
距离 |
路程 |
加速度 |
距离与时间算法 |
|
|
第一段 |
0 |
0.25 |
K |
K |
|||
|
第二段 |
0.25 |
Ratio-k |
1-Ratio |
||||
|
第三段 |
0 |
0.5 |
Ratio |
1 |
第一段推导算法与参数
S = A * time * time / 2
A = S / time * time
V = S * time
|
初速度 |
末速度 |
时间 |
距离 |
路程 |
加速度 |
距离与时间算法 |
|
|
第一段 |
0 |
8k |
0.25 |
K |
K |
32k |
Time * time *16K |
|
第二段 |
8K |
0.25 |
Ratio-k |
1-Ratio |
|||
|
第三段 |
0 |
0.5 |
Ratio |
1 |
第三段推导算法与参数
S = A * time * time / 2
A = S / time * time
V = S * time
S = V *time + A * time * time / 2
|
初速度 |
末速度 |
时间 |
距离 |
路程 |
加速度 |
距离与时间算法 |
|
|
第一段 |
0 |
8k |
0.25 |
K |
K |
32k |
Time * time *16K |
|
第二段 |
8K |
4Ratio |
0.25 |
Ratio-k |
1-Ratio |
||
|
第三段 |
4Ratio |
0 |
0.5 |
Ratio |
1 |
-8Ratio |
1 –(1 – Time) *(1 – Time)*4Ratio |
接下来是第二段的推导,参数很多,似乎不用推导,但是突然发现,其实参数太多导致推导由问题:如果加速度A是固定的:
- A = 2*S/time*time 即: 32*(Ratio - k)
- A = (V1-V0)/time 即:4*(4Ratio - 8K)
32*(Ratio - k) = 4*(4Ratio - 8K)
为了满足以上算例,Ratio必须为0才行,这样不符合我们的预期。
我试了各种办法也没有能力让第二段保持这种状态,所以我舍弃第二段的初速度,使得第二段与第三段的初速度能连接。
|
初速度 |
末速度 |
时间 |
距离 |
路程 |
加速度 |
距离与时间算法 |
|
|
第一段 |
0 |
8k |
0.25 |
K |
K |
32k |
Time * time *16K |
|
第二段 |
4Ratio |
0.25 |
Ratio-k |
1-Ratio |
|||
|
第三段 |
4Ratio |
0 |
0.5 |
Ratio |
1 |
-8Ratio |
1 –(1 – Time) *(1 – Time)*4Ratio |
继续推导第二段:
S = V0 * TIME + A * TIME * TIME /2
V1 = V0 + A * TIME
à
1 - Ratio - k = v0 /4 + a / 32
4Ratio = v0 + a / 4
à
A = 32 * (k + 2Ratio - 1)
V0 = 4 * Ratio – 8 * k
|
初速度 |
末速度 |
时间 |
距离 |
路程 |
加速度 |
距离与时间算法 |
|
|
第一段 |
0 |
8k |
0.25 |
K |
K |
32k |
Time * Time *16K |
|
第二段 |
8-8k-12Ratio |
4Ratio |
0.25 |
1-Ratio-k |
1-Ratio |
32k+64Ratio-32 |
|
|
第三段 |
4Ratio |
0 |
0.5 |
Ratio |
1 |
-8Ratio |
1 –(1 – Time) *(1 – Time)*4Ratio |
注意:为了保障第二段的初速度大于零:需要Ratio < 2/3 * ( 1 - k)
第一段距离时间函数:time < 0.25
Time * Time *16K
第二段距离时间函数:time < 0.5
K + (8-8k-12Ratio)*Time + (16k+32Ratio-16)*Time*Time
第三段距离时间函数:time < 1
1 –(1 – Time) *(1 – Time)*4Ratio
//将前0到0.8的距离用0到0.2的时间完成,后0.8到1的距离用0.2到1的时间完成
//传入的是时间0~~~0.2~~~1
//返回的是距离0~~~0.8~~~1
//pathLength是总距离,作为加减速参考值
//timeRatio传入的是时间t 返回的是移动距离S(当前位置)
double GY_threeSectionSmooth(double timeRatio, double pathLength = 100000.0)
{
//
// 初速度 末速度 时间 距离 路程 加速度 距离与时间算法
// 第一段 0 8k 0.25 K K 32k Time * Time * 16K
// 第二段 8 - 8k - 12Ratio 4Ratio 0.25 1 - Ratio - k 1 - Ratio 32k + 64Ratio - 32 K + (8 - 8k - 12Ratio)*Time + (16k + 32Ratio - 16)*Time*Time
// 第三段 4Ratio 0 0.5 Ratio 1 - 8Ratio 1 –(1 – Time) *(1 – Time) * 4Ratio
//
// 定义:k是第一段的路程,Ratio是第三段的路程
// 注意:为了保障第二段的初速度大于零:需要Ratio < 2 / 3 * (1 - k)
// 例如 k定义为0.6时,Ratio不能大于0.26
//
// 第一段距离时间函数:time < 0.25
// Time * Time * 16K
// 第二段距离时间函数:time < 0.5
// K + (8 - 8k - 12Ratio)*Time + (16k + 32Ratio - 16)*Time*Time
// 第三段距离时间函数:time < 1
// 1 –(1 – Time) *(1 – Time) * 4Ratio //定义k
double k = 0.6; //计算Ratio 注意:Ratio < 2/3 * ( 1 - k)
double pathRatio = pathLength / 10000.0;
pathRatio = std::max(1.0, pathRatio);
double ratio = 0.2 / pathRatio;
ratio = std::min(ratio, 2.0/3.0*(1.0-k)); //计算三段位置与时间关系
double distanceRatio = timeRatio;
if (timeRatio < 0.25) //第一段:Time * Time * 16K
{
distanceRatio = k*timeRatio*timeRatio * ;
}
else if (timeRatio < 0.5) //第二段:K + (8 - 8k - 12Ratio)*Time + (16k + 32Ratio - 16)*Time*Time
{
timeRatio -= 0.25;
distanceRatio = k + ( - * k - * ratio) * timeRatio + ( * k + * ratio - ) * timeRatio * timeRatio;
}
else if (timeRatio <= 1.0) //第三段:1 –(1 – Time) *(1 – Time) * 4Ratio
{
distanceRatio = - ( - timeRatio)* ( - timeRatio) * * ratio;
} //logInfo("time: " + float_to_String(timeRatio) + " distance: " + float_to_String(distanceRatio) + " pathLength: " + float_to_String(pathLength) + " ratio: " + float_to_String(ratio)); return distanceRatio;
}
[原][算法][earth]三段smooth,传入时间,返回距离。仿谷歌视角飞跃处理的更多相关文章
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- 【问题记录】python 函数 传入一个对象返回一个对象值得注意
写了一个函数,这个函数接收一个参数,在函数里面判断这个参数是否为None或者不合法状态, 如果处于不合法状态,则创建一个对象返回, 如果合法直接返回 代码示例如下: def get_mq_connec ...
- [原][osgearth]earth文件加载道路一初步看见模型道路
时间是2017年2月5日17:16:32 由于OE2.9还没有发布,但是我又急于使用OE的道路. 所以,我先编译了正在github上调试中的OE2.9 github网址是:https://github ...
- python 将歌词解析封装成类,要求:提供一个方法(根据时间返回歌词) - 提示:封装两个类:歌词类、歌词管理类
自己写的 有更好方案的大佬可以讨论一下 import bisectclass Lrc(): def __init__(self, sec, lrc): self.sec = sec self.lrc ...
- 算法导论 第八章 线性时间排序(python)
比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比 ...
- ASP.Net Core中设置JSON中DateTime类型的格式化(解决时间返回T格式)
最近项目有个新同事,每个API接口里返回的时间格式中都带T如:[2019-06-06T10:59:51.1860128+08:00],其实这个主要是ASP.Net Core自带时间格式列化时间格式设置 ...
- python 传入参数返回的时候好像有些时候会出现莫名其妙的循环
def handle_field(name, s_len, s): #some code #return s would error but return not.... #return s for ...
- Loadrunner 中时间戳函数 web_save_timestamp_param(时间返回数值)
web_save_timestamp_param("tStamp", LAST); lr_output_message("Moon1:%s",lr_eval_s ...
- Mybatis中传入时间值
<if test="search_content2 != null and search_content2 != ''"> AND add_time <![CDA ...
随机推荐
- 解决mapper绑定异常:nested exception is org.apache.ibatis.binding.BindingException:
原因: 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的.由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到targe ...
- JavaScript基础知识(三个判断、三个循环)
三个判断 if…else…只会执行其中一个条件 如果if条件中只有一个值,那么会默认转布尔: if(1=="1"){ // 当括号中条件为true时,执行此处的代码 console ...
- 怎么把mkv转成mp4,有什么方法
Mkv怎样转换成MP4呢?mkv是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频.音频.图片或字幕轨道.所以其不是一种压缩格式,而是Matroska定义的 ...
- .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket
在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ...
- C和C指针小记(十五)-结构和联合
1.结构 1.1 结构声明 在声明结构时,必须列出它包含的所有成员.这个列表包括每个成员的类型和名称. struct tag {member-list} variable-list; 例如 //A s ...
- windos上安装jenkins部署springboot的jar包(未运行,只是在打包并上传linux成功了)
流程: 从linux上的svn拉取代码,到本地(windos)jenkins的工作区间的workspace,然后通过构建,打包,部署到linux上 环境: windos上安装:maven jdk je ...
- HTTP状态码简单总结
状态码数字的第一位表明了响应类别,如以下5种: 类别 原因短语 1XX Informational(信息性状态码) 接受的请求正在处理 2XX Success(成功状态码) 请求正常处理完毕 ...
- Python基础(十三) 为什么说python多线程没有真正实现多现程
Python中的多线程没有真正实现多现程! 为什么这么说,我们了解一个概念,全局解释器锁(GIL). Python代码的执行由Python虚拟机(解释器)来控制. Python在设计之初就考虑要在主循 ...
- python进阶(一) 多进程并发机制
python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...
- IO流的总结(一)
IO流的介绍: 其实在我们现实生活中有很多流,例如:水流,电流,气流 等等都是是流,但在Java中IO流是指对数据的操作的流. 按照流的分类: 1:字节流和字符流 Reader和InputStrea ...