用P5.js实现一个动态的绘画系统

2023-10-30

摘要

通过一段时间的学习,我发现码绘的可能性比我想象的要更大,我们可以用码绘实现很多手绘很难达到的效果,比如创作一幅会动的、能进行交互的画作。如何通过类似画笔的东西在屏幕上创作出时刻在改变的,并且我们可以进行实时修改的像动画一样的作品?这就是我想要通过这个绘画系统想要做到的事。

基本原理

为了实现上面的想法,再结合使用的编程语言,我决定将绘画的最小单位设置成一个个矩形,类似于电脑图像里像素的概念。当然也可以是圆形三角形,因为这些图形在p5.js中的绘制方法都差不多。确定了这一点,也就确定了这个我们的编程是面向一个个矩形对象来进行的,也就是面向对象的编程。所以,我们接下来要让我们的对象的信息完善一下,方便我们对它进行操作。最基本的就是这个矩形的位置与大小信息了。我将整块画布按照规定的矩形的尺寸均匀划分成若干矩形,这些矩形的中心坐标就是它们的坐标。所以首先要将所有的矩形创建出来,并保存它们的中心坐标与大小信息。

function initrects() {
  var i = 0,
    j = 0;
  for (var x = rectwidth / 2; x <= width; x += rectwidth) {
    i = floor(x / rectwidth);
    rects[i] = [];
    for (var y = rectheight / 2; y <= height; y += rectheight) {
      j = floor(y / rectheight);
      rects[i][j] = new myrect(x, y, rectwidth, rectheight);
    }
  }
  rectswidth = i + 1;
  rectsheight = j + 1;
}

这个函数中rectwidth与rectheight是矩形的宽度与高度,rects[]是用来存储每个矩阵的二维对象数组,rectswidth 与rectsheight 是这个数组的宽度与高度。因为矩形是基于其中心坐标开始绘制的,所以从(rectwidth / 2,rectheight / 2)处开始对画布进行矩形的划分,其中myrect()存放的就是每个矩形的信息,如下:

function myrect(x, y, rectwidth, rectheight) {
	//中心坐标
  this.x = x;
  this.y = y;
	//方块长宽
  this.rectwidth = rectwidth;
  this.rectheight = rectheight;
	//方块填充颜色
  this.r = random() * 255;
  this.g = random() * 255;
  this.b = random() * 255;
  //绘制方块
  this.drawrect = function() {
    fill(this.r, this.g, this.b);
    rect(this.x, this.y, this.rectwidth, this.rectheight);
  }
  }

这样就在画布上均匀的创建了若干个myrect()对象,并且我还赋予了它们显示自己的函数drawrect(),于是在每一帧,我们只需要逐个调用每一个矩形的显示函数就可以在画布上将它们绘制出来,就像这样:
在这里插入图片描述

接下来我们需要一个能实现画笔功能的东西,通过这个画笔,我们可以把每一个方块改成我们想要的颜色。我们也将它看成一个对象,通过对这个对象增加函数,我们就可以得到一支多功能的画笔!首先我们给它增加一个改变颜色的功能:

mybrush = new Brush();
function Brush() {
  this.Brushsize = 2;
  this.r = 0;
  this.g = 0;
  this.b = 0;
  this.minx=0;
  this.maxx=0;
  this.miny=0;
  this.maxy=0;
  //画线函数
  this.doBrushStroke = function() {
    this.minx = floor(max(mouseX - mybrush.Brushsize / 2, 0) / rectwidth);
    this.maxx = floor(min(mouseX + mybrush.Brushsize / 2, width) / rectwidth);
    this.miny = floor(max(mouseY - mybru
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用P5.js实现一个动态的绘画系统 的相关文章

  • 开始第一张“码绘”——使用P5.JS画出旋转的爱心

    用P5 JS画出旋转的爱心 首先我们来看看想实现的原图 对这张图片进行观察可以发现图中一共有16颗相同的爱心在旋转 我们拿出其中一个爱心进行分析 我们可以发现 这个爱心是由27个正方体构成 此处应该注意的是 是正方体 而不是正方形 应该用b
  • 用P5 JS绘制动态绚丽烟花——动态篇

    上一节我们探究了绘制静态图像手绘与码绘的差异 但是万事万物 变化万千 有很多东西仅仅用静态是无法描述的 正如恩格斯所言 整个自然界 从最小的东西到最大的东西 从沙粒到太阳 从原生生物到人 都处于永恒的产生和消灭中 处于不断的流动中 处于无休
  • 顺序表的静态和动态实现

    静态顺序表 所谓静态顺序表就是把空间的大小给定 结构体的定义 typedef struct SeqList DataType array MaxSize int size SeqList 基本操作的实现 void InitSeqList S
  • 如何将 React 与 p5.js 结合使用

    我真的很喜欢p5 js和react js 所以我想知道如何将这两个结合在一起 但我无法做到这一点 所以我需要你的帮助 我真的无法为您提供一些代码示例 因为我不知道如何开始 所以我想做的是 1 创建反应应用程序 2 使用p5 js渲染画布 我
  • p5.j​​s 中的碰撞处理

    我一直在使用 p5 js 并且已经弄清楚如何让对象来检测碰撞 但我对如何处理这些碰撞感到非常困惑 我尝试将玩家速度设置为 0 但随后玩家卡住了 我也尝试过将碰撞分开到每一侧 但这也不起作用 这是我的带有碰撞函数的玩家构造函数 class P
  • p5.j​​s createCanvas 未定义错误。未捕获的引用错误

    Problem 我正在尝试使用p5 js在我的简单应用程序中 并因此包含它 我尝试过的 如果我放置一个调试器并查看控制台 我确实会得到以下功能p5Color 例如 和其他 并且脚本会很好地加载到页面上 除了createCanvas不会自动完
  • 在 P5.js 中旋转网格内的对象

    我正在尝试使用合适的 OOP 方法来让对象在网格单元格内单独旋转 我当前的结果是围绕 0 0 参考点旋转所有对象 而不是每个对象在其自己的单元格内旋转 当然 需要的是一个正确的翻译函数 但是当我尝试在innerSquare函数中应用它时tr
  • 尝试使图像在点击时触发功能 - p5.js

    我正在做一个带有交互式画布的艺术课项目 我的目标是让小动物在被点击时发出声音并 移动 我尝试在不创建类的情况下执行此操作 因为由于某种原因我无法在类中使用图像 我正在尝试尽可能轻松地做到这一点 我所说的 移动 是指我试图让背景图像出现在它们
  • 如何将 p5js 与 Webpack 一起使用

    我想写一个基于的库p5js https github com processing p5 js 所以在我的 Javascript 项目中我有Webpack作为开发依赖项安装 我将其写在start js import p5 from p5 p
  • 如何在javascript中获取频率值?

    我是一名意大利学生 我正在使用 p5 的库来创建一个网络吉他调音器 我想知道是否有办法获取麦克风输入的频率 图书馆链接 https p5js org reference libraries p5 sound https p5js org r
  • p5.j​​s - 随机()、高度和宽度未定义?

    我正在尝试使用 p5 js 让球在画布上弹跳 但似乎width height and random 没有定义 这是我的全部代码 function setup createCanvas 640 480 background 240 var d
  • python 中的 p5-js map() 函数

    python中有没有像p5 js的map 这样的函数 python 中的 map 根本不一样 据我了解 在 python 中 它对序列中的所有可迭代应用相同的函数 但我需要一些可以完成 p5 js 中的 map 函数功能的东西 感谢您的帮助
  • 改变正方形相交区域的颜色

    这些天我正在做一个项目 我的目标是改变两个正方形相交区域的颜色 我已经编写了检测两个正方形相交的代码 但我不知道如何更改相交区域的颜色 请帮我解决这个问题 var sketch function p with p let squares l
  • Angular 和 p5.js - p5.loadSound 不是函数

    当我想在我的 Angular 项目中使用 p5 js 时遇到问题 我使用 Angular CLI 将 p5 js 包含在我的 angular cli json file scripts node modules p5 lib p5 min
  • 如何找到贝塞尔曲线的中点?

    我想制作一条 命名 贝塞尔曲线 我希望它是一个单词命名的 这样我就不必担心自动换行 我通过P5制作贝塞尔曲线bezier sx sy c1x c1y c2x c2y ex ey 函数 我希望在贝塞尔曲线的中间显示一个字符串 但我不知道如何找
  • 在 p5js 中将画布导出为 GIF/PNG

    I use 原子编辑器 我要实现20 秒 GIF用我的画布 saveFrames 有一个限制 我猜 即使我输入 它也可以将 png 文件保存为短 gif 3 5 秒 saveFrames aa png 15 22 我发现了 CCapture
  • 使用圆点填充圆,使用圆边缘的偏置

    这就是我想要实现的目标 到目前为止 我对我拥有的代码感到满意 这是从 Wolfram 和另一个数学来源借来的 但我不知道如何整合一些偏差计算 或者只是一种分配随机但有组织的内容的方法 有人能指出我正确的方向吗 这是我的代码 它将使用 P5
  • 在画布中的鼠标位置放大/缩小

    我正在尝试使用 p5 js 实现缩放功能 当前缩放级别以及 x 和 y 位置存储在controls view目的 默认位置或 0 0 位置位于左上角 问题是调整放大 缩小时的 x 和 y 位置值 以便无论视图的当前位置是什么 它都会停留在缩
  • 在 p5js 中渲染骨架 glb

    所以我有办法渲染模型将动画模型从 Three js 渲染到 p5 js https stackoverflow com questions 75715609 rendering an animated model from three js
  • 无法在 typeScript 和 Webpack 中使用 p5.js

    我有一个使用图书馆的项目p5 js https github com processing p5 js Details 我的 Webpack 配置是 const path require path module exports entry

随机推荐

  • 【沧海拾昧】C# .Net SplitContainer(分割器)控件的使用笔记

    C0202 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 将窗口绑定到SplitContainer中作为
  • Mybatis-plus常用方法

    Mybatis plus常用方法总结 便携查看 1 单表增删改查 class GgktDemoApplicationTests 注入mapper Autowired private UserMapper userMapper 1 查询 Te
  • JavaScript 实现全选、全不选和反选功能

    网页中使用到表单复选框时 如果有大量的数据需要选择 经常会用到全选或者反选功能 也可能会用到全不选功能 其实是全选的反选 下面使用原生的js来实现一下全选 全不选和反选功能 声明 文章转载链接出自 JavaScript 实现全选 全不选和反
  • 《Leaflet 基础知识点》- 绘制圆、线、矩形和多边形

    前言 注意绘制的都是矢量图层 所以在 Vector Layers 分类下 绘制 圆 官网API 示例 圆 半径 radius 的单位为米 var circle L circle 31 537628173828125 121 19018554
  • 给label绘制下划线

    UIlabel本身没有下划线的属性 使用绘制的方法 添加下滑下 并且赋给该label一个action作为响应方法 实现DIY超链接的效果 调用 import UnderLineLabel h UnderLineLabel label Und
  • naive 路由使用 loadingBar 进度条

    环境 devDependencies vitejs plugin vue 4 2 3 axios 1 4 0 less 4 1 3 less loader 11 1 3 naive ui 2 34 4 pinia 2 1 4 typescr
  • PostMan使用技巧:“status“: 415 解决方案

    前言 该错误的出现 主要原因是Postmanf操作不当所致 下面代码为调用方法入口 一 错误提示信息 二 处理方案 如下图所示 调整传参方式为Body gt raw gt JSON application json 尾言 错误不大 侮辱性极
  • usb:认识usb传输(一)

    文章目录 一 usb发展背景 1 usb特点 2 usb发展 1 更名 2 发展 3 传输速度 4 usb编 解码方式 反向不归零 NRZI 位填充 5 信号传输状态 5 帧 6 通讯过程划分 二 usb的四种传输 1 控制传输 2 中断传
  • UE4鼠标滚轮控制镜头缩放

    蓝图 因为其实实现起来比较简单 所以直接上蓝图 主要是用到了UE4的鼠标滚轮操作映射 每当滑动鼠标滚轮的时候就会传出一个数值 有正有负有0 然后将角色的相机摇臂组件拖进蓝图 获取其中的Target Arm Length变量加上一个数值再重新
  • postman实战:2.参数化csv和json

    在上节课讲解了使用postman做接口测试时 如何设置环境变量和全局变量关联参数 关联环境变量和全局变量中参数时 他们的作用范围再来回顾一下 下面来看一下postman里面关于参数化的应用 首先分析下应用场景 1 某一个接口我们对入参设计了
  • 十二、支持向量机

    def svmm 支持向量机 完善 用超平面对高纬空间中的样本进行分类 为了解决线性不可分问题 引入了核函数 常用核函数有线性核函数 多项式核函数 高斯核函数和sigmoid核函数 API sklearn svm SVC C 1 0 ker
  • 机器学习综述论文笔记:Machine Learning: A Review of Learning Types

    机器学习review Paper Machine Learning A Review of Learning Types 这是一篇关于机器学习的综述 里面简述了各种现有的机器学习技术 1 主要的方法 监督 无监督 强化 1 1 监督学习 数
  • Redis原理篇(二)网络模型

    一 用户空间和内核空间 应用需要通过Linux内核与硬件交互 内核本质也是应用 运行的时候也需要CPU资源 内存资源 用户应用也在消耗这些资源 为了避免用户应用导致冲突甚至内核崩溃 用户应用与内核是分离的 进程的寻址空间会划分为两部分 内核
  • 公司前端vue是用vscode开发工具写的,个人喜欢用idea,但是idea在保存代码的时候会自动去除代码行最后的空格,造成不该修改的地方修改了,影响代码提交

    取消这个功能 File Settings Editor General On Save Remave trailing
  • springBoot 观察者模式

    观察者设计模式 jie神说用订阅和发布来理解更好 我想了一下是的 为什么呢 因为监听器这个名词听起来是一个主动的 可实际监听器是一个被动的玩意 比如我们事件源发布一个事件 然后监听器订阅了这个事件就能做出动作 里面涉及到三个对象 事件源 事
  • 【2023】JAVA和PLC实现通讯读取写入数据,以三菱PLC举例

    1 创建maven工程引入依赖
  • --- Error: User Command terminated, Exit-Code = 1解决办法

    使用keil MDK编译项目时 compiling编译通过 但是文件最后出现错误 Error User Command terminated Exit Code 1 经查阅资料 MDK需要fromelf exe文件生成 bin 那么在重新安
  • uboot编译报错解决

    uboot编译报错 root ubuntu home gjt uboot u boot 2015 01 make scripts kconfig conf silentoldconfig Kconfig scripts kconfig co
  • Protobuf 使用(c++)

    一 Protobuf 安装 安装protobuf tar xvf protobuf cd protobuf autogen sh生成configure configure prefix usr local protobuf make mak
  • 用P5.js实现一个动态的绘画系统

    摘要 通过一段时间的学习 我发现码绘的可能性比我想象的要更大 我们可以用码绘实现很多手绘很难达到的效果 比如创作一幅会动的 能进行交互的画作 如何通过类似画笔的东西在屏幕上创作出时刻在改变的 并且我们可以进行实时修改的像动画一样的作品 这就