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


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 attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
Aug 05 Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 Javascript
JS和Jquery获取和修改label的值的示例代码
Jan 15 Javascript
Extjs表单常见验证小结
Mar 07 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
JavaScript调用浏览器打印功能实例分析
Jul 17 Javascript
Bootstrap媒体对象学习使用
Mar 07 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
详解webpack打包第三方类库的正确姿势
Oct 20 Javascript
详解vue中多个有顺序要求的异步操作处理
Oct 29 Javascript
微信小程序实现列表的横向滑动方式
Jul 15 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中static关键字原理的学习研究分析
2011/07/18 PHP
php生成二维码
2015/08/10 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
js正则相关知识点专题
2018/05/10 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
学习Python需要哪些工具
2020/09/04 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
师德学习感言
2014/01/31 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
行政内勤岗位职责
2014/04/07 职场文书
学风建设演讲稿
2014/09/12 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
学习作风建设心得体会
2014/10/22 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python