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


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 数组运用实现代码
Apr 13 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
jQuery.extend()的实现方式详解及实例
Jun 29 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
jquery教程ajax请求json数据示例
Jan 13 Javascript
Vue2.0 UI框架ElementUI使用方法详解
Apr 14 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
浅谈vue+webpack项目调试方法步骤
Sep 11 Javascript
详解Vue.js中.native修饰符
Apr 24 Javascript
js如何获取图片url的Blob值并预览示例代码
Mar 07 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
Sep 04 Javascript
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
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性能优化 产生高度优化代码
2011/07/22 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
JavaScript splice()方法详解
2020/09/22 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
Python交换变量
2008/09/06 Python
Python中实现三目运算的方法
2015/06/21 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
房屋买卖协议书
2014/04/10 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
日语专业求职信
2014/07/04 职场文书
解决Redis启动警告问题
2022/02/24 Redis