【创意编程】暗潮:processing随机游走及噪声之美

在读《代码本色》的时候看到泊林噪声,一下子觉得这个东西可能是个非常有意思的东西。书后说perlin噪声能够产生很多自然界的纹理、模拟流场运动,就想起很久之前在公众号上看到的一个用随机游走的粒子来描绘水流的案例。
于是写了这样的一个东西:
效果是这样的。博客传不上来5M以上的gif,只能尽量压缩时间帧率和采样率。
最初粒子是随机均匀分布在画布上的,经由噪声的作用变换轨迹。

这里我给所有的粒子添加了一个二维噪声,取粒子当前的位置为构造噪声的参数,故粒子在相同位置时噪声值是相同的。这样必然会造成的结果是它们将呈现某种固定的趋势,且随时间增加它们很有可能会合并。

结果的确出现了这样的趋势:


(这里因为截图的时候是分开截的,所以不是同一次运行的结果,轨迹有偏差,但是我影响我们观察粒子合并的趋势。)

我们首先创建一个粒子系统。

ArrayList<Particle> particles;
particles = new ArrayList<Particle>();
for (int i = 0; i < 6000; i++){Particle p = new Particle();particles.add(p);}

这样我们就创建了一个具有6000个粒子的系统。我们需要重复利用这些粒子,让他们永远出现在屏幕中,避免程序运行之后粒子的数量越来越少。我们就需要时刻判断粒子是否超出边界。需要对每个粒子用到边界检测:

  public void boundaryDetect(){if (position.x <= 0)position.x = width - 1;if (position.x >= width)position.x = 0;if (position.y <= 0)position.y = height - 1;if (position.y >= height)position.y = 0;}

这将作为粒子类的类方法,在每一帧的draw()函数中更新完粒子位置之后都需要被调用。
————

添加噪声

泊林噪声有一维和二维甚至更多维,根据需要用到的维度可以任意选择。我们在这里采用了三维噪声,因为我们在考虑时间对噪声值影响的同时还需要考虑位置对噪声的影响。我们将它写在update()方法中,每一次draw()都对每一个屏幕中的粒子调用该方法。
在噪声代码

angle = noise(position.x * 0.006, position.y * 0.004, incr) * PI ;

中,由于我们需要取噪声的角度,所以最好的方式就是在获取一个噪声值之后给它乘上PI,用于弧度计算。这里的参数对模拟效果的影响稍后说明。

  public void update(){incr += 0.001;angle = noise(position.x * 0.006, position.y * 0.004, incr) * PI ;position.x += 2 * cos(angle);position.y += 2 * sin(angle);
}

在这里,代码

    position.x += 2 * cos(angle);position.y += 2 * sin(angle);

用于使粒子的位置移动相应的偏移量。之所以在这里引入三角函数,是因为我们希望这群粒子始终都平稳地变化,而不是有抖动效果的剧变。我们可以让他的运动范围限制在一定的范围内且不超过某个固定值。那么能够实现这样的约束的,三角函数是最简便易懂的方法。sin值和cos值都不会超过[-1,1]的范围内,也就是说粒子在一帧内的运动永远不会越过以其位置为中心的单位为1的圆。
这正是我们想要的效果。

————

渐变颜色

我们规定,一个粒子的颜色是由它产生时的位置决定的,这样有利于营造出整个画面的渐变感以及色彩的层次感。一个粒子在画布中将呈现什么颜色由它出生时的位置决定也不再能够更改,而我们将画布的宽映射到(0,255),就可以根据位置来线性的改变颜色中的G值,使粒子系统呈现渐变的紫色色彩。

  Particle(){position = new PVector(random(width), random(height));float adj = map(position.x, 0, width, 0, 255);col = color(255, adj, 255);}

至此,关键代码已经解释完成,完代码如下:

主要控制类:

ArrayList<Particle> particles;void setup(){size(1600, 900);background(0);noStroke();particles = new ArrayList<Particle>();for (int i = 0; i < 6000; i++){Particle p = new Particle();particles.add(p);}
}void draw(){frameRate(40);fill(0, 10);rect(0, 0, width, height);loadPixels();for (Particle p : particles){p.update();p.boundaryDetect();p.display();}updatePixels();
}

粒子类:

class Particle{//eccential elementsPVector position;color col;//otherfloat incr;float angle;Particle(){position = new PVector(random(width), random(height));float adj = map(position.x, 0, width, 0, 255);col = color(255, adj, 255);}public void update(){incr += 0.001;angle = noise(position.x * 0.006, position.y * 0.004, incr) * PI ;position.x += 2 * cos(angle);position.y += 2 * sin(angle);
}public void boundaryDetect(){if (position.x <= 0)position.x = width - 1;if (position.x >= width)position.x = 0;if (position.y <= 0)position.y = height - 1;if (position.y >= height)position.y = 0;}public void display(){pixels[(int)position.x + (int)position.y * width] = col;}
}

下面我们来看一下有关上面所描述的关键噪声代码的参数的选择是怎样进行的:
如果将噪声中的PI改为TWO_PI则效果将是:

变为3*Pi的效果:


似乎有一点点像纹理了。

【创意编程】《暗潮》:processing随机游走及噪声之美相关推荐

  1. 代码本色——雪梨的Processing探索·Chapter 0:随机游走

    概述 Chapter 0为我们介绍了随机数.概率和噪声在运动当中起到的变化作用,下面就让我们来好好的了解下这些数学名词,究竟可以起到怎样的公用,最后再让我们来发挥想象进行这些知识的运用创作. 原理介绍 ...

  2. python勾股定理_Python学习第128课——在Python中实现醉汉随机游走

    [每天几分钟,从零入门python编程的世界!] 这节我们在2D平面内实现随机游走.我们先把原理搞清楚,用代码实现这个原理. 原理分析: 我们想像在2D平面内有一个x轴和y轴组成的坐标系,有一个人他是 ...

  3. 《四维全息算法》9--四维全息算法的基本思路是什么?股市数据是具有分形迭代特征的随机游走

    傅立叶函数分级通常被应用于声波的数学拟合,甚至对噪声的拟合.那么,如果用一个决定性的数学方法能够拟合噪声,噪声是否就是完全没有规律可言呢?也就是说,噪声也存在一种复杂的具有决定性规律的信息. 那么,换 ...

  4. 随机游走模型 matlab,基于随机游走的图像分割matlab代码

    [实例简介] 利用随机游走模型对图像进行了分割 编程环境是matlab 含有示例图片 可以直接运行 [实例截图] [核心代码] Randomwalksforimagesegmentation_matl ...

  5. 时间序列举例--------协方差+相关系数+随机游走+平稳性

    一. 时间序列的影响因素 (1) 长期趋势-------------这个是进行预测的三原则之一 (2) 循环变动或周期性----------------------预测的三原则之一 (3)季节性变动- ...

  6. KDD 2019 | 结合属性随机游走的图递归网络

    今天给大家介绍德克萨斯A&M大学的Xiao Huang等人在KDD 2019发表的一篇文章"Graph Recurrent Networks with Attributed Rand ...

  7. 重启随机游走算法(RWR:Random Walk with Restart)

    重启随机游走算法(RWR:Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决 ...

  8. UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time

    UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time 这一讲介绍可选停时(optional stopping),我们先回顾一下停时的定义: ...

  9. 加速度随机游走_IMU Noise Model

    1.参考资料 2.相关定义 高斯白噪声 概率上服从高斯分布,一阶矩(均值)是常数,二阶矩(方差)无关即时域上不同时刻的信号时不相关的噪声:或者说噪声的瞬时值服从高斯分布(高斯),功率谱密度又是均匀分布 ...

最新文章

  1. Sqlite3的安装Windows
  2. html动画效果放大,一个CSS+jQuery实现的放大缩小动画效果
  3. Educational Codeforces Round 112 (Rated for Div. 2)
  4. 数据结构的基本概念和抽象数据类型
  5. 暂停交易?ERC20合约整数溢出安全漏洞案例技术分析一
  6. 用更少的钱看更清晰的视频——详谈阿里云窄带高清
  7. git新建和删除远程分支
  8. 用栈实现中缀表达式求值
  9. Java垃圾回收机制(GC原理)解析
  10. 5 个关键点!优化你的 UI 原型设计
  11. 电脑html怎么导入苹果手机,爱思助手把电脑视频怎么导入苹果手机 视频导入iPhone教程...
  12. 论坛php 图片上传,Discuz! X3 论坛文件图片上传尺寸:小于2M的修改方法
  13. DB2根据指定列筛选重复数据
  14. 【720开发】 spring boot 快速入门
  15. 泛谈传统运营商借鉴电商模式
  16. 步进电机控制(Proteus仿真+代码
  17. 深度学习还没入门?看看深度学习三巨头的Deep Learning综述(1)
  18. 《财富》封面文章:重新审视世界500强,它们又卷土重来了
  19. gps网络对时Linux,gps网络时间对时服务器的功能简介
  20. 【华为OD机试真题 Python】乱序整数序列之两数之和绝对值最小

热门文章

  1. R语言 eval parse 字符串内有引号 格式化输出
  2. 软件需求工程 高校教学平台 需求变更控制会规程
  3. Android拖动进度条画面随动,Android学习笔记(24):进度条组件ProgressBar及其子类
  4. 股票基本名词,你知道多少?
  5. 5分钟教你做一个WebView广告过滤器
  6. ctr多少正常_你知道亚马逊的点击率多少算正常的吗?
  7. 天正暖通天圆地方在哪_体现了“天圆地方”的中国古典家具有哪些?我们来聊一下!...
  8. mybatis-plus QueryWrapper 添加limit
  9. 在计算机网络英文缩写wan的中文名是,在计算机网络中,英文缩写WAN的中文名是。...
  10. 计算机用户分为哪4类,计算机的分类-通常将计算机分为哪几类?通常将计算机分为哪几类,各自的特点和用途 爱问知识人...