可视化之粒子连线效果

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

下面我们可以通过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. 可以使用更多的交互效果来增强用户体验,例如在鼠标移动时,让粒子系统产生更复杂的运动轨迹,或者使用鼠标点击事件来切换不同的粒子系统。

相关推荐
百万蹄蹄向前冲41 分钟前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙44 分钟前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan2 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen2 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理3 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒4 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche15004 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情6734 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
SoonITer4 小时前
怎样构建一个 Agent-friendly 的网站
前端·agent
颜进强4 小时前
01 · NestJS 是什么:用途、解决什么问题、与热门框架对比
前端·后端·ai编程