vite:初学 p5.js demo 画圆圈

p5.js 是一个 JavaScript 的函数库,它在制作之初就和 Processing 有同样的目标。 就是让艺术家,设计师,教育工作者和编程初学者能够很容易,很轻松地学习和使用程序设计。实际上就是对 canvas 等代码的封装,简化了在 Web 中绘图的代码。

为了方便,我将使用 vite 搭建一个原生 js 项目。

1.创建项目

npm create vite@latest p5-demo

选:Vanilla

选:JavaScript

2.初始化项目

cd p5-demo

cnpm install

3.安装 p5.js

cnpm install p5 --save

cd p5-demo
4.编写 p5_circle.js如下

javascript 复制代码
import p5 from 'p5'

let count = 0;
let isDrawing = true; // 新增变量,用于控制是否继续绘制

const sketch = (s) => {
  s.setup = function() {
    s.createCanvas(400, 400); // 创建画布,传入画布尺寸
    s.background(120); // 设置画布背景色
  }

  s.draw = function() {
    if (isDrawing) {
      let x = Math.sin(count) *100 + 200;
      let y = Math.cos(count) *100 + 200;
      s.circle(x, y, 50); // 创建圆形
      count += 0.1;
    }
  }

  s.mousePressed = function() {
    if (isDrawing) {
      isDrawing = false; // 鼠标点击时,停止绘制
    } else {
      isDrawing = true;
    }
  }
}

new p5(sketch);

5.编辑 index.html 如下

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Test circle</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="p5_circle.js"></script>
  </body>
</html>

6.运行 cmd

npm run dev

html 复制代码
  VITE v6.2.0  ready in 424 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h + enter to show help
o

访问 http://localhost:5173

参考:p5.js 使用npm安装p5.js后如何使用?


向 豆包 提问:编写 p5.js 脚本,捕捉鼠标移动轨迹,每隔0.1秒不断画圆圈。填入圆圈内的颜色是随机数。

cd p5-demo

copy .\node_modules\p5\lib\p5.min.js .

编写 random_circle.html 如下

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mouse Trajectory Circles</title>
    <script src="p5.min.js"></script>
</head>

<body>
    <script>
        let lastTime = 0;
        const interval = 100; // 0.1 秒 = 100 毫秒

        function setup() {
            createCanvas(windowWidth, windowHeight);
            background(255);
        }

        function draw() {
            const currentTime = millis();
            if (currentTime - lastTime > interval) {
                const r = random(255);
                const g = random(255);
                const b = random(255);
                fill(r, g, b, 127);
                noStroke();
                circle(mouseX, mouseY, 30);
                lastTime = currentTime;
            }
        }
    </script>
</body>
</html>

双击打开 random_circle.html

在这个代码里,每次满足时间间隔条件要绘制圆圈时,会使用 `random(255)` 函数分别生成 0 到 255 之间的随机数作为 RGB 颜色通道的值,然后用 `fill(r, g, b, 127)` 来设置填充颜色,其中 `127` 是设置的透明度。


交互式光晕效果

  • 描述: 创建一个光晕效果,用户可以通过鼠标控制光晕的位置和大小,光晕会随着鼠标移动而动态变化。

  • 编写 p5_ellipse.html 如下

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>p5 ellipse Example</title>
   <script src="p5.min.js"></script>
</head>
<body>
<script>
  function setup() {
    createCanvas(windowWidth, windowHeight);
    noStroke();
  }
  
  function draw() {
    background(0);
    let glowSize = map(mouseX, 0, width, 50, 200);
    let glowColor = color(255, 255, 255, 100);
  
    for (let i = 0; i < 5; i++) {
      fill(glowColor);
      ellipse(mouseX, mouseY, glowSize - i*20, glowSize - i*20);
    }
  }
</script>
</body>
</html>

双击打开 p5_ellipse.html


交互式粒子系统

  • 描述: 创建一个粒子系统,用户可以通过鼠标或触摸屏与粒子互动。粒子可以跟随鼠标移动,或在鼠标附近产生排斥或吸引效果。

  • 编写 p5_particles.html 如下

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>p5 particles Example</title>
   <script src="p5.min.js"></script>
</head>
<body>
<script>
  let particles = [];
  
  function setup() {
    createCanvas(windowWidth, windowHeight);
    for (let i = 0; i < 100; i++) {
      particles.push(new Particle());
    }
  }
  
  function draw() {
    background(0);
    for (let particle of particles) {
      particle.update();
      particle.show();
      particle.edges();
      particle.interact(mouseX, mouseY);
    }
  }
  
  class Particle {
    constructor() {
      this.pos = createVector(random(width), random(height));
      this.vel = createVector(random(-1, 1), random(-1, 1));
      this.acc = createVector(0, 0);
      this.size = random(5, 10);
    }
  
    update() {
      this.vel.add(this.acc);
      this.pos.add(this.vel);
      this.acc.mult(0);
    }
  
    show() {
      noStroke();
      fill(255);
      ellipse(this.pos.x, this.pos.y, this.size);
    }
  
    edges() {
      if (this.pos.x > width) this.pos.x = 0;
      if (this.pos.x < 0) this.pos.x = width;
      if (this.pos.y > height) this.pos.y = 0;
      if (this.pos.y < 0) this.pos.y = height;
    }
  
    interact(x, y) {
      let mouse = createVector(x, y);
      let dir = p5.Vector.sub(mouse, this.pos);
      let distance = dir.mag();
      if (distance < 100) {
        dir.setMag(-1);
        this.acc.add(dir);
      }
    }
  }
</script>
</body>
</html>

双击打开 p5_particles.html

相关推荐
Fantasywt3 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
IT、木易3 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
Mr.NickJJ4 小时前
JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
开发语言·javascript·react.js
念九_ysl5 小时前
深入解析Vue3单文件组件:原理、场景与实战
前端·javascript·vue.js
Jenna的海糖5 小时前
vue3如何配置环境和打包
前端·javascript·vue.js
Mr.NickJJ6 小时前
React Native v0.78 更新
javascript·react native·react.js
烛阴6 小时前
JavaScript 构造器进阶:掌握 “new” 的底层原理,写出更优雅的代码!
前端·javascript
Alan-Xia6 小时前
使用jest测试用例之入门篇
前端·javascript·学习·测试用例
鱼樱前端6 小时前
📚 Vue Router 4 核心知识点(Vue3技术栈)面试指南
前端·javascript·vue.js
JobsandCzj7 小时前
PDF 分割工具
javascript·小程序·pdf