随笔

本文介绍了一个使用HTML5 Canvas实现的动态粒子连线效果。通过创建多个随机分布的小圆点,并随着时间不断更新它们的位置,同时根据距离远近动态绘制连接线。文章详细展示了如何设置画布、绘制圆形和线条的方法。
<canvas id="canvas"></canvas>
<script>
    var WIDTH = 400,
        HEIGHT = 400,
        POINT = 40,
        canvas = document.getElementById('canvas'),
        ctx = canvas.getContext('2d');
    var circleArr = [];
    canvas.width = WIDTH;
    canvas.height = HEIGHT;
    
    ctx.strokeStyle = 'rgba(0,0,0,1)';
    ctx.strokeWidth = 1;
    ctx.fillStyle = 'rgba(0,0,180,0.2)';
    function Line (x, y, _x, _y, o) {
        this.x = x;
        this.y = y;
        this._x = _x;
        this._y = _y;
        this.o = o;
    }
    function Circle(x, y, r, mx, my) {
        this.x = x;
        this.y = y;
        this.r = r;
        this.mx = mx;
        this.my = my;
    }
    var Num = (max, min) => {
        min |= 0;
        return Math.floor(Math.random()*(max - min + 1) + min);
    }
    var drawLine = (x, y, _x, _y, o) => {
        var line = new Line(x, y, _x, _y, o);
        ctx.beginPath();
        ctx.strokeStyle = `rgba(0, 0, 0, ${line.o})`;
        ctx.moveTo(line.x, line.y);
        ctx.lineTo(line._x, line._y);
        ctx.closePath();
        ctx.stroke();
    }
    var drawCircle = (x, y, r, mx, my) => {
        var circle = new Circle(x, y, r, mx, my);
        ctx.beginPath();
        ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI*2);
        ctx.closePath();
        ctx.fill();
        return circle;
    }
    var init = () => {
        circleArr = [];
        for (var i = 0; i < POINT; i++) {
            circleArr.push(drawCircle(Num(WIDTH), Num(HEIGHT), Num(10, 1), Num(10, -10)/30, Num(10, -10)/40));
        }
        draw()
    }
    var draw = () => {
        ctx.clearRect(0, 0, WIDTH, HEIGHT);
        for (var i = 0; i < POINT; i++) {
            drawCircle(circleArr[i].x, circleArr[i].y, circleArr[i].r);
        }
        for (var i = 0; i < POINT; i++) {
            for (var j = 0; j < POINT; j++) {
                if (i + j < POINT) {
                    var A = Math.abs(circleArr[i+j].x - circleArr[i].x),
                        B = Math.abs(circleArr[i+j].y - circleArr[i].y);
                    var lineLength = Math.sqrt(A*A + B*B);

                    var C = 1/lineLength*7-0.009;
                    var lineOpacity = C > 0.03 ? 0.2 : C;
                    if (lineOpacity > 0) {
                        drawLine(circleArr[i].x, circleArr[i].y, circleArr[i+j].x, circleArr[i+j].y, lineOpacity);
                    }
                }
            }
        }
    }

    init();
    setInterval(function () {
        for (var i = 0; i < POINT; i++) {
            var cir = circleArr[i];
            cir.x += cir.mx;
            cir.y += cir.my;
            if (cir.x > WIDTH)  cir.mx = -cir.mx;
            else if (cir.x < 0) cir.mx = -cir.mx;
            if (cir.y > HEIGHT) cir.my = -cir.my;
            else if (cir.y < 0) cir.my = -cir.my;
        }
        draw();
    }, 100);
</script>

转载于:https://www.cnblogs.com/luozhangshuai/p/7685466.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值