zoukankan      html  css  js  c++  java
  • 【canvas草稿】(待完善)

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
        </head>
        <style>
            #canvas{
                background: #000;
            }
        </style>
        <body>
    
            <canvas id="canvas" width="1920" height="1080"></canvas>
    
            <script src="jquery/jquery.js"></script>
            <script>
                var canvas = document.getElementById("canvas");
                var canvasWidth = canvas.width;
                var canvasHeight = canvas.height;
                var context = canvas.getContext("2d");
                var flowers = [];
                var flowersLength = 50;
                var speed = 0;
                /**
                 * 单击canvas生成随机大小、颜色、透明度的花
                 */
                function drawCurve() {
                    drawFlowers();
                    canvas.addEventListener("mousemove", function(event){
                        // drawHexagon(event);
                        $("#canvas").queue(function(next){
                            var r = parseInt(Math.random() * 50 + 50);
                            var angle = Math.random() * Math.PI * 2;
                            var speed = Math.random() * 0.04 + 0.01;
                            var dropSpeed = Math.random() * 4 + 1;
                            var flower = new Flower(event.offsetX, event.offsetY, r, angle, speed, dropSpeed);
    
                            // flower.draw(context);
                            flowers.push(flower);
                            if(flowers.length >= flowersLength) {
                                flowers.shift();
                            }
                            $(this).dequeue();
                        });
                    }, false);
                }
                /**
                 * 根据六边形生成花瓣
                 * 以六边形的每个点作为三阶贝塞尔曲线的控制点的基础点
                 * @param {Number} x [六边形中点x坐标]
                 * @param {Number} y [六边形中点y坐标]
                 * @param {Number} r [六边形边长]
                 */
                function Flower(x, y , r, angle, speed, dropSpeed) {
                    this.x = x;
                    this.y = y;
                    this.r = r;
                    this.angle = angle;
                    this.speed = speed;
                    this.dropSpeed = dropSpeed;
                    this.point = [
                        [
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 0), y: r * Math.cos(this.angle + Math.PI / 3 * 0), offsetX: (Math.random() + 1) * 0.5, offsetY: 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 1), y: r * Math.cos(this.angle + Math.PI / 3 * 1), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 2), y: r * Math.cos(this.angle + Math.PI / 3 * 2), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 3), y: r * Math.cos(this.angle + Math.PI / 3 * 3), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 4), y: r * Math.cos(this.angle + Math.PI / 3 * 4), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 5), y: r * Math.cos(this.angle + Math.PI / 3 * 5), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5}
                        ],
                        [
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 0), y: r * Math.cos(this.angle + Math.PI / 3 * 0), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 1), y: r * Math.cos(this.angle + Math.PI / 3 * 1), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 2), y: r * Math.cos(this.angle + Math.PI / 3 * 2), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 3), y: r * Math.cos(this.angle + Math.PI / 3 * 3), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 4), y: r * Math.cos(this.angle + Math.PI / 3 * 4), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 5), y: r * Math.cos(this.angle + Math.PI / 3 * 5), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5}
                        ],
                        [
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 0), y: r * Math.cos(this.angle + Math.PI / 3 * 0), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 1), y: r * Math.cos(this.angle + Math.PI / 3 * 1), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 2), y: r * Math.cos(this.angle + Math.PI / 3 * 2), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 3), y: r * Math.cos(this.angle + Math.PI / 3 * 3), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 4), y: r * Math.cos(this.angle + Math.PI / 3 * 4), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5},
                            {x: r * Math.sin(this.angle + Math.PI / 3 * 5), y: r * Math.cos(this.angle + Math.PI / 3 * 5), offsetX: (Math.random() + 1) * 0.5, offsetY: (Math.random() + 1) * 0.5}
                        ]
                    ]
                }
                /**
                 * 绘制一朵花的六瓣花瓣
                 * @param  {Object} ctx [canvas上下文]
                 */
                Flower.prototype.draw = function(ctx) {
                    var x = this.x;
                    var y = this.y;
                    var R = this.r;
                    var points = this.point;
                    for(var j = 0; j < 3; j++) {
                        for(var i = 0; i < 6; i++) {
                            points[j][i].x = R * Math.sin(this.angle + Math.PI / 3 * i);
                            points[j][i].y = R * Math.cos(this.angle + Math.PI / 3 * i);
                            if(i == 5){
                                drawFlower(x, y, R, points[j][i], points[j][0], ctx);
                            } else {
                                drawFlower(x, y, R, points[j][i], points[j][i+1], ctx);
                            }
                        }
                    }
                }
                /**
                 * canvas中绘制花
                 * @param  {Number} x      [鼠标单击点的x坐标]
                 * @param  {Number} y      [鼠标单击点的y坐标]
                 * @param  {JSONObject} pointA [贝塞尔曲线控制点A]
                 * @param  {JSONObject} pointB [贝塞尔曲线控制点B]
                 * @param  {Object} ctx    [canvas上下文]
                 */
                function drawFlower(x, y, R, pointA, pointB, ctx){
                    if(!pointA.color){
                        var r = parseInt(Math.random() * 255);
                        var g = parseInt(Math.random() * 255);
                        var b = parseInt(Math.random() * 255);
                        var a = Math.random() * 0.7 + 0.3;
                        var colorArr = [r,g,b,a];
                        var color = colorArr.join(",");
                        pointA.color = color;
                    }
                    ctx.save();
                    ctx.translate(x, y);
                    ctx.beginPath();
                    ctx.moveTo(0, 0);
                    ctx.bezierCurveTo(pointA.x * pointA.offsetX, pointA.y * pointA.offsetY, pointB.x * pointB.offsetX, pointB.y * pointB.offsetY, 0, 0);
                    ctx.strokeStyle = "rgba(" + pointA.color + ")";
                    ctx.stroke();
                    ctx.restore();
                }
                /**
                 * 绘制六边形
                 */
                function drawHexagon(event) {
                    var x = event.offsetX;
                    var y = event.offsetY;
                    var r = 60 || parseInt(Math.random() * 25 + 5);
                    var angle = 0;
                    var tempR = Math.cos(Math.PI / 6) * r;
                    var a = r * Math.sin(angle);
                    var b = r * Math.cos(angle);
                    context.save();
                    context.translate(x, y);
                    context.beginPath();
    
                    context.moveTo(r * Math.sin(angle), r * Math.cos(angle));
                    context.lineTo(r * Math.sin(angle + Math.PI/3*1), r * Math.cos(angle + Math.PI/3*1));
                    context.lineTo(r * Math.sin(angle + Math.PI/3*2), r * Math.cos(angle + Math.PI/3*2));
                    context.lineTo(r * Math.sin(angle + Math.PI/3*3), r * Math.cos(angle + Math.PI/3*3));
                    context.lineTo(r * Math.sin(angle + Math.PI/3*4), r * Math.cos(angle + Math.PI/3*4));
                    context.lineTo(r * Math.sin(angle + Math.PI/3*5), r * Math.cos(angle + Math.PI/3*5));
                    context.lineTo(r * Math.sin(angle), r * Math.cos(angle));
    
                    context.strokeStyle = "red";
                    context.stroke();
                    context.closePath();
    
    
                    /*context.beginPath();
                    context.arc(0, 0, r, 0, Math.PI * 2, false);
                    context.strokeStyle = "darkgreen";
                    context.stroke();
                    context.closePath();*/
    
                    context.restore();
                }
    
                function drawFlowers() {
                    context.clearRect(0, 0, canvasWidth, canvasHeight);
                    if(flowers && flowers.length) {
                        for(var i = 0; i < flowers.length; i++) {
                            flowers[i].draw(context);
                            flowers[i].angle += flowers[i].speed;
                            flowers[i].y += flowers[i].dropSpeed;
                        }
                    }
                    
                    window.requestAnimationFrame(drawFlowers);
                }
                window.onload = drawCurve;
            </script>
        </body>
    </html>
    View Code
  • 相关阅读:
    登录界面
    动手动脑
    关于二进制
    Java考试
    D
    威尔逊定理 k!%p
    11.46.2020质检
    最长上升序列输出方案
    问题 G: 汽车的最终位置
    奶牛大会(二分)
  • 原文地址:https://www.cnblogs.com/surprise7/p/5498414.html
Copyright © 2011-2022 走看看