canvas-二次贝塞尔曲线

二次贝塞尔曲线

公式:

B(t) = (1-t)^2 P_{0} + 2t(1-t)P_{1} + t^2P_{2}, t \in [0,1]

实现坠落效果:

在线试一试

坠落效果

代码如下:

const c = document.getElementById("myCanvas");

      const ctx = c.getContext("2d");

      let percent = 0;

      const data = {

        start: [400, 200],

        point: [300, 100],

        end: [100, 400],

        department: "数据1",

        value: 4321

      };

      function init() {

        percent = 0; //每次重置进程

        draw();

      }

      function draw() {

        ctx.clearRect(0, 0, c.width, c.height); //每次清除画布

        ctx.fillStyle = "#000";

        ctx.fillRect(0, 0, c.width, c.height);

        //设置线条样式

        ctx.strokeStyle = createLinearGradient(

          data.start,

          data.end,

          "#fff",

          "rgba(255,255,255,.3)"

        );

        drawCurvePath(data.start, data.point, data.end, percent);

        percent += 0.8; //进程增加,这个控制动画速度

        if (percent <= 100) {

          //没有画完接着调用,画完的话重置进度

          requestAnimationFrame(draw);

        } else {

          init();

        }

      }

      function quadraticBezier(p0, p1, p2, t) {

        const k = 1 - t;

        return k * k * p0 + 2 * k * t * p1 + t * t * p2;

      }

      function drawCurvePath(start, point, end, percent) {

        ctx.beginPath(); //开始画线

        ctx.moveTo(start[0], start[1]); //画笔移动到起点

        for (let t = 0; t <= percent / 100; t += 0.005) {

          //获取每个时间点的坐标

          const x = quadraticBezier(start[0], point[0], end[0], t);

          const y = quadraticBezier(start[1], point[1], end[1], t);

          ctx.lineTo(x, y); //画出上个时间点到当前时间点的直线

        }

        ctx.stroke(); //描边

      }

      // 线性渐变

      function createLinearGradient(start, end, startColor, endColor) {

        const lineGradient = ctx.createLinearGradient(...start, ...end);

        lineGradient.addColorStop(0, startColor);

        lineGradient.addColorStop(1, endColor);

        return lineGradient;

      }

      draw();

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容