可视化之粒子连线效果

经常在一些网页上看到这样效果,移动的粒子,动态的连线,跟随鼠标。

下面我们可以通过p5.js来实现这个效果。并实现鼠标与粒子之间的交互效果。

在代码中每个粒子都具有随机的位置、大小、速度和颜色,并可以与其他粒子之间进行连接。

js 复制代码
// 定义粒子类
class Particle {
    constructor() {
        // 随机生成粒子的位置和大小
        this.x = random(0, width);
        this.y = random(0, height);
        this.r = random(1, 8);
        // 随机生成粒子的速度
        this.xSpeed = random(-2, 2);
        this.ySpeed = random(-1, 1.5);
    }

    // 画粒子
    createParticle() {
        noStroke();
        fill('rgba(200,169,169,0.5)');
        circle(this.x, this.y, this.r);
    }

    // 移动粒子
    moveParticle() {
        // 判断粒子是否碰到了边界,如果是,则反弹
        if (this.x < 0 || this.x > width)
            this.xSpeed *= -1;
        if (this.y < 0 || this.y > height)
            this.ySpeed *= -1;
        this.x += this.xSpeed;
        this.y += this.ySpeed;
    }

    // 连接粒子
    joinParticles(particles) {
        particles.forEach((element,i) => {
            let dis = dist(this.x, this.y, element.x, element.y);
            // 如果是第一个粒子,则连接距离为 140 像素,线条颜色为鼠标的位置和宽度
            if(this.id == 0){
                if (dis < 140) {
                    stroke(mouseX,width,100);
                    line(this.x, this.y, element.x, element.y);
                }
            }else{
                // 如果不是第一个粒子,则连接距离为 70 像素,线条颜色为白色
                if (dis < 70) {
                    stroke('rgba(255,255,255,0.1)');
                    line(this.x, this.y, element.x, element.y);
                }
            }
        });
    }
}

// 创建粒子数组
let particles = [];

function setup() {
    // 创建画布
    createCanvas(windowWidth, 300);
    // 设置颜色模式
    colorMode(HSB, width, height, 100);
    // 随机生成粒子并添加到数组中
    for (let i = 0; i < width / 5; i++) {
        particles.push(new Particle());
    }
    // 将第一个粒子的速度设置为 0,大小设置为 10,id 设置为 0
    particles[0].xSpeed = 0;
    particles[0].ySpeed = 0;
    particles[0].r = 10
    particles[0].id = 0;
}

function draw() {
    // 绘制背景
    background('#0f0f0f');
    // 遍历所有的粒子
    for (let i = 0; i < particles.length; i++) {
        // 画粒子
        particles[i].createParticle();
        // 移动粒子
        particles[i].moveParticle();
        // 连接粒子
        particles[i].joinParticles(particles.slice(i));
    }
    // 将第一个粒子的位置设置为鼠标位置
    particles[0].x = mouseX;
    particles[0].y = mouseY;
}

这个代码主要分为两个部分,一个是粒子类 Particle,一个是 setup()draw() 函数。

Particle 类中,我们定义了三个方法:

  1. constructor() 方法:在创建粒子对象时,随机生成粒子的位置、大小和速度。

  2. createParticle() 方法:用于画出粒子,使用 circle() 函数画出圆形粒子。

  3. joinParticles() 方法:用于连接粒子,遍历所有的粒子对象,计算每个粒子之间的距离,如果距离小于设定的连接距离,则使用 line() 函数画出粒子之间的连线。

setup() 函数中,我们完成了以下工作:

  1. 创建画布。

  2. 设置颜色模式。

  3. 随机生成粒子并添加到粒子数组中。

  4. 将第一个粒子的速度设置为 0,大小设置为 10,id 设置为 0。

draw() 函数中,我们完成了以下工作:

  1. 绘制背景。

  2. 遍历所有的粒子,依次画出每个粒子,移动每个粒子,并连接每个粒子。

  3. 将第一个粒子的位置设置为鼠标位置,实现了鼠标与粒子之间的交互效果。

在这个粒子系统中,我们主要使用了以下技术:

  1. 面向对象编程:我们使用 ES6 中的类来创建 Particle 类,将粒子的属性和方法封装在一个类中,使粒子对象更加可维护和可扩展。

  2. Canvas 绘图:我们使用 p5.js 库提供的 createCanvas() 函数来创建画布,并使用 circle()line() 函数来画圆和线条。

  3. 随机数生成:我们使用 p5.js 库提供的 random() 函数来生成随机的粒子位置、大小、速度和颜色。

  4. 鼠标交互:我们使用 mouseXmouseY 变量来获取鼠标的位置,并将第一个粒子的位置设置为鼠标位置,实现了鼠标与粒子之间的交互效果。

扩展:

  1. 可以通过增加粒子之间的连接距离和粒子之间的连线宽度,来改变粒子系统的外观和行为。

  2. 可以使用更复杂的算法来计算粒子之间的连接关系,例如使用 k-means 或者 DBSCAN 等算法来聚类粒子,然后在同一类中的粒子之间进行连接。

  3. 可以使用更多的交互效果来增强用户体验,例如在鼠标移动时,让粒子系统产生更复杂的运动轨迹,或者使用鼠标点击事件来切换不同的粒子系统。

相关推荐
然我22 分钟前
不用 Redux 也能全局状态管理?看我用 useReducer+Context 搞个 Todo 应用
前端·javascript·react.js
前端小巷子27 分钟前
Web 实时通信:从短轮询到 WebSocket
前端·javascript·面试
神仙别闹30 分钟前
基于C#+SQL Server实现(Web)学生选课管理系统
前端·数据库·c#
web前端神器37 分钟前
指定阿里镜像原理
前端
枷锁—sha42 分钟前
【DVWA系列】——CSRF——Medium详细教程
android·服务器·前端·web安全·网络安全·csrf
枷锁—sha43 分钟前
跨站请求伪造漏洞(CSRF)详解
运维·服务器·前端·web安全·网络安全·csrf
群联云防护小杜1 小时前
深度隐匿源IP:高防+群联AI云防护防绕过实战
运维·服务器·前端·网络·人工智能·网络协议·tcp/ip
汉得数字平台1 小时前
【鲲苍提效】全面洞察用户体验,助力打造高性能前端应用
前端·前端监控
花海如潮淹1 小时前
前端性能追踪工具:用户体验的毫秒战争
前端·笔记·ux
_丿丨丨_6 小时前
XSS(跨站脚本攻击)
前端·网络·xss