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


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 相关文章推荐
获取网站跟路径的javascript代码(站点及虚拟目录)
Oct 20 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
Jan 15 Javascript
javascript开发随笔二 动态加载js和文件
Nov 25 Javascript
自动设置iframe大小的jQuery代码
Sep 11 Javascript
jQuery中校验时间格式的正则表达式小结
Sep 22 Javascript
使用jquery自定义鼠标样式满足个性需求
Nov 05 Javascript
深入理解JSON数据源格式
Jan 10 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
JavaScript find()方法及返回数据实例
Apr 30 Javascript
DWR内存兼容及无法调用问题解决方案
Oct 16 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
详解vue-cli 接口代理配置
2017/12/13 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
python ip正则式
2009/05/07 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
python定义具名元组实例操作
2021/02/28 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
创建索引时需要注意的事项
2013/05/13 面试题
法律专业实习鉴定
2013/12/22 职场文书
大学秋游活动方案
2014/02/11 职场文书
市场专员岗位职责
2014/02/14 职场文书
艺术节主持词
2014/04/02 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
Python中文纠错的简单实现
2021/07/07 Python
MySQL笔记 —SQL运算符
2022/01/18 MySQL