`
除却巫山不是云
  • 浏览: 14686 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

加入购物车动画【贝塞尔二次曲线函数】

阅读更多

之前看了一篇文章,原文地址 https://blog.csdn.net/rolan1993/article/details/78338853,

发现有bug。起始点的x坐标如果小于结束点坐标,是正常的。但是起始点x坐标如果大于结束点坐标,就达不到效果,所以我修改了下,放上来。

完整代码可去原作者那里下载,guthub上有源码。

	
	var ww = res.windowWidth; //获取全屏宽度
	var hh = res.windowHeight;//获取全屏高度
	that.globalData.ww = ww;
	that.globalData.hh = hh;
	//贝塞尔曲线函数
	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 = {};
      
      if(points[0]['x']<points[1]['x']){
        point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y'];
        point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x'];
      }else{
        point_D['y'] = points[0]['y']- dist_AD * Math.sin(RADIUS_AB);
        point_D['x'] = points[0]['x']- dist_AD * Math.cos(RADIUS_AB)  ;
        console.log(points[0]['x'] + '.....' + dist_AD*Math.cos(RADIUS_AB))
      }
   
      
      points_D.push(point_D);
      // E点的坐标
      var point_E = {};
      
      
      if (points[0]['x'] < points[1]['x']) {
        point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y'];
        point_E['x'] = points[1]['x'] + dist_BE * Math.cos(RADIUS_BC);
      }else{
        point_E['y'] = points[1]['y']-dist_BE * Math.sin(RADIUS_BC);
        point_E['x'] = points[1]['x'] - dist_BE * Math.cos(RADIUS_BC);
      }
      
      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 = {};
      // console.log(point_D['x'] +'........'+dist_DF * Math.cos(radius_DE))
      
      if (points[0]['x'] < points[1]['x']) {
        point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y'];
        point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x'];
      }else{
       
        point_F['y'] = point_D['y'] - dist_DF * Math.sin(radius_DE);


        point_F['x'] = point_D['x']-dist_DF * Math.cos(radius_DE) ;
        
      }

      bezier_points.push(point_F);
    }
    return {
      'bezier_points': bezier_points
    };
  },
 //busPos 的坐标就是终点的坐标,可以自己设置。
 showAnimation:function(e){
    if (!this.data.hide_good_box) return;
    this.finger = {};
    var topPoint = {};
    var finger_x = e.touches["0"].clientX-160;
    var finger_y = e.touches["0"].clientY-232;
    this.finger['x'] = finger_x;
    this.finger['y'] = finger_y;
    if (this.finger['x'] < this.busPos['x']) {
      topPoint['x'] = Math.abs(this.busPos['x'] - this.finger['x']) / 2 + this.finger['x'];

    } else {
      topPoint['x'] = Math.abs(this.finger['x'] - this.busPos['x']) / 2 + this.busPos['x'];
    }
    topPoint['y'] = this.finger['y'] - 150;
    console.log(topPoint)
    this.linePos = app.bezier([this.finger, topPoint, this.busPos], 30);
    this.startAnimation();
    var that = this;
    that.setData({
      shoppingCartIconUrl: that.data.cartUrl,
      shoppingCartNum: this.data.shoppingCartNum + 1
    })
    setTimeout(function () {
      that.setData({
        shoppingCartIconUrl: that.data.cartUrl_1
      })

    }, 400)
  },
  startAnimation: function () {
    var index = 0,
      that = this,
      bezier_points = that.linePos['bezier_points'];
    this.setData({
      hide_good_box: false,
      bus_x: that.finger['x'],
      bus_y: that.finger['y']
    })
    this.timer = setInterval(function () {
      index++;
      that.setData({
        bus_x: bezier_points[index]['x'],
        bus_y: bezier_points[index]['y'],
        redDotImageSize: that.data.redDotImageSize-10 //图片每次缩小10,慢慢缩小到购物车消失。
      })
      if (index >=28) {
        clearInterval(that.timer);
        that.setData({
          redDotImageSize: 340, //这是图片的大小,340*340
          hide_good_box: true,
          count: that.data.count += 1
        })
      }
    }, 33);
  }

 

 

分享到:
评论

相关推荐

    购物车动画-贝塞尔曲线

    在计算机图形学中,贝塞尔曲线是一种非常重要的数学工具,广泛应用于二维和三维图形的设计与动画制作中。购物车动画的实现,特别是那些流畅、自然的运动效果,往往离不开贝塞尔曲线的运用。贝塞尔曲线因其灵活性和...

    2次贝塞尔曲线算法

    **二次贝塞尔曲线算法详解** 二次贝塞尔曲线是计算机图形学中常用的一种平滑曲线生成方法,它由三个点定义:起始点P0、结束点P2以及一个控制点P1。通过这三个点,我们可以计算出一系列点,这些点连接起来形成的曲线...

    贝塞尔曲线实现仿美团商品动态添加到购物车效果

    这个模块需要与我们的贝塞尔曲线动画工具类进行交互,当用户点击商品时,调用工具类的方法启动动画,并在动画结束后更新购物车的显示。 总结来说,通过理解和应用二阶贝塞尔曲线,我们可以创建出一个流畅且富有动态...

    c# 二次贝塞尔曲线算法

    根据控制点的数量不同,贝塞尔曲线可以分为线性贝塞尔曲线(一次)、二次贝塞尔曲线、三次贝塞尔曲线等。本文将重点介绍二次贝塞尔曲线及其在C#中的实现方法。 #### 二、二次贝塞尔曲线简介 二次贝塞尔曲线是由三个...

    贝塞尔函数一阶图像_1阶贝塞尔函数_贝塞尔函数_matlab_

    贝塞尔函数是数学和计算机图形学中的一个重要概念,特别是在曲线和曲面的构造中起着核心作用。在MATLAB环境中,我们可以轻松地实现贝塞尔函数的可视化,这正是标题和描述所提及的内容。 贝塞尔函数,由法国工程师...

    贝塞尔曲线函数 曲线平滑算法

    比如,在二维图形中,如果想要连接两条贝塞尔曲线,可以将它们的端点进行线性插值,作为新曲线的中间控制点,以确保连续性。 在编程中实现贝塞尔曲线,通常会用递归方法。对于n阶贝塞尔曲线,可以将其拆分为两个(n-...

    java 二次贝塞尔曲线算法

    java 二次贝塞尔曲线算法,根据起点、终点和控制点输出点集合

    Android 贝塞尔曲线动画 拿去直接用

    二阶贝塞尔曲线有两个控制点,而三阶(也称为三次贝塞尔曲线)则有三个控制点。每个阶别的贝塞尔曲线都可以通过调整控制点的位置来改变曲线的形状和弯曲度。 在Android中,我们可以使用`Path`类来绘制贝塞尔曲线。`...

    零阶一类贝塞尔函数曲线及其包络线

    零阶一类贝塞尔函数曲线是计算机图形学中的基础概念,广泛应用于二维图形的绘制和动画设计。这类函数属于参数曲线的一种,由控制点定义,并通过线性插值产生平滑曲线。在本主题中,我们将深入探讨零阶贝塞尔函数的...

    HTML实现贝塞尔曲线

    路径数据由一系列命令和参数组成,其中`C`(对于三次贝塞尔曲线)或`Q`(对于二次贝塞尔曲线)命令用于定义控制点和结束点。 例如,一个简单的二次贝塞尔曲线可以这样表示: ```javascript var path = document....

    Android 属性动画使控件沿贝塞尔曲线移动

    在Android中,我们可以使用Path类来绘制贝塞尔曲线,Path.quadTo()方法用于创建二次贝塞尔曲线,而Path.cubicTo()则用于创建三次贝塞尔曲线。这两个方法分别需要两个和三个控制点来确定曲线的形状。 接下来,我们...

    c#/WPF二次贝塞尔曲线

    这篇关于“C#/WPF二次贝塞尔曲线”的主题将深入探讨二次贝塞尔曲线的概念、参数方程以及如何在C# WPF应用中实现它的绘制。 二次贝塞尔曲线是一种由两个控制点和一个起始点及结束点定义的参数曲线。这种曲线在图形...

    BezierCurve 贝塞尔曲线计算 c++源码

    贝塞尔曲线(Bezier Curve)是一种在计算机图形学中广泛应用的参数曲线,特别是在二维和三维建模、动画制作、游戏开发以及CAD系统中。它由法国工程师Pierre Bezier于1962年提出,因其简单易用且能够精确地控制曲线...

    二次贝塞尔曲线算法(TC)

    用TC生存二次贝塞尔曲线,其实稍微改一下就可以实现三次贝塞尔曲线的了。

    用Flet实现复杂动画贝塞尔曲线路径动画自定义模板点击添加商品按钮后商品沿着贝塞尔曲线缓缓飞入购物车动画示例源代码IDE测试通过

    这个示例代码是一个使用 Flet 框架创建的复杂动画自定义模板,展示了一个商品图标沿着贝塞尔曲线飞入购物车图标的特技动画效果。以下是这个示例的优点:直观的动画效果:通过贝塞尔曲线函数创建平滑的动画轨迹,使...

    贝塞尔曲线属性动画

    贝塞尔曲线分为线性、二次、三次及更高次,其中二次和三次贝塞尔曲线在移动控件时最为常用。二次贝塞尔曲线有两个控制点,而三次贝塞尔曲线有三个控制点。通过调整这些点的位置,我们可以精确地控制曲线的形状和弯曲...

    贝赛尔曲线的C++实现

    贝塞尔曲线在计算机图形学中是一种非常重要的曲线表示方法,特别是在二维图形绘制、动画制作、游戏开发以及工业设计等领域有着广泛的应用。三次贝塞尔曲线由四个控制点定义,分别是起点P0、终点P3以及两个控制点P1和...

    加入购物车 简单移动动画

    以下是如何利用贝塞尔曲线创建“加入购物车”动画的知识点: 1. **基础概念**:首先,了解贝塞尔曲线的基本原理,包括一阶、二阶、三阶以及更高阶的贝塞尔曲线。一阶贝塞尔曲线由两个控制点决定,二阶贝塞尔曲线则...

    贝塞尔曲线计算器

    贝塞尔曲线是一种在计算机图形学中广泛使用的数学工具,它能生成平滑、连续的曲线,常用于2D和3D图形设计、动画制作以及游戏开发。这个名为“贝塞尔曲线计算器”的程序提供了直观的方式来计算和可视化这些曲线。 ...

    iOS贝塞尔曲线制作动画进度条,一次二次曲线

    应用贝塞尔曲线与NSTimer结合使用 制作动态进度条。 简单实用,易懂,易学习 贝塞尔一次二次曲线的简单绘制,应用。 供各位童鞋学习使用分享 Q:305814832 email:ioszhaoyi@163.com

Global site tag (gtag.js) - Google Analytics