JS使用canvas绘制旋转风车动画

yizhihongxing

Canvas 是 HTML5 提供的一种绘图接口,能够通过 JavaScript 在网页上绘制出各种复杂的图案和动画效果。本文将详细讲解如何使用 Canvas 绘制旋转风车动画。

步骤

在 HTML 中创建 Canvas 元素

首先需要在 HTML 中创建一个 Canvas 元素,它将作为绘图的画布。可以设置 Canvas 的宽高和 ID,如下所示:

<canvas id="canvas" width="500" height="500"></canvas>

获取 Canvas 上下文

在 JavaScript 中,需要获取 Canvas 上下文来绘制图形。可以通过下面的代码获取 Canvas 上下文:

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

绘制风车的叶子

使用 beginPath() 方法开始一条路径并设置路径的起点。然后使用 lineTo() 方法画出三角形的三个点,并使用 closePath() 方法封闭路径。接着通过 fill() 方法填充颜色。代码如下:

ctx.fillStyle = '#f00';
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + l * Math.sin(angle), y + l * Math.cos(angle));
ctx.lineTo(x + h * Math.sin(angle + 0.3 * Math.PI), y + h * Math.cos(angle + 0.3 * Math.PI));
ctx.lineTo(x + l * Math.sin(angle + 0.6 * Math.PI), y + l * Math.cos(angle + 0.6 * Math.PI));
ctx.lineTo(x, y);
ctx.closePath();
ctx.fill();

绘制风车的主体

使用 lineWidth 属性设置绘制线条的宽度。使用 moveTo() 方法设置路径的起点。然后使用 lineTo() 方法画出直线的终点。代码如下:

ctx.lineWidth = 5;  
ctx.beginPath();
ctx.moveTo(250, 250);
ctx.lineTo(250, 50);
ctx.stroke();

ctx.beginPath();
ctx.moveTo(250, 50);
ctx.lineTo(200, 100);
ctx.lineTo(300, 100);
ctx.closePath();
ctx.fill();

渲染动画

HTML5 中提供了一个 requestAnimationFrame() 方法,用于在屏幕刷新之前请求浏览器执行一个指定的动画。通过 setInterval() 方法可以创建一个定时器,以控制动画的帧率。

setInterval(function() {
  // 清空画布
  ctx.clearRect(0, 0, 500, 500);

  // 绘制风车
  drawWindmill(ctx, 250, 250, 150, angle);

  // 改变角度
  angle += Math.PI / 30;
}, 1000/60);

示例

下面提供两个示例,一个是绘制单个旋转风车,另一个是同时绘制多个旋转风车。

单个旋转风车

可以使用下面的代码绘制单个旋转风车:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>绘制旋转风车动画</title>
  </head>
  <body>
    <canvas id="canvas" width="500" height="500"></canvas>
    <script>
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');

      // 绘制叶子
      function drawWindmill(ctx, x, y, l, angle) {
        var h = l / 2;  // 叶子高度
        ctx.fillStyle = '#f00';
        ctx.beginPath();
        ctx.moveTo(x, y);
        ctx.lineTo(x + l * Math.sin(angle), y + l * Math.cos(angle));
        ctx.lineTo(x + h * Math.sin(angle + 0.3 * Math.PI), y + h * Math.cos(angle + 0.3 * Math.PI));
        ctx.lineTo(x + l * Math.sin(angle + 0.6 * Math.PI), y + l * Math.cos(angle + 0.6 * Math.PI));
        ctx.lineTo(x, y);
        ctx.closePath();
        ctx.fill();

        // 绘制轴
        ctx.strokeStyle = '#000';
        ctx.lineWidth = 2;
        ctx.beginPath();
        ctx.moveTo(x, y);
        ctx.lineTo(x, y + l / 2);
        ctx.stroke();
      }

      // 绘制主体
      ctx.fillStyle = '#fff';
      ctx.strokeStyle = '#000';
      ctx.beginPath();
      ctx.moveTo(250, 250);
      ctx.lineTo(250, 50);
      ctx.stroke();

      ctx.beginPath();
      ctx.moveTo(250, 50);
      ctx.lineTo(200, 100);
      ctx.lineTo(300, 100);
      ctx.closePath();
      ctx.fill();

      // 渲染动画
      var angle = 0;
      setInterval(function() {
        // 清空画布
        ctx.clearRect(0, 0, 500, 500);

        // 绘制风车
        drawWindmill(ctx, 250, 250, 150, angle);

        // 改变角度
        angle += Math.PI / 30;
      }, 1000/60);
    </script>
  </body>
</html>

多个旋转风车

可以在上面的代码基础上,稍作修改即可同时绘制多个旋转风车:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>绘制旋转风车动画</title>
  </head>
  <body>
    <canvas id="canvas" width="500" height="500"></canvas>
    <script>
      // 绘制叶子
      function drawWindmill(ctx, x, y, l, angle) {
        var h = l / 2;  // 叶子高度
        ctx.fillStyle = '#f00';
        ctx.beginPath();
        ctx.moveTo(x, y);
        ctx.lineTo(x + l * Math.sin(angle), y + l * Math.cos(angle));
        ctx.lineTo(x + h * Math.sin(angle + 0.3 * Math.PI), y + h * Math.cos(angle + 0.3 * Math.PI));
        ctx.lineTo(x + l * Math.sin(angle + 0.6 * Math.PI), y + l * Math.cos(angle + 0.6 * Math.PI));
        ctx.lineTo(x, y);
        ctx.closePath();
        ctx.fill();

        // 绘制轴
        ctx.strokeStyle = '#000';
        ctx.lineWidth = 2;
        ctx.beginPath();
        ctx.moveTo(x, y);
        ctx.lineTo(x, y + l / 2);
        ctx.stroke();
      }

      function drawWindmills() {
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');

        // 绘制主体
        ctx.fillStyle = '#fff';
        ctx.strokeStyle = '#000';
        ctx.beginPath();
        ctx.moveTo(250, 250);
        ctx.lineTo(250, 50);
        ctx.stroke();

        ctx.beginPath();
        ctx.moveTo(250, 50);
        ctx.lineTo(200, 100);
        ctx.lineTo(300, 100);
        ctx.closePath();
        ctx.fill();

        // 渲染动画
        var angle = 0;
        setInterval(function() {
          // 清空画布
          ctx.clearRect(0, 0, 500, 500);

          // 绘制风车
          drawWindmill(ctx, 150, 150, 100, angle);
          drawWindmill(ctx, 350, 350, 100, -angle);

          // 改变角度
          angle += Math.PI / 30;
        }, 1000/60);
      }

      drawWindmills();
    </script>
  </body>
</html>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS使用canvas绘制旋转风车动画 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript实现cookie的操作

    下面是详细讲解 JavaScript 实现 Cookie 操作的攻略。 什么是 Cookie Cookie(中文翻译为“网页 Cookie”或者“浏览器 Cookie”)是网站为了辨别用户身份的一种标识,是存在用户本地终端上的数据。Cookie 是小型文本文件,由网站服务器发送给用户浏览器,浏览器会将其存储在本地,之后每次请求该网站时都会携带该 Cookie…

    JavaScript 2023年6月11日
    00
  • 解析Json字符串的三种方法日常常用

    当你需要从后端获取JSON格式的数据并在前端使用时,你需要解析该JSON字符串,将其转换为JavaScript对象,从而方便你在前端进行数据处理和呈现。下面将介绍三种常用的解析JSON字符串的方法: 1. 手动解析 手动解析JSON是最基本的方法。步骤如下: 使用JSON.parse()将JSON字符串转换为JavaScript对象 访问JavaScript…

    JavaScript 2023年5月27日
    00
  • JavaScript中array.reduce()数组方法的四种使用实例

    当我们使用JavaScript处理数组时,reduce()是一个非常有用的方法。reduce()方法允许我们通过迭代数组中的每个元素,并将它们组合成单个值来加工整个数组。下面详细来讲解如何使用reduce()方法,其中包括四种使用实例,每种用法都有一条示例。 1. 计算数组中所有元素的总和 const numbers = [1, 2, 3, 4, 5]; c…

    JavaScript 2023年5月27日
    00
  • jQuery的DOM操作之删除节点示例

    下面是jQuery的DOM操作之删除节点示例的完整攻略。 一、为什么需要删除节点 Web页面通常需要根据真实情景来动态地添加或删除元素,以此来实现一些交互效果或动态展示数据,而jQuery框架中封装了大量的DOM操作方法,使得我们可以更加轻松地完成与页面元素有关的各种操作。 在页面制作中,有时候要动态的删除网页中的某些元素节点,例如通过ajax技术从服务器获…

    JavaScript 2023年6月10日
    00
  • JS实现鼠标框选效果完整实例

    下面是详细的“JS实现鼠标框选效果完整实例”的完整攻略,包含两条示例说明。 概述 鼠标框选效果是一种常见的 Web 应用程序 UI 设计。具体来说,通过 JavaScript 实现鼠标框选效果,可以让用户在多个元素中选择他们想要的元素。 实现鼠标框选效果的核心在于:鼠标按下之后从鼠标按下位置到鼠标移动位置之间的所有元素会被高亮标记,鼠标释放后,所有被标记的元…

    JavaScript 2023年5月28日
    00
  • JSON中key动态设置及JSON.parse和JSON.stringify()的区别

    JSON中key动态设置指的是在JavaScript中向JSON对象动态添加属性名(key),这样的JSON对象在另一个需要使用这些属性的函数或者方法中外部作用域仍然可以进行访问。但在正常情况下,我们无法使用字符串拼接的方式来动态设置JSON中的key,这时候就需要借助ES6中的计算属性名(Computed Property Names)来实现。 计算属性名…

    JavaScript 2023年5月27日
    00
  • 深入理解JavaScript中Ajax

    “深入理解JavaScript中Ajax”的完整攻略如下: 理解Ajax Ajax(Asynchronous JavaScript and XML)即异步JavaScript和XML,可以实现异步服务器调用。它能在不重新加载整个页面的情况下更新页面的部分内容,从而提高网页的交互体验。 Ajax的核心用到了XMLHttpRequest对象,它可以使用XMLHt…

    JavaScript 2023年5月18日
    00
  • javascript标准库(js的标准内置对象)总结

    下面是详细的攻略: JavaScript标准库 JavaScript标准库是一组常见的JavaScript内置对象和方法,这些对象和方法可用于在网页或应用程序中执行各种任务。下面是一些常见的JavaScript标准库: 1. String String对象是JavaScript中表示字符串的内置对象。String对象有很多有用的方法,例如indexOf(),…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部