一,匀速运动
匀速运动,又称为匀速直线运动,是指物体在一条直线上运动,并且物体在任何时间间隔内通过的位移都是相等的。
从上面可知,匀速运动需要具备2个条件,及速度大小相同和速度方向一致
匀速运动是一种加速度为0的运动,匀速运动只有一种,那就是匀速直线运动。
至于匀速圆周运动,巨阙来说应该是匀速圆周运动或者军角度运动,应为他的加速度不为0(加速度,意思是速度不断的变动,递增或者递减)
在匀速运动中,速度是有正反方向的,正数为正方向,负数为负方向。
再次强调,CANVAS采用的是W3C坐标,Y轴正反方向是向下的
图1:
语法:
obj.x+=vx;
obj.y+=vy;
obj.x表示X轴的坐标
obj.y表示Y轴的坐标
vx表示x轴方向的速度大小,
vy表示V轴方向的速度大小
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<canvas id="canvas" width="800" height="800"></canvas>
<script src="../assit/arrow.js"></script>
<script src="../assit/tools.js"></script>
<script src="../assit/ball.js"></script>
<script>
function $$(id) {
return document.getElementById(id);
}
window.onload = function() {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
//实例化一个小球,中心坐标为10,25 半径颜色都去默认值
var ball = new Ball(10, 30);
var centerX = cnv.width / 2;
var centerY = cnv.height / 2;
var VX=1;//速度
ball.y = centerX;
(function frame() {
window.requestAnimationFrame(frame);
cxt.clearRect(0, 0, cnv.width, cnv.height);
ball.x += VX;
ball.fill(cxt);
//角度递增
})();
}
</script>
</body>
</html>
问:对于非X轴或者非Y轴的运动怎么处理?
对于非X轴方向或者非Y轴方向的运动,都是采用“分解速度的方法”来实现。速度分解的方法特别简单,只要使用三角函数就可以了
二,速度的合成和分解
假设我们要求小球沿着任意方向进行匀速运动,而不是X,Y轴,这时候就需要考虑综合X轴和Y轴的合力了。
图2:
语法:
vx=speed*Math.cos(angle*Math.PI/180);
vy=speed*Math.sin(angle*Math.PI/180);
obj.x+=vx;
obj.y+=vy;
obj.x表示物体X方向的坐标
obj.y表示物品Y方向的坐标
vx表示X轴方向的速度大小
vy表示Y轴方向的速度大小
speed表示初始速度的大小
angle表示该速度的方向和X轴正方向的夹角
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<canvas id="canvas" width="800" height="800"></canvas>
<script src="../assit/arrow.js"></script>
<script src="../assit/tools.js"></script>
<script src="../assit/ball.js"></script>
<script>
function $$(id) {
return document.getElementById(id);
}
window.onload = function() {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
//实例化一个小球,中心坐标为10,25 半径颜色都去默认值
var ball = new Ball(10, 30);
var centerX = cnv.width / 2;
var centerY = cnv.height / 2;
var speed=1;//速度
ball.y = centerX;
//速度与X轴方向角度为30度
var vx=speed*Math.cos(30*Math.PI/180);
var vy=speed*Math.sin(30*Math.PI/180);
(function frame() {
window.requestAnimationFrame(frame);
cxt.clearRect(0, 0, cnv.width, cnv.height);
ball.x += vx;
ball.y += vy;
ball.fill(cxt);
//角度递增
})();
}
</script>
</body>
</html>
配合atan2函数和三角函数速度分解来实现箭头跟随鼠标效果,关于atan2函数,详情请预览
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<canvas id="canvas" width="800" height="800"></canvas>
<script src="../assit/arrow.js"></script>
<script src="../assit/tools.js"></script>
<script src="../assit/ball.js"></script>
<script>
function $$(id) {
return document.getElementById(id);
}
window.onload = function() {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var arrow=new Arrow(cnv.width/2,cnv.height/2);
var mouse=tools.getMouse(cnv);
var speed=1.5;
var angle=0;
(function frame() {
window.requestAnimationFrame(frame);
cxt.clearRect(0, 0, cnv.width, cnv.height);
//计算出鼠标和箭头的夹角
var dx=mouse.x-cnv.width/2;
var dy=mouse.y-cnv.height/2;
angle=Math.atan2(dy,dx);
var vx=Math.cos(angle)*speed;
var vy=Math.sin(angle)*speed;
arrow.x+=vx;
arrow.y+=vy;
arrow.angle=angle;
arrow.fill(cxt);
})();
}
</script>
</body>
</html>