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


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 节点遍历函数
Mar 28 Javascript
javaScript中的this示例学习详解及工作原理
Jan 13 Javascript
用NODE.JS中的流编写工具是要注意的事项
Mar 01 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
Aug 11 Javascript
微信小程序 switch组件详解及简单实例
Jan 10 Javascript
AngularJS中使用ngModal模态框实例
May 27 Javascript
js中apply和Math.max()函数的问题及区别介绍
Mar 27 Javascript
webpack中如何使用雪碧图的示例代码
Nov 11 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
vue中input的v-model清空操作
Sep 06 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 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
PHP出错界面
2006/10/09 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
JS打印组合功能
2016/08/04 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Python rstrip()方法实例详解
2018/11/11 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
python interpolate插值实例
2020/07/06 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
企业文化理念标语
2014/06/10 职场文书
物业管理专业自荐信
2014/07/01 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
《开国大典》教学反思
2016/02/16 职场文书
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js