美文网首页
贝塞尔曲线 蓝天白云

贝塞尔曲线 蓝天白云

作者: Ray_afab | 来源:发表于2020-07-19 13:12 被阅读0次
    WX20200719-131041@2x.png

    有点繁杂 必须发个文章记录下

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>XP壁纸</title>
        <style>
            #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
        </style>
    </head>
    <body>
    <div id="canvas-warp">
        <canvas id="canvas">
            你的浏览器居然不支持Canvas?!赶快换一个吧!!
        </canvas>
    </div>
    
    <script>
        window.onload = function(){
            var canvas = document.getElementById("canvas");
            canvas.width = 800;
            canvas.height = 600;
            var context = canvas.getContext("2d");
            context.fillStyle = "#FFF";
            context.fillRect(0,0,800,600);
    
            drawPrairie(context);
            drawSky(context);
            for(var i=0; i <5; i++){
                var x0 = 500 * Math.random() + 50;
                var y0 = 200 * Math.random() + 50;
                var c0 = 100 * Math.random() + 50;
                drawCloud(context, x0, y0, c0);
    
            }
    
        };
    
        function drawSky(cxt){
            cxt.save();
            cxt.beginPath();
            cxt.moveTo(0, 420);
            cxt.bezierCurveTo(250, 300, 350, 550, 800, 390);
            cxt.lineTo(800,0);
            cxt.lineTo(0,0);
            cxt.closePath();
    
            var lineStyle = cxt.createRadialGradient(400, 0, 50, 400, 0, 200);
            lineStyle.addColorStop(0, "#42A9AA");
            lineStyle.addColorStop(1, "#2491AA");
    
            cxt.fillStyle = lineStyle;
    
            cxt.fill();
    
            cxt.restore();
        }
    
        function drawPrairie(cxt){
            cxt.save();
            cxt.beginPath();
            cxt.moveTo(0, 400);
            cxt.bezierCurveTo(250, 300, 350, 550, 800, 400);
            cxt.lineTo(800,600);
            cxt.lineTo(0,600);
            cxt.closePath();
            
            var lineStyle = cxt.createLinearGradient(0, 600, 600, 0);
            lineStyle.addColorStop(0, "#00AA58");
            lineStyle.addColorStop(0.3, "#63AA7B");
            lineStyle.addColorStop(1, "#04AA00");
            cxt.fillStyle = lineStyle;
            cxt.fill();
            cxt.restore();
        }
    
    
    
        /*渲染单个云朵
         context:  canvas.getContext("2d")对象
         cx: 云朵X轴位置
         cy: 云朵Y轴位置
         cw: 云朵宽度
         */
        function drawCloud(cxt, cx, cy, cw) {
            //云朵移动范围即画布宽度
            var maxWidth = 800;
            //如果超过边界从头开始绘制
            cx = cx % maxWidth;
            //云朵高度为宽度的60%
            var ch = cw * 0.6;
            //开始绘制云朵
    
            cxt.beginPath();
            cxt.fillStyle = "white";
            //创建渐变
            var grd = cxt.createLinearGradient(0, 0, 0, cy);
            grd.addColorStop(0, 'rgba(255,255,255,0.8)');
            grd.addColorStop(1, 'rgba(255,255,255,0.5)');
            cxt.fillStyle = grd;
    
            //在不同位置创建5个圆拼接成云朵现状
            cxt.arc(cx, cy, cw * 0.19, 0, 60, false);
            cxt.arc(cx + cw * 0.08, cy - ch * 0.3, cw * 0.11, 0, 360, false);
            cxt.arc(cx + cw * 0.3, cy - ch * 0.25, cw * 0.25, 0, 60, false);
            cxt.arc(cx + cw * 0.6, cy, cw * 0.21, 0, 60, false);
            cxt.arc(cx + cw * 0.3, cy - ch * 0.1, cw * 0.28, 0, 60, false);
            cxt.closePath();
    
            cxt.fill();
        }
    </script>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:贝塞尔曲线 蓝天白云

          本文链接:https://www.haomeiwen.com/subject/rcilkktx.html