使用Canvas绘制一个小型太阳系

260 阅读1分钟

1. 介绍

使用Canvas绘制一个地球绕太阳转,月球绕地球转的简单太阳系。

2. 运行效果

chrome-capture-2023-1-11.gif

3. 代码思路

  1. 将太阳和地球轨道作为背景绘制,一直保持不变。
  2. 首先确定地球的位置并将画布基点移动到地球坐标上。移动画布基点的代码:ctx.translate(Math.cos(angle)*250,Math.sin(angle)*250)其中angle表示每次地球旋转的角度。
  3. 然后绘制月球轨道和月球位置。月球每次移动角度是地球的两倍。
  4. 最后通过setInterval()函数不断循环执行下去。

4. 完整源码

代码内有详解

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>太阳系</title>
		    <style>
        *{margin:0;padding:0;}
        body{background-color: #000;overflow: hidden;}
        canvas{
            display:block;
            margin: -180px auto;
        }
    </style>
	</head>
	<body>
		<canvas id="canvas" width='1000' height='1000'></canvas>
 
		<script>
		   	var c=document.getElementById("canvas");
		   	var ctx=c.getContext("2d");
                        //绘制背景
		   	function drawBackground(){
                            ctx.strokeStyle = "#fff";
                            //地球轨道
                            ctx.beginPath();
                            ctx.arc(500,500,250,0,2*Math.PI,false);
                            ctx.stroke();
                            //太阳
                            ctx.beginPath();
                            ctx.arc(500,500,50,0,2*Math.PI,false);
                            ctx.fillStyle="yellow";
                            ctx.fill();
                            ctx.stroke();
                            ctx.closePath();
                        }
		   	//初始状态
		   	//太阳坐标(500,500),太阳半径50
		   	//地球轨道中心坐标(500,500),地球轨道半径250
		   	//地球半径20,地球坐标(750,500)
		   	//月球轨道中心坐标(750,500),月球轨道半径100
		   	//月球半径10,月球坐标(650,500)
		   	var cycle=365,time=0;
		   	function drawAll(){
		   		ctx.clearRect(0,0,c.width,c.height );
		   		drawBackground();
		   		var angle=time*(360/cycle)*Math.PI/180;    //Math.PI/180表示1度
		   		
		   		ctx.save();
		   		ctx.translate(500,500);
		   		ctx.rotate(angle);
 
		   		//改变画布基点为地球坐标
		   		ctx.translate(Math.cos(angle)*250,Math.sin(angle)*250);
		   		ctx.rotate(-2*angle);	//2倍于地球公转角度,便于看出月球的公转。可根据自己需要另作修改。
		   		//画地球
		   		ctx.beginPath();
		   		ctx.arc(0,0,20,0,2*Math.PI,false);
		   		ctx.fillStyle="blue";
		   		ctx.fill();
		   		ctx.stroke();
		   		ctx.closePath();
		   		//画月球轨道,以地球为圆心
		   		ctx.beginPath();
		   		ctx.arc(0,0,100,0,2*Math.PI,false);
		   		ctx.stroke();
		   		ctx.closePath();
		   		//画月球
		   		ctx.beginPath();
		   		ctx.arc(-100,0,10,0,2*Math.PI,false);
		   		ctx.fillStyle="#F6F6F6";
		   		ctx.fill();
		   		ctx.stroke();
		   		ctx.closePath();
 
		   		ctx.restore();
		   		time++;    //角度会随时间增加
		   		
		   	}
		   	setInterval(drawAll,30);    //添加定时器,每30ms执行一次
		</script>
		
	</body>
</html>