《canvas》之第14章 物理动画

本文介绍了如何使用HTML5 Canvas结合三角函数创建各种物理动画,如烟花、雨滴、圆周运动、波形运动、匀速运动、加速运动以及考虑重力和摩擦力的效果。通过Math.atan2()计算角度,利用Math.sin()和Math.cos()实现物体的平移、旋转和缩放,模拟真实世界的物理现象。示例代码展示了小球、箭头等元素的运动轨迹和动态效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第14章 物理动画

14.1 物理动画简介

烟花效果、雨滴效果、球体碰撞等动画。
模拟现实世界,物体遵循牛顿运动定律。
动画,清楚、重绘过程。

  • clearRect()清除整个canvas。
  • requestAnimationFrame()重绘。

14.2 三角函数简介

14.2.1 什么是三角函数

sin、cos、tan。

Math.sin(θ*Math.PI/180)
Math.cos(θ*Math.PI/180)
Math.tan(θ*Math.PI/180)
Math.asin(x/R)*(180/Math.PI)
Math.acos(y/R)*(180/Math.PI)
Math.atan(x/y)*(180/Math.PI)

Math.atan()与Math.atan2()

  • Math.atan(),-PI/2~PI/2
  • Math.atan2(),-PI~PI
Math.atan2(y, x)
  • atan2(y, x)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script type="text/javascript">
        window.onload = function () {
            var txt = document.getElementById("txt");
            txt.innerHTML = "Math.atan2(1,2)对应角度为:" + Math.atan2(1, 2) * 180 / Math.PI + "<br/>" + "Math.atan2(-1,-2)对应角度为:" + Math.atan2(-1, -2) * 180 / Math.PI;
        }
    </script>
</head>
<body>
    <p id="txt"></p>
</body>
</html>
  • arrow.js
function Arrow(x, y, color, angle) {
    //箭头中心x坐标,默认值为0
    this.x = x || 0;
    //箭头中心y坐标,默认值为0
    this.y = y || 0;
    //颜色,默认值为“#FF0099”
    this.color = color || "#FF0099";
    //旋转角度,默认值为0
    this.angle = angle || 0;
}

Arrow.prototype = {
    stroke: function (cxt) {
        cxt.beginPath();
        cxt.moveTo(-20, -10);
        cxt.lineTo(0, -10);
        cxt.lineTo(0, -20);
        cxt.lineTo(20, 0);
        cxt.lineTo(0, 20);
        cxt.lineTo(0, 10);
        cxt.lineTo(-20, 10);
        cxt.closePath();
        cxt.save();
        cxt.translate(this.x, this.y);
        cxt.rotate(this.angle);
        cxt.strokeStyle = this.color;
        cxt.stroke();
        cxt.restore();
    },
    fill: function (cxt) {
        cxt.save();
        cxt.translate(this.x, this.y);
        cxt.rotate(this.angle);
        cxt.fillStyle = this.color;
        cxt.beginPath();
        cxt.moveTo(-20, -10);
        cxt.lineTo(0, -10);
        cxt.lineTo(0, -20);
        cxt.lineTo(20, 0);
        cxt.lineTo(0, 20);
        cxt.lineTo(0, 10);
        cxt.lineTo(-20, 10);
        cxt.closePath();
        cxt.fill();
        cxt.restore();
    }
};
  • 随鼠标移动箭头
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/arrow.js"></script>
    <script type="text/javascript">
        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);

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame, cnv);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                var dx = mouse.x - cnv.width / 2;
                var dy = mouse.y - cnv.height / 2;
                //使用Math.atan2()方法计算出鼠标与箭头中心的夹角
                arrow.angle = Math.atan2(dy, dx);

                arrow.fill(cxt);
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.3 三角函数应用

14.3.1 两点间距离

dx = x2 - x1;
dy = y2 - y1;
distance = Math.sqrt(dx*dx+dy*dy);
  • 获取两点间距离
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");
            var text = document.getElementById("p1");

            var x = cnv.width / 2;
            var y = cnv.height / 2;

            var mouse = tools.getMouse(cnv);
            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                cxt.save();
				
                cxt.beginPath();
                cxt.moveTo(x, y);
                //mouse.x表示鼠标的X轴坐标,mouse.y表示鼠标的Y轴坐标
                cxt.lineTo(mouse.x, mouse.y);
                cxt.closePath();
                cxt.strokeStyle = "red";
                cxt.stroke();
				
                cxt.restore();

                var dx = mouse.x - x;
                var dy = mouse.y - y;
                var distance = Math.sqrt(dx * dx + dy * dy);
                text.innerText = "鼠标与中点距离为:" + distance;
            })();

        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
    <p id="p1"></p>
</body>
</html>

14.3.2 圆周运动

  1. 正圆运动
x = centerX + radius*Math.cos(angle*Math.PI/180);
y = centerY + radius*Math.sin(angle*Math.PI/180);
  • ball.js
function Ball(x, y, radius, color) {
    //小球中心的x坐标,默认值为0
    this.x = x || 0;
    //小球中心的y坐标,默认值为0
    this.y = y || 0;
    //小球半径,默认值为12
    this.radius = radius || 12;
    //小球颜色,默认值为“#6699FF”
    this.color = color || "#6699FF";
    //缩放倍数
    this.scaleX = 1;
    this.scaleY = 1;
}
Ball.prototype = {
    //绘制“描边”小球
    stroke: function (cxt) {
        cxt.save();
        cxt.translate(this.x, this.y);
        cxt.scale(this.scaleX, this.scaleY);
        cxt.strokeStyle = this.color;
        cxt.beginPath();
        cxt.arc(this.x, this.y, this.radius, 0, 360 * Math.PI / 180, false);
        cxt.closePath();
        cxt.stroke();
        cxt.restore();
    },
    //绘制“填充”小球
    fill: function (cxt) {
        cxt.save();
        cxt.translate(this.x, this.y);
        cxt.scale(this.scaleX, this.scaleY);
        cxt.fillStyle = this.color;
        cxt.beginPath();
        cxt.arc(0, 0, this.radius, 0, 360 * Math.PI / 180, false);
        cxt.closePath();
        cxt.fill();
        cxt.restore();
    }
}
  • 圆周运动的小球
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //实例化一个小球,中心坐标为(100,25),半径、颜色都取默认值
            var ball = new Ball(100, 25);
            var centerX = cnv.width / 2;
            var centerY = cnv.height / 2;
            var radius = 50;
            var angle = 0;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                //绘制圆形
                cxt.beginPath();
                cxt.arc(centerX, centerY, 50, 0, 360 * Math.PI / 180, false);
                cxt.closePath();
                cxt.stroke();

                //计算小球坐标
                ball.x = centerX + radius * Math.cos(angle);
                ball.y = centerY + radius * Math.sin(angle);
                ball.fill(cxt);

                //角度递增
                angle += 0.05;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
  1. 椭圆运动
x = centerX + radiusX*Math.cos(angle*Math.PI/180);
y = centerY + radiusY*Math.sin(angle*Math.PI/180);
  • 椭圆运动的小球
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball(100, 25);
            var centerX = cnv.width / 2;
            var centerY = cnv.height / 2;
            var radiusX = 60;
            var radiusY = 40;
            var angle = 0;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

				//绘制椭圆
				createEllipse(cxt, centerX, centerY, radiusX, radiusY)
				cxt.stroke();
				
                //计算小球坐标
                ball.x = centerX + radiusX * Math.cos(angle);
                ball.y = centerY + radiusY * Math.sin(angle);
                ball.fill(cxt);

                //角度递增
                angle += 0.05;
            })();
			
			function createEllipse(cxt, centerX, centerY, radiusX, radiusY) {
				var r = (radiusX > radiusY) ? radiusX : radiusY;
				var ratioX = radiusX / r;
				var ratioY = radiusY / r;
				cxt.save();
				cxt.translate(centerX, centerY);
				cxt.scale(ratioX, ratioY);
				cxt.beginPath();
				cxt.arc(0, 0, r, 0, 2 * Math.PI);
				cxt.closePath();
				cxt.restore();
			}
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.3.3 波形运动

  1. 作用于x轴坐标
    左右摇摆。
x = centerX + range*Math.sin(angle*Math.PI/180);
angle += speed;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball(cnv.width / 2, cnv.height / 2);
            var angle = 0;
            var range = 80;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x = cnv.width / 2 + Math.sin(angle) * range;
                ball.fill(cxt);

                //角度递增
                angle += 0.05;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
  1. 作用于y轴坐标
    上下摇摆。
y = centerY + range*Math.sin(angle*Math.PI/180);
angle += speed;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball(cnv.width/2, cnv.height/2);
            var angle = 0;
            var range = 40;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                //ball.x += 0.1;
                ball.y = cnv.height/2 + Math.sin(angle) * range;
                ball.fill(cxt);

                //角度递增
                angle += 0.05;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
  1. 作用于缩放属性
    物体不断放大然后缩小,呈现脉冲动画效果。
scaleX = 1 + range*Math.sin(angle*Math.PI/180);
scaleY = 1 + range*Math.sin(angle*Math.PI/180);
angle += speed;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball(cnv.width/2, cnv.height/2, 25);
            var range = 0.5;
            var angle = 0;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.scaleX = 1 + range * Math.sin(angle);
                ball.scaleY = 1 + range * Math.sin(angle);
                ball.fill(cxt);

                //角度递增
                angle += 0.05;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.4 匀速运动

14.4.1 匀速运动简介

匀速直线运动。

object.x += vx;
object.y += vy;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //实例化一个小球
            var ball = new Ball(0, cnv.height/2);
            //定义X轴速度为2,也就是每帧向正方向移动2px
            var vx = 0.2;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;

                ball.fill(cxt);
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.4.2 速度的合成和分解

vx = speed*Math.cos(angle*Math.PI/180);
vy = speed*Math.sin(angle*Math.PI/180);
object.x += vx;
object.y += vy;
  • 匀速运动小球
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //实例化一个小球,球心坐标、半径以及颜色都采用默认值
            var ball = new Ball();
            var speed = 0.2;
            //速度方向与X轴正方向角度为30°
            var vx = speed * Math.cos(30 * Math.PI / 180);
            var vy = speed * Math.sin(30 * Math.PI / 180);

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.y += vy;

                ball.fill(cxt);
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
  • 随鼠标匀速运动的箭头
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/arrow.js"></script>
    <script type="text/javascript">
        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 = 0.5;

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame, cnv);
                cxt.clearRect(0, 0, cnv.width, cnv.height);
                //计算箭头中心指向鼠标的矢量的方向
                var dx = mouse.x - arrow.x;
                var dy = mouse.y - arrow.y;
				if(dx !=0 || dy != 0) {
					var angle = Math.atan2(dy, dx);
					arrow.angle = angle;
					
					var vx = speed * Math.cos(angle);
					var vy = speed * Math.sin(angle);
					arrow.x += vx;
					arrow.y += vy;
					
					if(dx*(mouse.x - arrow.x) < 0) {//水平移动距离超过箭头中心与鼠标的水平距离
						arrow.x = mouse.x;
					}
					if(dy*(mouse.y - arrow.y) < 0) {
						arrow.y = mouse.y;
					}
				}
                arrow.fill(cxt);
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="800" height="600" style="border:1px solid silver;"></canvas>
</body>
</html>

14.5 加速运动

14.5.1 加速运动简介

vx += ax;
vy += ay;
object.x += vx;
object.y += vy;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //实例化一个小球
            var ball = new Ball(0, cnv.height / 2);
            //初始化X轴速度以及加速度
            var vx = 8;
            var ax = -0.2;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.fill(cxt);

                vx += ax;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.5.2 加速度的合成和分解

ax = a*Math.cos(angle*Math.PI/180);
ay = a*Math.sin(angle*Math.PI/180);
vx += ax;
vy += ay;
object.x += vx;
object.y += vy;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            var ball = new Ball();
            var a = -0.5;
            //计算出X轴和Y轴2个方向的加速度
            var ax = a * Math.cos(30 * Math.PI / 180);
            var ay = a * Math.sin(30 * Math.PI / 180);
            var vx = 8;
            var vy = 8;

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.y += vy;
                ball.fill(cxt);

                vx += ax;
                vy += ay;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.6 重力

14.6.1 重力简介

vy += gravity;
object.y += vy;
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/utils.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //初始化数据
            var ball = new Ball(0, cnv.height);
            var vx = 4;
            var vy = -5;
            var gravity = 0.2;

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.y += vy;
                ball.fill(cxt);

                //变量递增
                vy += gravity;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.6.2 重力应用

  • 上下反弹
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //初始化数据
            var ball = new Ball(cnv.width / 2, 0);
            //Y轴初始速度为0,重力加速度为0.2,反弹系数为-0.8
            var vy = 0;
            var gravity = 0.2;
            var bounce = -0.8;

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.y += vy;
                //边界检测
                if (ball.y > cnv.height - ball.radius) {
                    ball.y = cnv.height - ball.radius;
                    //速度反向并且减小
                    vy = vy * bounce;
                }
                ball.fill(cxt);

                vy += gravity;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
  • 移动反弹
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //初始化数据
            var ball = new Ball(0, cnv.height);
            var vx = 3;
            var vy = -6;
            var gravity = 0.2;
            var bounce = -0.75;

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.y += vy;

                //边界检测
                if ((ball.y + ball.radius) > cnv.height) {
                    ball.y = cnv.height - ball.radius;
                    vy = vy * bounce;
                }
                ball.fill(cxt);

                //变量递增
                vy += gravity;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="300" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>

14.7 摩擦力

vx *= friction;
vy *= friction;
object.x += vx;
object.y += vy;
  • x轴或y轴方向运动
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //初始化数据
            var ball = new Ball(0, cnv.height / 2);
            //初始化X轴方向速度为2,摩擦系数为0.95
            var vx = 8;
            var friction = 0.95;

            (function frame() {
                window.requestAnimationFrame(frame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.fill(cxt);

                //变量改变
                vx *= friction;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
  • 任意方向运动
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="js/tools.js"></script>
    <script src="js/ball.js"></script>
    <script type="text/javascript">
        function $$(id) {
            return document.getElementById(id);
        }
        window.onload = function () {
            var cnv = $$("canvas");
            var cxt = cnv.getContext("2d");

            //初始化数据
            var ball = new Ball();
            var speed = 8;
            var vx = speed * Math.cos(30 * Math.PI / 180);
            var vy = speed * Math.sin(30 * Math.PI / 180);
            var friction = 0.95;

            (function drawFrame() {
                window.requestAnimationFrame(drawFrame);
                cxt.clearRect(0, 0, cnv.width, cnv.height);

                ball.x += vx;
                ball.y += vy;
                ball.fill(cxt);

                //变量改变
                vx *= friction;
                vy *= friction;
            })();
        }
    </script>
</head>
<body>
    <canvas id="canvas" width="200" height="150" style="border:1px solid silver;"></canvas>
</body>
</html>
在园区网建设过程中,我们常常面临诸多实际挑战,例如网络设计、IP规划、成本控制以及项目管理等。而名为“园区网的真实案例.zip”的压缩包文件提供了大量实用资源,包括真实园区网案例、综合实验拓扑图、相关脚本和项目需求分析等,这些资料对于理解和实践园区网建设具有重要意义。我们重点关注其中的“园区网综合实验”部分。 园区网是在学校、企业或政府机构等相对封闭区域内构建的网络,旨在为区域内用户提供高效、安全的数据通信服务。综合实验则是为了模拟真实环境,帮助学习者掌握园区网设计的关键技术和步骤,通常涵盖网络设备选择与配置、VLAN划分、路由协议应用、QoS策略设定以及安全防护措施等内容。压缩包中的“最终”文件可能包含了项目实施的最终成果,如经过验证的网络设计方案、配置脚本或项目总结报告,这些资料有助于我们将理论知识转化为实际可执行的方案。 “命令”文件则可能包含了用于配置网络设备的CLI指令,涉及交换机和路由器的基本配置,如VLAN设置、端口安全、静态路由或动态路由协议(如OSPF、RIP等)。通过研究这些命令,我们可以学习如何根据不同场景正确配置网络设备,以满足业务需求。 IP规划是园区网建设中的关键任务,合理的IP规划能够避免地址冲突,便于管理和维护。案例中可能会展示如何根据园区规模、功能区划分及未来扩展需求制定合适的IP地址策略。成本控制同样重要,园区网建设不仅涉及设备购置费用,还包括安装、运维、升级等长期成本。案例可能探讨如何在满足功能需求的同时,选择性价比高的设备,优化布线方案,并通过节能技术降低运营成本。 项目总结则是对整个实施过程的回顾,涵盖遇到的问题、解决方案、经验教训及改进点,对提升项目管理能力和问题解决技巧非常有帮助。这个压缩包的内容全面覆盖了园区网设计、建设和管理的多个方面,是学习和实践网络技术的宝贵资源。通过深入研究这些材料,我们可以提升网络规划和实施能力,更好
内容概要:本文档《Grafana运维指南:从入门到精通》详细介绍了Grafana这一开源度量分析和可视化工具的各个方面。首先解释了Grafana在数据监控和分析中的重要性,强调其开源、可视化、多数据源支持、告警功能、灵活的仪表盘管理和丰富的插件生态系统等特点。接着,文档逐步讲解了Grafana的安装与配置,包括系统准备、初始配置和数据源配置等步骤。随后,深入探讨了数据源管理、仪表盘操作、插件使用等核心功能,提供了详细的配置和使用指南。最后,文档介绍了性能优化、安全管理、日志分析等日常运维要点,并通过一个实际案例展示了Grafana在大型电商平台运维中的应用价值。 适用人群:适用于运维人员、系统管理员、开发人员以及任何需要进行数据监控和分析的专业人士,尤其是那些对Grafana有一定了解或有兴趣深入了解的人群。 使用场景及目标:①帮助用户掌握Grafana的安装配置和基本使用方法;②指导用户如何整合多种数据源,创建和管理仪表盘;③提供性能优化、安全管理等方面的建议,确保Grafana在实际应用中的高效稳定运行;④通过实际案例分享,展示Grafana在复杂业务环境中的应用效果,提升用户对Grafana的理解和应用能力。 其他说明:本文档不仅涵盖了Grafana的基础知识和技术细节,还结合实际案例,帮助读者更好地理解和应用Grafana。建议读者在学习过程中结合实际操作,通过实践加深对Grafana的理解。此外,文档鼓励读者参与社区交流,分享经验和心得,共同进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值