【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

 

转载于:https://www.cnblogs.com/surprise7/p/5498414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值