zoukankan      html  css  js  c++  java
  • Canvas 绘制星空

    效果图:

     知识点:

    1、ctx.save(); //保存ctx状态

         ctx.restore();//回到之前ctx的状态

    一般ctx.save()与ctx.restore()是成对出现的,比如我们在绘图的时候需要使用多种颜色,颜色需要不时的切换。那么使用save()restore()方法即可比较方便的实现此功能。调用了restore方法将设置回到前一个save状态。一旦我们调用 restore,状态堆中最后的状态会弹出,并恢复所有设置。

    2、ctx.translate(x,y);//移动

    3、ctx.rotate(rot/180*Math.PI);//旋转角度

    4、注意:ctx.scale 会对左顶点,边框线均放大。

    5、 transform() 允许您缩放、旋转、移动并倾斜当前的环境。

    a d 水平、垂直缩放

    b c 水平、垂直倾斜

    e f 水平、垂直位移

    6、渐变色

    var skyStyle=ctx.createLinearGradient(0,0,0,canvas.width); //(startx,starty,endx,endy);
    skyStyle.addColorStop(0.0,"black");//第一个参数为0-1之间的浮点数。表示颜色的位置
    skyStyle.addColorStop(0.8,"#035");
    ctx.fillStyle=skyStyle;

    代码:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <style>
                *{
                    padding: 0;
                    margin: 0;
                }
                #canvas{
                    display:block;
                    border:1px solid #ccc;
                    margin:20px auto;
                }
            </style>
        </head>
        <body>
            <canvas id="canvas">您的浏览器不支持</canvas>
        </body>
        <script>
            var canvas=document.getElementById("canvas");
            canvas.width=700;
            canvas.height=500;
            var ctx=canvas.getContext("2d");
            ctx.fillStyle="black";
            ctx.fillRect(0,0,canvas.width,canvas.height);
            //绘制星空
            for(var i=0;i<300;i++)
            {
                var r=Math.random()*5+1;//10-20
                var rot=Math.random()*360;
                var x=Math.random()*canvas.width;
                var y=Math.random()*canvas.height;
                drawStar(ctx,x,y,r,r/2,rot);
            }
            
            //绘制五角星函数
            function drawStar(ctx,x,y,outerR,innerR,rot){//rot旋转角度
                ctx.beginPath();
                for(var i=0;i<5;i++){
                    ctx.lineTo(Math.cos((18+i*72-rot)/180*Math.PI)*outerR+x,
                              -Math.sin((18+i*72-rot)/180*Math.PI)*outerR+y);
                    ctx.lineTo(Math.cos((54+i*72-rot)/180*Math.PI)*innerR+x,
                              -Math.sin((54+i*72-rot)/180*Math.PI)*innerR+y);
                }
                ctx.closePath();
                
                ctx.fillStyle="#fb3";
                ctx.strokeStyle="#fd5"
                ctx.lineWidth=3;
                ctx.lineJoin="round";
    
                ctx.fill();
                ctx.stroke();
            }
        </script>
    </html>

    更好的写法:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <style>
                *{
                    padding: 0;
                    margin: 0;
                }
                #canvas{
                    display:block;
                    border:1px solid #ccc;
                    margin:20px auto;
                }
            </style>
        </head>
        <body>
            <canvas id="canvas">您的浏览器不支持</canvas>
        </body>
        <script>
            var canvas=document.getElementById("canvas");
            canvas.width=700;
            canvas.height=500;
            var ctx=canvas.getContext("2d");
            ctx.fillStyle="black";
            ctx.fillRect(0,0,canvas.width,canvas.height);
            //绘制星空
            for(var i=0;i<300;i++)
            {
                var r=Math.random()*5+1;//10-20
                var rot=Math.random()*360;
                var x=Math.random()*canvas.width;
                var y=Math.random()*canvas.height;
                drawStar(ctx,x,y,r,rot);
            }
            //对状态进行设置
            function drawStar(ctx,x,y,r,rot)
            {
                ctx.save(); //保存ctx状态
                ctx.translate(x,y);//移动
                ctx.rotate(rot/180*Math.PI);//旋转角度
                starPath(ctx,r);
                
                ctx.fillStyle="#fb3";
                ctx.strokeStyle="#fd5"
                ctx.lineWidth=3;
                ctx.lineJoin="round";
                ctx.fill();
                ctx.stroke();
                
                ctx.restore();//回到之前ctx的状态
            }
            //封装五角星函数
            function starPath(ctx,r){
                ctx.beginPath();
                for(var i=0;i<5;i++){
                    ctx.lineTo(Math.cos((18+i*72)/180*Math.PI)*r,
                              -Math.sin((18+i*72)/180*Math.PI)*r);
                    ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*(r/2),
                              -Math.sin((54+i*72)/180*Math.PI)*(r/2));
                }
                ctx.closePath();
            }
        </script>
    </html>
  • 相关阅读:
    Python 调用multiprocessing模块下面的Process类方法(实现服务器、客户端并发)-TCP协议
    Python开启进程的2中方式
    基于UDP的交互的实例
    Python socket粘包问题(最终解决办法)
    Python socket粘包问题(初级解决办法)
    Python socket套字节
    OSI七层模型
    异常处理
    Python封装与隐藏
    螺旋队列问题
  • 原文地址:https://www.cnblogs.com/liangtao999/p/11906998.html
Copyright © 2011-2022 走看看