/** 
 | 
 * 贝塞尔曲线 
 | 
 */ 
 | 
function bezier(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 
 | 
  }; 
 | 
} 
 | 
  
 | 
  
 | 
/** 
 | 
 * 播放加入购物车动画 
 | 
 */ 
 | 
function playAnimation(param, callBack) { 
 | 
  console.log("playAnimation"); 
 | 
  
 | 
  //页面对象 
 | 
  var page = param.page; 
 | 
  //点击事件 
 | 
  var event = param.event; 
 | 
  
 | 
  
 | 
  if (!page.data.hide_good_box) return; 
 | 
  page.finger = {}; 
 | 
  var topPoint = {}; 
 | 
  page.finger['y'] = event.touches["0"].clientY; 
 | 
  page.finger['x'] = event.touches["0"].clientX; 
 | 
  
 | 
  if (page.finger['x'] > page.busPos['x']) { 
 | 
    page.isFingerXQtBusX = true; 
 | 
  } else { 
 | 
    page.isFingerXQtBusX = false; 
 | 
  } 
 | 
  if (page.finger['y'] < page.busPos['y']) { 
 | 
    topPoint['y'] = page.finger['y'] - 150; 
 | 
  } else { 
 | 
    topPoint['y'] = page.busPos['y'] - 150; 
 | 
  } 
 | 
  topPoint['x'] = Math.abs(page.finger['x'] - page.busPos['x']) / 2; 
 | 
  if (page.finger['x'] > page.busPos['x']) { 
 | 
    topPoint['x'] = (page.finger['x'] - page.busPos['x']) / 2 + page.busPos['x']; 
 | 
  } else { 
 | 
    topPoint['x'] = (page.busPos['x'] - page.finger['x']) / 2 + page.finger['x']; 
 | 
  } 
 | 
  
 | 
  
 | 
  if (page.isFingerXQtBusX) { 
 | 
    page.linePos = bezier([page.busPos, topPoint, page.finger], 30); 
 | 
    //启动动画 
 | 
    startAnimation(page,callBack); 
 | 
  
 | 
  } else { 
 | 
    page.linePos = bezier([page.finger, topPoint, page.busPos], 30); 
 | 
    //启动动画 
 | 
    startAnimationTow(page,callBack); 
 | 
  } 
 | 
  
 | 
  
 | 
  
 | 
} 
 | 
  
 | 
function startAnimation(page, callBack) { 
 | 
  var index = 29, 
 | 
    bezier_points = page.linePos['bezier_points']; 
 | 
  page.setData({ 
 | 
    hide_good_box: false, 
 | 
    bus_x: page.finger['x'], 
 | 
    bus_y: page.finger['y'] 
 | 
  }) 
 | 
  page.timer = setInterval(function () { 
 | 
  
 | 
    page.setData({ 
 | 
      bus_x: bezier_points[index]['x'], 
 | 
      bus_y: bezier_points[index]['y'] 
 | 
    }) 
 | 
    index--; 
 | 
    if (index < 0) { 
 | 
      clearInterval(page.timer); 
 | 
      page.setData({ 
 | 
        hide_good_box: true, 
 | 
        hideCount: false, 
 | 
        count: page.data.count += 1 
 | 
      }) 
 | 
      callBack(); 
 | 
    } 
 | 
  }, 20); 
 | 
} 
 | 
  
 | 
  
 | 
  
 | 
function startAnimationTow(page, callBack) { 
 | 
  var index = 0, 
 | 
    bezier_points = page.linePos['bezier_points']; 
 | 
  
 | 
  page.setData({ 
 | 
    hide_good_box: false, 
 | 
    bus_x: page.finger['x'], 
 | 
    bus_y: page.finger['y'] 
 | 
  }) 
 | 
  page.timer = setInterval(function () { 
 | 
  
 | 
    page.setData({ 
 | 
      bus_x: bezier_points[index]['x'], 
 | 
      bus_y: bezier_points[index]['y'] 
 | 
    }) 
 | 
    index++; 
 | 
    if (index > 28) { 
 | 
      clearInterval(page.timer); 
 | 
      page.setData({ 
 | 
        hide_good_box: true, 
 | 
        hideCount: false, 
 | 
        count: page.data.count += 1 
 | 
      }) 
 | 
  
 | 
      callBack(); 
 | 
    } 
 | 
  }, 20); 
 | 
  
 | 
} 
 | 
  
 | 
  
 | 
module.exports = { 
 | 
  
 | 
  bezier: bezier, 
 | 
  playAnimation: playAnimation, 
 | 
  
 | 
} 
 |