Tween算法的深入分析

电子产品耐用性测试:从物理原理到抗振动实践方法 电子产品耐用性测试是确保设备在各种环境下稳定运行的关键技术。其核心原理基于材料力学和空气动力学,通过模拟真实使用场景的振动、跌落和风压等条件,验证设备的结构完整性。在工程实践中,这种测试能够显著提升产品的可靠性和使用寿命,特别适用于户外工作、车载环境等移动场景。振动测试通常覆盖5-500Hz频率范围,而抗跌落测试则关注从1-1.5米高度的存活率。本文通过一个手机在高速行驶车顶幸存的真实案例,深入解析电子产品环境测试的标准方法,包括正弦振动、随机振动测试流程,以及如何通过斜面测试法和振动台测试法评估设备抗滑落 阅读详情

Tween算法:http://www.robertpenner.com/easing/ 这里有文档。

我们来深入解析下Tween算法公式吧,庖丁解牛

开始之前,必须了解下一些知识:

函数关于点或者直线对称方法

来自百度百科。

http://zhidao.baidu.com/question/114652008.html

http://zhidao.baidu.com/question/35072436.html

怎么求函数关于某个点对称后的函数?

例如f(x)=x+(1/x)关于点(2,1)对称的函数为g(x),那么g(x)怎么求?

解:一般的步骤是先设g(x)上的任一点为(x,y),

它关于点(2,1)对称的点的坐标为(x0,y0),

利用中点坐标公式求出它们的关系如下:

(x+x0)/2=2(y+y0)/2=1,

所以x0=4-x,y0=2-y,

因为(x0,y0)在原函数f(x)的图象上,所以满足函数关系式y0=x0+1/x0

即2-y=4-x+1/(4-x),所以y=x-2+1/(x-4)

 

已知函数的解析式,怎么求它关于某条直线对称的函数的解析式?

如:Y=X^2+X+1关于X=Y的对称函数的解析式怎么求?

设A(x,y)在函数Y=X^2+X+1上

则A关于y=x的对称点B(x',y')在函数Y=X^2+X+1上的对称函数上

AB的中点C在y=x上

C的坐标为[(x+x')/2,(y+y')/2],C在y=x上

(y+y')/2=(x+x')/2    (1)

直线AB的斜率垂直与y=x,即kAB*k=-1   kAB=-1

kAB=(y-y')/(x-x')    (2)

由(1)(2)可以解得:

x'=y

y'=x

设A(x,y)在函数Y=X^2+X+1上

将

x'=y

y'=x

代入方程Y=X^2+X+1

所以 x'=y'^2+y'+1

这就是所求的解析式

 

Linear比较简单,pass。

Quadratic Easing:

公式:p(t) = t^2

作者每次都归一化t,这样t是从 0-1,此时p(t)的结果也是0-1,那么这个结果就是缩放系数,看下源代码:

Math.easeInQuad= function (t, b, c, d) {

returnc*(t/=d)*t + b;

};

t = t/d, 然后取平方.可以理解为:c*(t/d)*(t/d) + b,作者那么写可以提速。(speeding up the process.)

看看Quadratic的easeOut函数吧:

Math.easeOutQuad= function (t, b, c, d) {

return-c * (t/=d)*(t-2) + b;

};

显然,easeIn函数和easeOut函数是关于某个点对称的,作者对t进行归一化,那么这个点就是(0.5, 0.5)

设 (x0,y0)在easeIn函数上, (x,y)在easeOut函数上,那么有

 (x0+x)/2=0.5, (y0+y)/2=0.5, 这样得出 x=1 - x0, y = 1 - y0 ;记下来,后面会用到。

对于函数Quadratic

代入y=x^2 或者是p(t)=t^2

得出:   y0=x0*(2-x0) 或者是 p(t0)=t0*(2-t0);

所以作者真正的写法应该是这样:

{

t = t / d ;

return c * t*(2-t) + b ;

}

合起来就是作者上面的公式。

接下来看看这个:easeIn和easeOut的结合

Math.easeInOutQuad = function (t, b, c, d) {

if ((t/=d/2) < 1) return c/2*t*t + b;

return -c/2 * ((--t)*(t-2) - 1) + b;

};

首先在d/2范围内对t归一化。

作者在0-d/2的地方调用easeIn,t~(0-1)

这个比较好理解,在d/2-d的地方调用easeOut,t~(0-2),但是只有t>1的部分才是我们想要的。

因此计算出的t=t-1,这样又使t归一化到了 (0-1)了,这样,就可以应用之前easeOut公式了。公式展开是这样的:

{

t = t / (d/2); // t ~(0-2)

if (t < 1) //easeIn

return c/2 * t *t + b;

else // easeOut

 {

t=t-1;//归一化到0-1之间

return  c/2 * t*(2-t) + c/2 + b ;  //  c/2 是偏移,比较好理解吧

 }

}

 

其余的也一样分析啦。接下来我只介绍easeOut以及easeInOut的easeOut部分。

CubicEasing

A cubicequation is based on the power of three.

p(t) = t^3

easeOut

y=1-(1-x0)^3

easeInOu: (后半部分)

y=1-(1-(x0-1))^3 简化为1-(2-x0)^3 ,继续化简 1+(x0-2)^3 ,这样之后

 return c/2 * (1+pow(x0-2,3)) + c/2 + b;化简就得到:

Math.easeInOutCubic = function (t, b, c, d) {

if ((t/=d/2) < 1)

return c/2 * Math.pow (t, 3) + b;

return c/2 * (Math.pow (t-2, 3) + 2) + b;

};

 

QuarticEasing

A quarticequation is based on the power of four:

p(t) = t4

easeOut

y=1-(1-x0)^4

easeInOu: (后半部分)

y=1-(1-(x0-1))^4化简为  1-(2-x0)^4

 

QuinticEasing

Quinticeasing continues the upward trend, raises time to the fifth power:

p(t) = t5

easeOut

y=1-(1-x0)^5

easeInOu: (后半部分)

y=1-(1-(x0-1))^5化简为  1-(2-x0)^5

 

Sinusoidal Easing

Asinusoidal equation is based on a sine or cosine function. Either one

producesa sine wave—a periodic oscillation of a specific shape.This is the

equationon which I based the easing curve:

p(t) = sin(t × p/2)

Math.easeInSine =function (t, b, c, d) {

return c * (1 -Math.cos(t/d * (Math.PI/2))) + b;

};

Math.easeOutSine =function (t, b, c, d) {

return c *Math.sin(t/d * (Math.PI/2)) + b;

};

Math.easeInOutSine =function (t, b, c, d) {

return c/2 * (1 -Math.cos(Math.PI*t/d)) + b;

};

easeOut的图像是:y=sin(x),easeIn是y=sin(x)关于点 (pi/4,0.5)对称的图像;

(x+x0)/2 = pi/4, (y+y0)/2=0.5, 得到 x0=pi/2 – x  , y0 = 1-y;

代入 y0=sin(x0) ,那么 1-y = sin(pi/2-x) = cos(x) ,得到 y = 1-cos(x)

其中x = t/d * pi/2;

easeInOut: 前半部分,当t=(t/(d/2)) < 1时,c/2 * (1- cos(t/d*pi/2)) + b;

后半部分:当t=(t/(d/2))>1时, c/2 *   sin((t/d-1)pi/2)  + c/2(偏移) + b;

化简得: c/2 *  sin(t/d*pi/2– pi/2)  + c/2 + b;

化简得: c/2 * (1 – cos(t/d*pi/2)) + b ;

//由公式:sin(x-pi/2)=-sin(pi/2-x)=-cos(x)

Exponential Easing

Ibased my exponential functions on the number 2 raised to a multiple of 10:

p(t) = 2^(10*(t-1))

当t=0时,p(t) 约为0.0009765625,接近于0,作者说这个函数是他找了很久才找到的。

当t=1时,pt(t)=1

Math.easeInExpo =function (t, b, c, d) {

return c *Math.pow(2, 10 * (t/d - 1)) + b;

};

Math.easeOutExpo =function (t, b, c, d) {

return c *(-Math.pow(2, -10 * t/d) + 1) + b;

};

Math.easeInOutExpo =function (t, b, c, d) {

if ((t/=d/2) < 1)

return c/2 *Math.pow(2, 10 * (t - 1)) + b;

return c/2 *(-Math.pow(2, -10 * --t) + 2) + b;

};

 

说一下EaseOut:

EaseOut和easeIn关于 (0.5,0.5)对称

于是:x0=1-x,y0=1-y

代入得 1-y = 2^(10*((1-x)-1)) = 2^(10*(-x)) = 2 ^ (-10*x)

于是 y= 1- 2^(-10*x),y就是比例系数

easeInOut就比较好理解了

 

Circular Easing

Circulareasing is based on the equation for half of a circle, which uses a

squareroot (shown next). X^2+(Y-1)^2=1  圆心 (0,1) ,半径1

p(t) = 1- sqrt(1-t^2)

根据这个公式不难得出:

Math.easeInCirc =function (t, b, c, d) {

return c * (1 -Math.sqrt(1 - (t/=d)*t)) + b;

};

Math.easeOutCirc =function (t, b, c, d) {

return c * Math.sqrt(1- (t=t/d-1)*t) + b;

};

Math.easeInOutCirc =function (t, b, c, d) {

if ((t/=d/2) < 1)

return c/2 * (1 -Math.sqrt(1 - t*t)) + b;

return c/2 *(Math.sqrt(1 - (t-=2)*t) + 1) + b;

};

说一下easeOut:

关于 (0.5,0.5)对称,那么有:x0 = 1 - x, y0 = 1 – y

代入公式得 1-y = 1- sqrt(1-(1-x)^2)

 化简得 y=sqrt(1-(1-x)^2),这就是比例系数

 或者  y=sqrt(1-(x-1)^2)

easeInOut的后半部分:

        c/2 *(sqrt(1-((t-1)-1)^2) + c/2 + b;

化简得: c/2 * (sqrt(1-(t-2)^2) + 1) + b;

 

很可惜,作者没有讲后面三个的函数的原型,不过无妨,我会后续补充的。

 

这两天碰到一个问题,我写了CCTween类,继承了CCObject,也想来个autorelease,结果可想而知,由于我使用CCTween类时并没有保留,所以过一段时间CCTween类对象被销毁,我在visit方法中访问CCTween类的对象,一直以为是多线程互斥访问的问题,后来才发现原来是CCTween类的对象没有保留,这说明autorelease完的对象不能随便用,要用的话,必须retain一下。所以索性不继承CCObject:

 

移动开发领域中Flutter的动画框架使用 本文旨在为移动开发者提供Flutter动画框架的全面指南,涵盖从基础概念到高级用法的所有内容。我们将重点讨论Flutter动画系统的架构设计、核心组件以及实际应用场景。文章首先介绍Flutter动画的基本概念,然后深入分析其实现原理,接着通过实际案例展示具体用法,最后讨论性能优化和未来发展趋势。隐式动画(Implicit Animation):通过简单属性变化自动触发的动画显式动画(Explicit Animation):需要开发者手动控制的动画Tween:定义动画值范围的插值器。 阅读详情

相关推荐

完整Tween动画缓动算法

完整Tween动画缓动算法,值得学习一下

Tween缓冲心得

<br />Tween缓冲<br /> Tween缓冲大家应该都不陌生,说白了就是从一起始位置逐渐移动到目标位置的过程,这个过程可以是加速移动,也可以是减速移动,这些不同的缓动方式就是Tween的各种ease。<br />Tween算法<br /> 概念知道了,了解一下Tween的算法对我们更好的使用Tween或者编写自己的Tween都是很有帮助的。<br /> 在缓动过程中,随着时间的推移,对象从起始位置开始逐渐向目标位置移动,我们假设移动的距离为disX,并将其作为y轴,时间t作为x轴,这样可以轻

wkyb608的专栏 1046

VizCut 全自动批量视频二次去重处理!支持视频无水印解析下载和批量剪辑,完全免费,使用简单!

可制作和分享剪辑模板,已提供20+种剪辑方案,内置众多扫光蒙版素材。支持二次去重批量处理,完全免费,无广告,且支持视频无水印解析下载,非常强大。如果说我们处理的视频需要进行一样的参数设置的话,就可以把我,1设置的参数设置为模板,后面就可以一键调用。1. 本地CPU处理,可设置线程数,可开启GPU加速,无任何限制,全看机器性能。适用场景:自媒体搬运、短视频二创、批量去重等,完全免费,无广告干扰!3. 20+种参数可调可选,内置很多相关素材。可保存为模板,可复用、可分享、可导入。2. 所有参数的设置,

goodfat的博客 5320

tween缓动画的基本算法

笔者在做canvas的游戏框架的时候遇到了动画的相关算法问题 下面就是通常使用的一些 动画的算法 可以给大家一些参考 下面是相关的变量 这个是示意图 /* * t: current time(当前时间); * b: beginning value(初始值); * c: change in value(变化量); * d: duration(持续时间)。 */ Linear:线性...

huhudeni的博客 1125

SSD盘符漂移导致OSD down场景模拟与恢复

运维团队反馈一个问题,现象是:某个OSD对应的cache分区发生了变化,比如原来cache使用的分区是/dev/sde,后来还是这块盘,但分区信息不知何故,变成了/dev/sdf(产品OSD设备并不是根据分区名称来map,而是根据partlabel),最终的现象是这个OSD down了,没法启动.接到这个现象的反馈后,记录一下这个问题在lab的复现方法。

Gavin Blog 938

Quartus的Signal Tap II的使用技巧

Signal Tap II全称Signal Tap II Logic Analyzer,是第二代系统级调试工具,它集成在Quartus II软件中,可以捕获和显示实时信号,是一款功能强大、极具实用性的FPGA片上调试工具软件。传统的FPGA板级调试是由外接的逻辑分析仪连接到FPGA的控制引脚,将内部引号引出至引脚I/O上,接着进行板级调试。

qq_37624854的博客 5898

终于找齐了梦寐以求的物体缓动算法(Tween)

先说一下算法原理:        x轴是时间,y轴是当前值,b是y轴的初始值,x轴的初始值是0,t是当前时间。当t(x轴)逐渐增加到达d时,当前值(y轴)会到达目标值(b+c)。       想详细理解的话可以找资料看看吧(貌似跟数学关系比较大)。      下面就介绍如何使用这个Tween了,首先b、c、d三个参数(即初始值,变化量,持续时间)在缓动开始前,是需要先确定好的。

问道·六韬 4240

易智联LM401模块学习(一)——初识Lora

Lora

weixin_46046597的博客 1054

C++实现缓动动画效果,使用Tween算法(含详细代码)

C++实现缓动动画效果,使用Tween算法(含详细代码)1、简介2、代码3、重要说明 1、简介 在实际的项目开发中,遇到需要通过算法为程序提供流畅的显示效果的时候,我们通常需要借助计时器和位置计算的算法来实现。这里的Tween就是一个缓动数据计算的类,有了tween算法,我们就可以在此基础上,根据具体的业务调整数据实现流畅的缓动效果了。 2、代码 #pragma once // Algorithm Reference: //http://www.cnblogs.com/cloudgamer/archive/

Coding14的博客 1731

《多模态融合改进》支持目标检测、目标分割、OBB、姿态估计,配置教程

本文以为例,讲解如何配置,支持替换专栏里所有的改进方式。

Limiiiing的博客 795

Rcpp简介

在数据分析时,代码的运行速率常常是我们所关心的话题之一。小Q往期的文章中也有介绍通过并行计算提升R运行速率的文章。然而R代码自身的运行速率偏慢,具有某种“先天缺陷”。因此,并行R函数的运行时间有时仍然不尽人意。本期小Q与大家分享R的另一提速方式:Rcpp之效率瓶颈突破。 1 什么是Rcpp 在往期的文章中曾讲过,我们在R中尽量采用向量化或内建函数运算,避免自编循环带来的额外时间消耗。然而,算法中有时难以避免循环,若循环部分耗时严重,直接并行含有该循环的算法显得力不从心,此时又该如何?稍有编程知识的读者可

Mrrunsen的博客 2260

【算法】Tween算法

Tween算法的深入分析 http://blog.youkuaiyun.com/rorger/article/details/7355054 http://www.cnblogs.com/zhangle/archive/2010/07/05/1771479.html http://monw3c.blogbus.com/logs/57106239.html 转载于:https://www.cnbl...

weixin_30919919的博客 98

Ubuntu18.04安装VCS、Verdi、dve全套教程亲测(有成功截图)

通过下面十个步骤,我们就可以在ubuntu上使用vcs、verdi、dve等软件! 一、安装ubuntu系统,这个不在这里讲了,重点叫安装VCS、Verdi等软件 下面的过程一部分同其他网上流程一致,对其中部分进行修改。如果按照其他网上教程是不会成功的,本人亲测,下面是我试验网上不同文章的流程遇到的错误摸索后总结的流程,按照步骤保证可以成功运行,包括破解流程,使用时间不限制在2020年,可以自定义2030等等。 二、安装文件结构 –synopsys_installer #此程序用于安装下面三个程序。所以你想

QQ_778132974的博客 6364

Godot后处理插件实战:从原理到应用,打造高效视觉特效管线

后处理是实时渲染中的关键技术,通过在最终渲染图像上应用一系列屏幕空间特效,显著提升视觉表现力。其核心原理是利用渲染管线输出的帧缓冲数据,通过着色器程序对每个像素进行二次加工,实现色彩校正、光照模拟、风格化等效果。这项技术的价值在于能以较低性能成本,为游戏画面添加电影级质感,增强艺术表现与沉浸感。在游戏开发中,后处理广泛应用于实现泛光、景深、色彩分级、环境光遮蔽等常见特效。本文聚焦于Godot引擎的后处理实践,针对开发者在管理多个叠加效果时面临的管线混乱、顺序控制等痛点,深入解析如何通过社区插件构建高效的后处

weixin_34121304的博客 437

ue 打包linux程序 在windows系统 2026

ue 打包linux程序 在windows系统 2026

jacke121的专栏 371

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Claude Fable 5智能体实战:一次性生成完整3D网页游戏《浣熊大劫案》

AI代码生成技术正从简单的代码补全向完整项目构建演进,其核心原理在于智能体(Agent)架构的任务分解与上下文保持能力。通过理解项目整体架构、依赖关系与模块交互逻辑,新一代AI智能体能够将自然语言需求转化为可运行的应用原型,显著提升原型开发效率。在工程实践中,这种技术尤其适用于快速验证创意的前端开发与游戏开发场景。以Three.js技术栈为例,AI智能体能够生成包含完整游戏循环、角色控制、物理交互与UI界面的3D网页游戏,如《浣熊大劫案》所示。Claude Fable 5作为具备超长上下文与复杂任务分解能力

weixin_30883311的博客 329

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

腰鼓制作基于HarmonyOS ArkTS API 24在 ArkTS 中,TextInput 组件的 onChange 回调返回的值类型是字符串,将数值字段以字符串形式存储在状态中

在 HarmonyOS NEXT 正式商用的背景下,ArkTS 作为鸿蒙生态的官方应用开发语言,正在从传统的命令式 UI 开发范式向声明式 UI 范式全面迁移。ArkUI 框架以组件化、声明式、状态驱动为核心特征,要求开发者以"描述 UI 应该是什么样"而非"一步步操作 UI 怎么变"的思维方式构建界面。本文以一个名为"智能账单"的三标签页记账应用为切入点,逐层拆解其数据模型设计、@Builder 组件复用策略、@State 状态管理机制、条件渲染导航模式,以及静态写死渲染与动态循环渲染之间的性能权衡,为

jin421352的博客 196

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Tween.js缓动算法全解析:从匀速运动到弹性回弹的15种Three.js动画效果

本文深入解析了Tween.js缓动算法在Three.js动画开发中的应用,涵盖了从基础的线性运动到复杂的弹性回弹等15种核心效果。通过结合具体代码示例,详细阐述了如何利用不同的缓动函数(如幂函数、三角函数、指数函数及物理模拟算法)为3D模型的位置、旋转、颜色等属性注入自然的运动感与物理直觉,从而显著提升Web3D应用的视觉体验与交互质感。

c2d3e4f的博客 620

JavaScript Tween算法及缓动效果

Flash做动画时会用到Tween类,利用它可以做很多动画效果,例如缓动、弹簧等等。 我这里要教大家的是怎么利用flash的Tween类的算法,来做js的Tween算法,并利用它做一些简单的缓动效果。     效果说明 首先大家到这里下载flash的as脚本(建议看看这里的demo),1.0和2.0都可以(里面的算法都一样)。 例如打开2.0的可以看到几个as文件,每个文件对应一个Tween...

qq_42396791的博客 578

JavaScript实现的Tween算法及缓冲特效。

本文实例讲述了JavaScript实现的Tween算法及缓冲特效。分享给大家供大家参考,具体如下: 这里演示Tween 算法及缓冲特效的JavaScript代码,利用它可以做缓动、弹簧等很多动画效果,怎么利用flash的Tween类的算法,来做js的Tween算法,并利用它做一些简单的缓动效果呢,看懂了本代码你就明白了。 运行效果截图如下: 在线演示地址如下: http://d

qq_40708273的博客 570

Tween各种算法的运动效果

http://www.robertpenner.com/easing/easing_demo.html

EleganceZhang的专栏 749

JavaScript Tween算法及缓动效果javascript

javascript tween算法及缓动效果 flash做动画时会用到tween类,利用它可以做很多动画效果,例如缓动、弹簧等等。 我这里要教大家的是怎么利用flash的tween类的算法,来做js的tween算法,并利用它做一些简单的缓动效果。 实例效果 tween类型: linearquadraticcubicquarticquinticsinusoidal exponentia

chaoxidawang的专栏 2042

Tween算法

【程序演示】 Tween类型 Linear Quad Cubic Quart Quint Sine Expo Circ Elastic Back Bounce Ease类型 easeIn easeOut easeInOut 【程序源码】 // Tween类 var ...

weixin_30576859的博客 189

tweenjs缓动算法使用小实例

这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合。因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在。tweenjs代码详情: 1 /* 2 * Tween.js 3 * t: current time(当前时间); 4 * b: beginning value(初始值); 5 * c: change...

weixin_30763397的博客 288

cocos2d-x 取得资源的路径的函数

2012.4.10 平台:vs2010, cocos2d-x, win7 32   CCLog("%s",CCFileUtils::getWriteablePath().c_str()); CCLog("%s", CCFileUtils::fullPathFromRelativePath("")); CCLog("%s",CCFileUtils::fullPathFromRelative

9404
上一篇: Cocos2d-x移植的Tween算法
下一篇: c 中函数指针,指向函数的指针, typedef 函数的指针例子。
rorger
博客等级 码龄16年 62粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值