小程序二次贝塞尔曲线实现购物车商品曲线飞入效果


Posted in Javascript onJanuary 07, 2019

前段时间闲暇的时候看到一个贝塞尔曲线算法的文章,试着在小程序里去实现小程序的贝塞尔曲线算法,及其效果。

主要应用到的技术点:
1、小程序wxss布局,以及数据绑定
2、js二次bezier曲线算法

核心算法,写在app.js里

bezier: function (points, times) {
 
 // 0、以3个控制点为例,点A,B,C,AB上设置点D,BC上设置点E,DE连线上设置点F,则最终的贝塞尔曲线是点F的坐标轨迹。
 
 // 1、计算相邻控制点间距。
 
 // 2、根据完成时间,计算每次执行时D在AB方向上移动的距离,E在BC方向上移动的距离。
 
 // 3、时间每递增100ms,则D,E在指定方向上发生位移, F在DE上的位移则可通过AD/AB = DF/DE得出。
 
 // 4、根据DE的正余弦值和DE的值计算出F的坐标。
 
 // 邻控制AB点间距
 
 var bezier_points = [];
 
 var points_D = [];
 
 var points_E = [];
 
 const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0]['y'], 2));
 
 // 邻控制BC点间距
 
 const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1]['y'], 2));
 
 // D每次在AB方向上移动的距离
 
 const EACH_MOVE_AD = DIST_AB / times;
 
 // E每次在BC方向上移动的距离 
 
 const EACH_MOVE_BE = DIST_BC / times;
 
 // 点AB的正切
 
 const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']);
 
 // 点BC的正切
 
 const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']);
 
 // 点AB的弧度值
 
 const RADIUS_AB = Math.atan(TAN_AB);
 
 // 点BC的弧度值
 
 const RADIUS_BC = Math.atan(TAN_BC);
 
 // 每次执行
 
 for (var i = 1; i <= times; i++) {
 
 // AD的距离
 
 var dist_AD = EACH_MOVE_AD * i;
 
 // BE的距离
 
 var dist_BE = EACH_MOVE_BE * i;
 
 // D点的坐标
 
 var point_D = {};
 
 point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x'];
 
 point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y'];
 
 points_D.push(point_D);
 
 // E点的坐标
 
 var point_E = {};
 
 point_E['x'] = dist_BE * Math.cos(RADIUS_BC) + points[1]['x'];
 
 point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y'];
 
 points_E.push(point_E);
 
 // 此时线段DE的正切值
 
 var tan_DE = (point_E['y'] - point_D['y']) / (point_E['x'] - point_D['x']);
 
 // tan_DE的弧度值
 
 var radius_DE = Math.atan(tan_DE);
 
 // 地市DE的间距
 
 var dist_DE = Math.sqrt(Math.pow((point_E['x'] - point_D['x']), 2) + Math.pow((point_E['y'] - point_D['y']), 2));
 
 // 此时DF的距离
 
 var dist_DF = (dist_AD / DIST_AB) * dist_DE;
 
 // 此时DF点的坐标
 
 var point_F = {};
 
 point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x'];
 
 point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y'];
 
 bezier_points.push(point_F);
 
 }
 
 return {
 
 'bezier_points': bezier_points
 
 };
 
 }

注释很详细,算法的原理其实也很简单。 源码也发出来吧,github地址:https://github.com/xiongchenf/flybus.git

调用方法和用法就不占篇幅了,都是基础的东西。效果图如下:

小程序二次贝塞尔曲线实现购物车商品曲线飞入效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
dojo 之基础篇
Mar 24 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 Javascript
使用伪命名空间封装保护独自创建的对象方法
Aug 04 Javascript
简单的JS控制button颜色随点击更改的实现方法
Apr 17 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
Vue仿今日头条实例详解
Feb 06 Javascript
Koa 使用小技巧(小结)
Oct 22 Javascript
JS实现移动端点击按钮复制文本内容
Jul 28 Javascript
Vue如何将页面导出成PDF文件
Aug 17 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
vue常用高阶函数及综合实例
Feb 25 Vue.js
html5中sharedWorker实现多页面通信的示例代码
May 07 Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 #jQuery
jQuery判断自定义属性data-val用法示例
Jan 07 #jQuery
jQuery实现的简单歌词滚动功能示例
Jan 07 #jQuery
微信小程序发送短信验证码完整实例
Jan 07 #Javascript
JS数组求和的常用方法实例小结
Jan 07 #Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 #Javascript
vue封装一个简单的div框选时间的组件的方法
Jan 06 #Javascript
You might like
UCenter Home二次开发指南
2009/05/28 PHP
PHP技术开发技巧分享
2010/03/23 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
PHP中的替代语法介绍
2015/01/09 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
中层干部岗位职责
2013/12/18 职场文书
活动总结报告格式
2014/05/09 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
党员个人总结自评
2015/02/14 职场文书
贷款担保书范本
2015/09/22 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js