国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 課堂 > 小程序 > 正文

小程序二次貝塞爾曲線實(shí)現(xiàn)購物車商品曲線飛入效果

2020-03-21 16:03:40
字體:
供稿:網(wǎng)友

前段時間閑暇的時候看到一個貝塞爾曲線算法的文章,試著在小程序里去實(shí)現(xiàn)小程序的貝塞爾曲線算法,及其效果。

主要應(yīng)用到的技術(shù)點(diǎn):
1、小程序wxss布局,以及數(shù)據(jù)綁定
2、js二次bezier曲線算法

核心算法,寫在app.js里

bezier: function (points, times) {  // 0、以3個控制點(diǎn)為例,點(diǎn)A,B,C,AB上設(shè)置點(diǎn)D,BC上設(shè)置點(diǎn)E,DE連線上設(shè)置點(diǎn)F,則最終的貝塞爾曲線是點(diǎn)F的坐標(biāo)軌跡。  // 1、計算相鄰控制點(diǎn)間距。  // 2、根據(jù)完成時間,計算每次執(zhí)行時D在AB方向上移動的距離,E在BC方向上移動的距離。  // 3、時間每遞增100ms,則D,E在指定方向上發(fā)生位移, F在DE上的位移則可通過AD/AB = DF/DE得出。  // 4、根據(jù)DE的正余弦值和DE的值計算出F的坐標(biāo)。  // 鄰控制AB點(diǎn)間距  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點(diǎn)間距  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;  // 點(diǎn)AB的正切  const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']);  // 點(diǎn)BC的正切  const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']);  // 點(diǎn)AB的弧度值  const RADIUS_AB = Math.atan(TAN_AB);  // 點(diǎn)BC的弧度值  const RADIUS_BC = Math.atan(TAN_BC);  // 每次執(zhí)行  for (var i = 1; i <= times; i++) {  // AD的距離  var dist_AD = EACH_MOVE_AD * i;  // BE的距離  var dist_BE = EACH_MOVE_BE * i;  // D點(diǎn)的坐標(biāo)  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點(diǎn)的坐標(biāo)  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點(diǎn)的坐標(biāo)  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  };  }

注釋很詳細(xì),算法的原理其實(shí)也很簡單。 源碼也發(fā)出來吧,github地址:https://github.com/xiongchenf/flybus.git

調(diào)用方法和用法就不占篇幅了,都是基礎(chǔ)的東西。效果圖如下:

小程序,貝塞爾曲線,購物車

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 利川市| 屯门区| 长春市| 安泽县| 安丘市| 隆昌县| 武隆县| 海晏县| 平原县| 酒泉市| 肥西县| 上虞市| 土默特右旗| 洛阳市| 印江| 清徐县| 专栏| 绥德县| 莫力| 密山市| 金山区| 昌平区| 松滋市| 白银市| 易门县| 晋中市| 阳朔县| 乌拉特前旗| 班戈县| 永城市| 错那县| 阳春市| 竹北市| 永平县| 蒲城县| 嘉禾县| 富蕴县| 伊川县| 大冶市| 红河县| 织金县|