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

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日

相关文章

  • JS获取当前时间戳与时间戳转日期时间格式问题

    获取当前时间戳是JavaScript中一项基本操作,而将时间戳转化为日期时间格式也是开发过程中常用功能。本文将详细讲述这两个问题的解决方案。 获取当前时间戳 在JavaScript中获取当前的时间戳,我们可以使用Date对象的getTime()方法获取,该方法会返回从标准时间1970年1月1日 00:00:00 UTC到当前时间的毫秒数。 const tim…

    JavaScript 2023年5月27日
    00
  • js实现一个简单的数字时钟效果

    下面是JS实现一个简单的数字时钟效果的攻略: HTML结构 首先需要在HTML中创建一个div,用来展现时钟。 <div id="clock"></div> CSS样式 然后还需要写一些CSS样式,让时钟展示的更加美观。 #clock { font-size: 48px; /*设置字号*/ font-family:…

    JavaScript 2023年5月27日
    00
  • 7个JS基础知识总结

    7个JS基础知识总结 JavaScript 是前端开发中最重要的语言之一,掌握基础知识对于成为一名优秀的前端开发工程师至关重要。下面总结了 7 个关键的 JS 基础知识点,帮助你深入了解这门语言。 1. 数据类型和变量 JS 中,变量可以存储不同类型的数据,包括字符串、数字、布尔值、数组、对象等等。其中,字符串需要使用单引号或双引号进行包裹,数字可以是整数或…

    JavaScript 2023年5月18日
    00
  • 一文详解如何使用node执行js文件

    一文详解如何使用node执行js文件 在本篇文章中,我们将会详细介绍如何使用 Node.js 来运行 JavaScript 代码。 Node.js 是什么 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可以让 JavaScript 代码在服务器端运行。它提供了丰富的内置库和模块,可以轻松地构建高性能、可伸缩的网络应用…

    JavaScript 2023年5月28日
    00
  • 使用JavaScript检测Firefox浏览器是否启用了Firebug的代码

    要使用JavaScript检测Firefox浏览器是否启用了Firebug,可以通过以下步骤进行操作: 使用navigator.userAgent属性获取当前浏览器的信息。 var isFirefox = navigator.userAgent.indexOf("Firefox") > -1; 判断当前浏览器是否为Firefox浏览…

    JavaScript 2023年6月10日
    00
  • JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】

    我们来详细讲解一下JS表单验证方法实例小结。 验证电话号码 function validatePhone(phone) { // 正则表达式验证手机号码,只允许输入数字,以 1 开头,总长度为 11 位 var reg = /^1\d{10}$/; return reg.test(phone); } 以上代码是一个验证电话号码的函数模板,其中使用了正则表达式…

    JavaScript 2023年6月10日
    00
  • Vue.js 2.0学习教程之从基础到组件详解

    首先,本文将介绍一份针对Vue.js 2.0的学习教程,包括从基础开始,逐步介绍Vue.js的概念和用法,最终深入到Vue.js组件的详细讲解。 一、Vue.js基础 1.1 Vue.js的基本概念和语法 在Vue.js中,最核心的概念是“响应式”,通过将对象代理到Vue实例上,使得当对象改变时,Vue实例能够监听到并动态更新相应的视图。另外,Vue.js还…

    JavaScript 2023年6月10日
    00
  • 一篇文章教你写出干净的JavaScript代码

    以下是“一篇文章教你写出干净的JavaScript代码”的完整攻略: 1. 注重代码风格的统一性 在写JavaScript代码时,我们要注重代码风格的统一性。一个好的规范在团队协作时非常重要,可以提高代码的可维护性和可读性,避免出现一些低级错误。我们可以采用一些代码风格规范化的工具,比如ESLint和Prettier等。 2. 避免全局变量的滥用 在Java…

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