曲线参数化的Javascript实现(理论篇)
在关键帧动画的制作过程中,动画师在k物体运动的过程中,一般要确定2个参数:
1)运动轨迹(表示物体运动的路径);
2)速度曲线(表示物体随时间的速度变化)。
对于运动轨迹通常选用一定的样条曲线,通过动画师给出关键点位置,通过曲线插值产生,如之前介绍的一种Cardinal样条曲线。速度曲线就是速度根据时间变化的曲线,速度曲线在一段时间上的积分累加就是运动过的路程(不是位移)。对于简单的运动类型如匀速直线运动(速度曲线是一个常数),匀加速直线运动(速度曲线是一条加速度为斜率的直线方程)都可以直接获得路程随时间变化的方程,从而得到每个时间点在曲线上通过的路径长度。因此就需要在样条曲线上根据运动过的路径的长度来确定物体在曲线上的位置(由坐标(u, P(u))表示),这个过程就是曲线的参数化。
如果速度曲线为V(t),对应的路程曲线为s=A(t),对于给定的一段路程s,需要在Q(u)上找到对应的u点,设样条曲线函数为Q(u),上面的弧长函数为s=A(u),,那么参数化的过程就是把弧长函数表达成反函数的形式
,然后代人Q(u),就可以得到一个根据弧长算出曲线上函数值的方程
。
弧长函数s=A(u)是路程在u上的积分方程,所以没有解析解(所谓解析解就是通过一个求根方程直接表达成自变量u根据方程的根,如二次函数的求根方程
),因此采取数值求解的方法。求解的过程分为两步:
1)计算弧长函数s=A(u)
2)对给定的弧长s,通过二分查找法在A(u)中计算u的值
1.弧长函数s=A(u)的计算
弧长函数就是一个曲线积分的问题,就二维图像来说,如图:

在方程Q(u)~Q(u+du)上面每一段
,对s进行积分,则
其中,

因为上述积分函数并非解析可积,一般采用数值积分技术求解,简单的采用扩展是Simpson方法(在以后篇中介绍),则

这里的每个f(u)就是我们的样条函数Q(u),一般高阶系数就直接忽略了,对于一段积分s就可以用u值和展开式计算s的值。
2.二分查找
因为弧长函数是严格的单调递增函数(路径长度的累加),那么如图

(1)如果S3<Sa, 则u3<ua (红点),
搜索区间更新成[u3,u2].
(2)如果S3>Sa, 则u3>ua (蓝点),
搜索间更新成[u1,u3].
重复上述递归过程,直到||A(u1)-A(u2)||<指定精度ε,就把u1当作匹配的u值
这样我们就得到了每个s值对应的u值。另外,因为对于每一段曲线的弧长函数不同,连接起来的曲线可以用一个弧长表来纪录,如纪录下第一段曲线的总弧长,在第二段曲线上就在第一段曲线的基础上加上去,查找的方法也可以减小计算的时间复杂度,方便二分查找。
曲线参数化的Javascript实现(理论篇)的更多相关文章
- 曲线参数化的Javascript实现(代码篇)
在曲线参数化的Javascript实现(理论篇)中推出了曲线弧长积分的公式,以及用二分法通过弧长s来查找样条曲线上对应的u,再求Q(u)的值.弧长积分函数如下: ,其中-----公式1 Simpson ...
- 一步步教你轻松学支持向量机SVM算法之理论篇1
一步步教你轻松学支持向量机SVM算法之理论篇1 (白宁超 2018年10月22日10:03:35) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- 【机器学习】Logistic Regression 的前世今生(理论篇)
Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有非常多细节不正确之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请 ...
- Javascript设计模式理论与实战:工厂方法模式
本文从简单工厂模式的缺点说起,引入工厂方法模式,介绍的工厂方法模式的基本知识,实现要点和应用场景,最后举例进行说明工厂方法模式的应用.在之前的<Javascript设计模式理论与实战:简单工厂模 ...
- 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何 ...
- PHP丨PHP基础知识之流程控制WHILE循环「理论篇」
昨天讲完FOR循环今天来讲讲他的兄弟WHILE循环!进入正题: while是计算机的一种基本循环模式.当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环.while语句的一般表达式为:whil ...
- PHP丨PHP基础知识之条件语IF判断「理论篇」
if语句是指编程语言(包括c语言.C#.VB.java.php.汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一. if语句概述 if语句是指编程语言(包 ...
- Javascript本质第二篇:执行上下文
在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...
- RabbitMQ学习总结 第一篇:理论篇
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
随机推荐
- SSH框架搭建
1.建项目 2.添加Struts 3.添加String 注意:这里一共是五个包 4.添加Hibernate 添加完成,然后导入数据库 这时候是这样的 把小绿叶放到WEB-INF 5.简单写struts ...
- adb命令学习
录制屏幕操作Android4.4版本以上支持录制屏幕 adb shell screenrecord /sdcard/demo.mp4 ADB logcat 输出时间信息: adb logcat -v ...
- Python经典资料汇总
[专题推荐]Python系列英文原版电子书 http://down.51cto.com/zt/104 python简明教程(CHM) http://down.51cto.com/data/49213 ...
- 奇淫绝技:Mysql报错注入利用总结分享
http://xxx.cn/qcwh/content/detail.php?id=330&sid=19&cid=261 and exists(select*from (select*f ...
- EasyUI combobox 下拉高度自适应
要指出的是,combobox是继承自combo的,所以,combo的属性也可以被combobox使用,该问题也是这样产生的,知道这个原理,该问题就解决一半了,另一点要指出的是,在easyui中,num ...
- Linux Shell 学习总结
1. -bash: ./dd.sh: /bin/bash^M: bad interpreter: 没有那个文件或目录 当出现上面这问题的时候,首先看你的.profile 里面是否配置对了,一般配置为: ...
- asp.net链接数据库问题,设置收藏本站,设置主页
SQL Server 2008附加数据库失败:无法打开物理文件拒绝访问解决方法 无法打开物理文件 "E:\SQLDATA\EMSXDB.mdf".操作系统错误 5:"5( ...
- Eclipse 离线安装ADT
由于小猪的Eclipse中ADT版本过低无法打开Android项目了,所以要更新ADT(Android Develop Tools),但是在国内由于谷歌与本国微妙的关系想自动安装总是卡在某个点上. 所 ...
- 荣品RP4412开发板烧写Ubuntu系统应注意SD卡内存大些
问:RP4412开发板用SD卡烧写光盘中的fastboot失败,现在如何补救呢? 答:INAND格式化, 利用usb来升级啊, 也有文档,看升级文档. 问: 这个是怎么回事? 答:你是升级什么系统? ...
- spark发行版笔记10
感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 数据接收全生命周期的思考 大数据处理框架中,最重要的就是性能,性能是排在前面的.其次再考虑其他的.因为数 ...