HTML5 canvas繪製太陽系各行星(包括月球的公轉)

HTML5 canvas繪製太陽系

  看了好多canvas繪製太陽系行星,他們都忽略了月亮,雖然月亮不是行星,但是繪圖少了月亮也就沒有挑戰性了,今天我就計算了一下月亮的軌跡,然後按照公轉的比例畫了上去,首先看一下效果:
這裏寫圖片描述
  接下來是項目的說明書和標準:
這裏寫圖片描述
根據以上的效果和要求,我們寫出的代碼爲:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>sun</title>
        <style type="text/css">
            #canvas{display: block;background-color:#000;margin:0 auto;}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="1000" height="1000"></canvas>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("canvas");
        var cxt = canvas.getContext('2d');
        var time = 0;
        var EarchRotate = 0;
        var MoonX = 0;
        var MoonY = 0;
        //行星軌道
        function starRoute(){
            for(var i=0; i<=8; i++){
                cxt.save();
                cxt.translate(500,500);
                cxt.strokeStyle = '#fff';
                cxt.beginPath();
                cxt.arc(0,0,i*55,0,2*Math.PI,false);
                cxt.closePath();
                cxt.stroke();
                cxt.restore();
            }
        }
        //創建Start類型(其實在js中是對象)
        function Star(name,x,y,r,startColor,endColor,revolution){
            this.name = name;          //星球名稱
            this.x = x;                //圓心  x,y
            this.y = y;
            this.r = r;                //半徑  r
            this.startColor = startColor;        //漸變 start,end
            this.endColor = endColor;
            this.revolution = revolution;//公轉週期 revolution
        }
        Star.prototype = {
            constructor : Star,
            drawStar : function(){
                cxt.save();
                cxt.translate(500,500);
                //繪製漸變顏色
                var gradient = cxt.createRadialGradient(this.x,this.y,0,this.x,this.y,this.r);
                gradient.addColorStop(0,this.startColor);
                gradient.addColorStop(1,this.endColor);
                cxt.fillStyle = gradient;
                cxt.beginPath();
                if(this.name == '地球'){
                    //存儲轉動的角度,找到moon的旋轉座標
                    EarchRotate = time*360/this.revolution*Math.PI/180;
                    MoonX = 165*Math.sin(EarchRotate);
                    MoonY = -165*Math.cos(EarchRotate);
                    cxt.rotate(time*360/this.revolution*Math.PI/180);
                    cxt.arc(this.x,this.y,this.r,0,2*Math.PI,false);
                    cxt.fill();
                }else if(this.name == '月球'){
                    cxt.save();
                    cxt.translate(MoonX,MoonY); //重置原點,即設置月球旋轉中心
                    //月球旋轉軌跡
                    cxt.beginPath();
                    cxt.strokeStyle = 'rgba(207,207,207,0.2)';
                    cxt.arc(0,0,30,0,2*Math.PI,false);
                    cxt.stroke();
                    cxt.closePath();
                    //月球圓心座標
                    var x = 30*Math.cos((time*360/this.revolution-90)*Math.PI/180);
                    var y = 30*Math.sin((time*360/this.revolution-90)*Math.PI/180);
                    cxt.rotate(time*360/this.revolution*Math.PI/180);
                    //月球的漸變顏色
                    var gradientM = cxt.createRadialGradient(x,y,0,x,y,this.r);
                    gradientM.addColorStop(0,this.startColor);
                    gradientM.addColorStop(1,this.endColor);
                    cxt.fillStyle = gradientM;
                    //繪製月球
                    cxt.beginPath();
                    cxt.arc(x,y,this.r,0,2*Math.PI,false);
                    cxt.closePath();
                    cxt.fill();
                    cxt.restore();
                }else{
                    cxt.rotate(time*360/this.revolution*Math.PI/180);
                    cxt.arc(this.x,this.y,this.r,0,2*Math.PI,false);
                    cxt.fill();
                }
                cxt.closePath();
                cxt.restore();
                //加上字體
                cxt.save();
                cxt.translate(500,500);
                cxt.fillStyle = '#fff';
                cxt.font = "bold " + 0.9*this.r + "px Arial";
                cxt.textAlign = "center";
                cxt.textBaseline = "middle";
                // cxt.rotate(time*360/this.revolution*Math.PI/180)
                if(this.name=='太陽'){
                    cxt.fillText(this.name,this.x,this.y);
                }else if(this.name=='月球'){
                    cxt.fillText('',this.x,this.y); //月球太小,字體不顯示
                }else{
                    cxt.fillText(this.name,this.x+50,this.y);
                }
                cxt.restore();
            }
        }
        function moveStar(){
            cxt.clearRect(0,0,1000,1000);   //首先清除畫布
            starRoute();
            var Sun = new Star('太陽',0,0,25,'#ffff00','#ff9900',0);
            var Mercury = new Star('水星',0,-55,8,'#a69697','#5c3e40',87.70);   //水星
            var Venus = new Star('金星',0,-110,13,'#c4bbac','#1f1315',224.701);  //金星
            var Earth = new Star('地球',0,-165,18,'#78b1e8','#050c12',365.2422); //地球
            var Moon = new Star('月球',0,-195,6,'#a69697','#5c3e40',27.32); //月球
            var Mars = new Star('火星',0,-220,10,'#cec9b6','#76422d',686.98); //火星
            var Jupier = new Star('木星',0,-275,25,'#c0a48e','#322222',4332.589); //木星
            var Saturn = new Star('土星',0,-330,23,'#f7f9e3','#5c4533',10759.5); //土星
            var Uranus = new Star('天王星',0,-385,20,'#a7e1e5','#19243a',30799.095); //天王星
            var Neptune = new Star('海王星',0,-440,20,'#0661b2','#1e3b73',60152); //海王星
            Sun.drawStar();
            Mercury.drawStar();
            Venus.drawStar();
            Earth.drawStar();
            Moon.drawStar();
            Mars.drawStar();
            Jupier.drawStar();
            Saturn.drawStar();
            Uranus.drawStar();
            Neptune.drawStar();
            time++;
        }
        setInterval(moveStar,100)
    </script>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章