zoukankan      html  css  js  c++  java
  • 使用canvas绘制一片星空

     效果图

     五角星计算方式

    代码

    <body style="margin:0px;padding:0px;100%;height:100%;overflow:hidden;">
        <canvas id="canvas" style="border: 1px solid #aaa" width="1920" height="962">
            你的浏览器不支持canvas,请更换浏览器再试!
        </canvas>
        <script>
            var c=document.getElementById("canvas");
            c.width=document.body.clientWidth;
            c.height=document.body.clientHeight;
    
            window.onload=function(){
                if(c.getContext("2d")){
                    var cxt= c.getContext("2d");
                }else{
                    document.write("你的浏览器不支持canvas,请更换浏览器再试!");
                }
                //星空背景颜色
                var linearCrad=cxt.createLinearGradient(0,0,0, c.height* 0.68);
                linearCrad.addColorStop(0.0, '#7ac4e1');
                linearCrad.addColorStop(0.2, '#5eb8dd');
                linearCrad.addColorStop(1.0, '#b6e2e5');
                cxt.fillStyle=linearCrad;
                cxt.fillRect(0,0, c.width, c.height);
                //循环绘制100颗星星
                for(var i=0 ; i<100 ; i++){
                    var r=Math.random() * 6 + 2;//半径
                    var x=Math.random() * c.width * 0.98 ; // x偏移量
                    var y=Math.random() * c.height * 0.6; //y偏移量
                    var a=Math.random() * 360; //旋转角度
                    drawStart(cxt , r/2.0 , r , x , y , a);
                }
                //月亮
                fillMoon(cxt ,2, c.width * 0.88 , c.height * 0.24 ,100 ,20 , "#fff");
                //绿地
                drawLand(cxt);
            }
            /*
            * cxt:绘图环境
            * r:小圆半径
            * R:大圆半径
            * x:x轴偏移量
            * y:y轴偏移量
            * rot:旋转角度(逆时针)*/
            function drawStart(cxt,r,R,x,y,rot){
                cxt.beginPath();
                cxt.fillStyle="#fff"
                cxt.strokeStyle="#88b9dd";
                for(var i=0 ; i < 5 ;i++){
                    cxt.lineTo( Math.cos((18+ i*72 - rot )/180 * Math.PI) * R + x//大圆
                            , -Math.sin((18 + i*72 - rot)/180 *Math.PI) * R + y);
                    cxt.lineTo( Math.cos((54+ i*72 - rot )/180 * Math.PI) * r + x//小圆
                            , -Math.sin((54 + i*72 - rot)/180 *Math.PI) * r + y);
                }
                cxt.closePath();
                cxt.fill();
                cxt.stroke();
            }
            /*
             *参数说明
             *R: 半径
             * rot:旋转角度
             *fillColor: 填充颜色
             * */
            function fillMoon(cxt ,d , x , y , R , rot , fillColor){
                cxt.save();
                cxt.translate(x , y);
                cxt.rotate(rot * Math.PI / 180);
                cxt.scale(R , R);
                pathMoon(cxt , d);
                cxt.fillStyle=fillColor || "#fb5";
                cxt.shadowColor = "rgba(58,88,124,0.5)";
                cxt.shadowOffsetX = 14 ;
                cxt.shadowOffsetY = 14;
                cxt.shadowBlur = 30;
                cxt.fill();
    
                cxt.restore();
            }
            /*
             d :坐标
             */
            function pathMoon(cxt , d){
                cxt.beginPath();
                /*
                 *圆心(0,0)
                 *半径:1
                 * */
                cxt.arc(0 , 0 , 1 , 0.5 * Math.PI , 1.5 * Math.PI , true);
                cxt.moveTo(0 , -1);
                cxt.arcTo(d , 0 , 0 , 1 , dis(0 , -1 , d , 0) / d);
                cxt.closePath();
            }
            function dis(x1 , y1 ,x2 , y2){
                return Math.sqrt( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) );
            }
    
            /*
            * 绿地
            * */
            function drawLand(cxt){
                cxt.save();
                cxt.beginPath();
                cxt.moveTo(0 , c.height * 0.7);
                /*cxt.bezierCurveTo(540 , 400 , 660 , 800 , 1200 , 600);*/
                cxt.bezierCurveTo(c.width * 0.4 , c.height * 0.5 , c.width * 0.5 , c.height * 0.9 , c.width  , c.height * 0.8);
                cxt.lineTo(c.width , c.height);
                cxt.lineTo(0 , c.height);
                cxt.closePath();
                //添加渐变
                var landStyle = cxt.createLinearGradient(0 , 800 , 0 ,0);
                landStyle.addColorStop(0.0 ,'#7dbf44');
                landStyle.addColorStop(0.2 ,'#b9d532');
                landStyle.addColorStop(1 ,'#79bd46');
                cxt.fillStyle=landStyle;
                cxt.fill();
                cxt.restore();
            }
         </script>
    </body>
  • 相关阅读:
    应用的可被点击与不可被点击
    去掉NavigationBar底部的黑线
    iOS 设计模式之工厂模式
    GCD的用法
    ARC以及MRC中setter方法
    alpha,hidden,opaque的一些认识
    self进行weak化
    iOS之获取当前时间日期并按固定格式显示
    iOS之AVPlayer的简单应用
    Xcode快捷键、小技巧与xib圆角设置
  • 原文地址:https://www.cnblogs.com/jyichen/p/5507962.html
Copyright © 2011-2022 走看看