canvas实现圆周运动 | 您所在的位置:网站首页 › 圆周运动原理 › canvas实现圆周运动 |
一、前言
本篇博客将会介绍在cnavas中实现圆周运动的2种方法,学习的前提是懂得基本的canvas绘画与动画实现。 canvas基本绘画教程:canvas入门基础系列 by TG_w3cschool https://www.w3cschool.cn/kqjhm/ canvas基本动画原理:canvas动画包教不包会 by TG_w3cschool https://www.w3cschool.cn/xjmuw/ 二、实现过程第一种方法(坐标):利用坐标和三角函数来实现圆周运动。 先编写基本canvas骨架: canvas实现圆周运动 *{ margin: 0; padding: 0; } #myCanvas{ border: 1px solid black;/*给画布一个边框*/ } let canvas; let cxt; window.onload = ()=>{ canvas = document.getElementById("myCanvas"); cxt = canvas.getContext("2d"); } 编写函数draw1: function draw1(){ cxt.translate(250,250);//原点移动到画布中央 cxt.beginPath();//开始绘画 cxt.arc(0,0,5,0,2*Math.PI,true);//画原点 cxt.fill();//填充 cxt.closePath();//结束绘画 }得到图像如下: 这样调用函数后便可实现一个圆绕原点进行圆周运动: 跟之前一样,画个原点: 圆周运动是实现了,但我们会发现一个问题,外边的圆在做圆周运动的时候,会像时钟的秒针一样,每秒移动一个较大的角度,导致圆周的动画看起来一顿一顿的。 这样便实现了平滑的圆周运动。 坐标实现: canvas实现圆周运动 *{ margin: 0; padding: 0; } #myCanvas{ border: 1px solid black;/*给画布一个边框*/ } let canvas; let cxt; window.onload = ()=>{ canvas = document.getElementById("myCanvas"); cxt = canvas.getContext("2d"); draw1(); } let t = 0; let radius = 100;//设置圆周半径 let x, y; function draw1(){ cxt.clearRect(0,0,500,500);//清空画布 cxt.save();//保存之前的状态 cxt.translate(250,250);//原点移动到画布中央 cxt.beginPath();//开始绘画 cxt.arc(0,0,5,0,2*Math.PI,true);//画原点 cxt.fill();//填充 cxt.closePath();//结束绘画 t += 0.05;//t自增(不怡过大) x = 0 + Math.cos(t) * radius;//确定坐标(此处圆心即是原点) y = 0 + Math.sin(t) * radius;//确定坐标(此处圆心即是原点) cxt.beginPath(); cxt.arc(x,y,20,0,2*Math.PI,true);//绘画做圆周运动的圆 cxt.fill();//填充 cxt.closePath(); cxt.restore();//回到未改变坐标的状态 requestAnimationFrame(draw1);//根据浏览器刷新频率回调函数本身 }角度实现: canvas实现圆周运动 *{ margin: 0; padding: 0; } #myCanvas{ border: 1px solid black;/*给画布一个边框*/ } let canvas; let cxt; window.onload = ()=>{ canvas = document.getElementById("myCanvas"); cxt = canvas.getContext("2d"); draw2(); } let angle; function draw2(){ cxt.clearRect(0,0,500,500);//清空画布 cxt.save();//保存之前的状态 cxt.translate(250,250);//原点移动到画布中央 cxt.beginPath();//开始绘画 cxt.arc(0,0,5,0,2*Math.PI,true);//画原点 cxt.fill();//填充 cxt.closePath();//结束绘画 cxt.beginPath(); let time = new Date(); angle = 2 * Math.PI / 60 * time.getSeconds() + 2 * Math.PI / 60000 * time.getMilliseconds();//设置角度 cxt.rotate(angle);//根据时间改变角度 cxt.arc(100,0,20,0,2*Math.PI,true);//绘画做圆周运动的圆 cxt.fill();//填充 cxt.closePath(); cxt.restore();//回到未改变坐标的状态 requestAnimationFrame(draw2);//根据浏览器刷新频率回调函数本身 }有不足之处,请各位提醒一下! |
CopyRight 2018-2019 实验室设备网 版权所有 |