Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Processing沙画的笔触模拟

Processing沙画的笔触模拟

作者头像
ChildhoodAndy
发布于 2022-01-20 08:44:55
发布于 2022-01-20 08:44:55
85000
代码可运行
举报
文章被收录于专栏:小菜与老鸟小菜与老鸟
运行总次数:0
代码可运行

Processing 沙画系列开篇 中,小菜提到了沙画技法中的『漏』。

沙画技法中有一种方式叫『漏』,就是把沙子攥在手里并握紧拳头,靠拳头的松紧控制沙子的流量,线条会产生粗细的变化,同时在快速移动时,手的高低变化也会发生相应变化,此手法主要用来描绘图形。我们试试看能不能模拟出漏的感觉。

其实沙画的笔触模拟是非常复杂的,本篇我们来实现一个非常简单的笔触形式,也就是通过randomGaussian()来模拟沙子的笔触分布情况。

知识小课堂-正态分布

我们先看下官方文档:

从平均值为 0 且标准差为 1 的随机数系列返回浮点数。每次调用 randomGaussian() 函数时,它都会返回一个符合高斯或正态分布的数字。理论上,randomGaussian() 可能返回没有最小值或最大值。相反,返回远离平均值的值的概率非常低。并且返回平均值附近的数字的概率更高。

"能不能说人话,我有些看不懂。。。"

要理解这个函数,需要理解『正态分布』这个概念。正态分布在日常生活中很常见,比如某个国家成年男性身高的分布、一个健康人在一天当中血压的变化、高考数学成绩的分布,这些数据的背后都隐藏着一个正态分布模型。

正态分布,就是在正常状态下的概率分布,而所谓分布,就是描述一组数中,有多少数是大,有多少数是小,这些大数和小数在整体中的占比又是多少。

小菜做了两个关于正态分布的 DEMO,一起来看看:

正态分布的整体图形曲线如下图:

描述正态分布,需要两个参数,一个就是峰值的位置,可以理解成一组数的平均值,一般用希腊字母 μ 表示,另外一个是分布的标准差,代表一组数的离散程度,一般用希腊字母 σ 来表示。

举个很简单的标准差的例子,如何衡量一个 NBA 球员的战斗力?

在 NBA 中,平均数据用来衡量一个球员的战斗力,比如场均得分,盖帽,抢断,助攻等。但是如果想知道哪位球员发挥最稳定该怎么办?在一些关键的比赛场合,你想要得分高,且发挥稳定的球员,而不是表现时好时坏,水平忽高忽低,波动很大的球员。

而标准差就是为了描述在一组数据中数据的波动大小而发明的。

Processing之randomGaussian()

Processing 的randomGaussian返回的是从平均值为 0 且标准差为 1 的随机浮点数。通常我们在使用的时候,要乘以一个扩大的系数,假设为 scale,来获得一个从平均值为 0 且标准差为 scale 的随机数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
size(400, 400);
for (int y = 0; y < 400; y++) {
  float x = randomGaussian() * 60;
  line(200, y, 200 + x, y);
}

这个例子来自官方 api 文档的一个例子,从例子中可以看到

  • for 循环绘制,一共绘制了 400 个线段,得到了一组满足正态分布的数值
  • 线段的长度是由randomGaussian()乘以了 60 得到,这个值带了正负符号,平均值是 0,标准差是 60

数学的东西,有时候不好理解。那么简单理解下,敲黑板了,划重点了:

在 Processing 中,使用 randomGaussian() * scale 来获得一个满足正态分布的随机值,当然正态分布是建立在一组数据之上的分布,单独讨论一个数字是没有意义的,我们通常可以用一个 for 循环中使用randomGaussian()进行一组数据的生成。这组数据的大小分布规律,呈现两头低,中间高的特点。

仅理解这点,就已经足够让我们在生成艺术中施展拳脚了。

p5js中的randomGaussian

需要值得一提的是,Processing Java 中的randomGaussian函数没有参数,默认是返回的平均值为 0,标准差为 1 的随机浮点数。

但在 p5js 中,randomGaussian可以携带 0 个或者 1个 或者 2 个参数。它的函数签名是randomGaussian([mean], [sd]),其中 mean 代表平均值,sd 代表标准差。两者用 [] 中括号扩起来,代表是可选的,可带也可不带的意思。

  • 不带参数,表示返回的平均值为 0,标准差为 1 的满足正态分布的随机浮点数
  • 带 1 个参数 mean,表示返回的平均值为 mean,标准差为 1 的满足正态分布的随机浮点数
  • 带 2个参数 mean 和 sd,表示返回的平均值为 mean,标准差为 sd 的满足正态分布的随机浮点数

代码实现

终于到了代码实现环节了,完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int batchSandCount = 600;
float sandRange = 10;

final color SAND_COLOR_1 = #AC9730;
final color SAND_COLOR_2 = #B79733;


void setup() {
  size(800, 800);
  background(255);
}


void draw() {
  if (!mousePressed) {
    return;
  }

  float mouseXSpeed = abs(mouseX - pmouseX);
  float mouseYSpeed = abs(mouseY - pmouseY);
  float mouseSpeed = max(mouseXSpeed, mouseYSpeed);
  mouseSpeed = constrain(mouseSpeed, 0, 100);
  sandRange = map(mouseSpeed, 0, 100, 10, 100);
  batchSandCount = int(map(mouseSpeed, 0, 100, 600, 1000));

  for (int i = 0; i < batchSandCount; i++) {
    float posx = randomGaussian() * sandRange;
    float posy = randomGaussian() * sandRange;

    if (random(1) < 0.5) {
      stroke(SAND_COLOR_1);
    } else {
      stroke(SAND_COLOR_2);  
    }
    point(mouseX + posx, mouseY + posy);
  }
}

void keyPressed() {
  if (key == 'c') {
    background(255);
  }
}

思路分析

声明下,以下思路仅小菜的一种思考实现方式,并不一定最好,但也算一种简单的模拟实现。

  • 计算出鼠标的移动速度,取横向和纵向较大的速度,然后使用constrain函数限定移动的速度范围,防止过快的速度
  • 我们模拟当手(鼠标)移动的速度和手中(笔触)沙子的数量成正比,当移动的越快时,手中流逝出的沙子数量就越多
  • 我们模拟当手(鼠标)移动的速度和沙子的分布范围sandRange成正比,当移动的越快时,画布上的沙子分布的范围越大
  • 使用了两种沙子颜色进行随机,来增强沙子的真实感

源码地址

Processing100天速写[1]Day_055[2]

参考资料

[1]Processing100天速写: https://github.com/xiaocai-laoniao/Processing100DaysSketch

[2]Day_055: https://github.com/xiaocai-laoniao/Processing100DaysSketch/tree/main/Day_055

[3]https:/www.processing.love: https://www.processing.love

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小菜与老鸟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
计算与推断思维 十二、为什么均值重要
在这个课程中,我们已经研究了几个不同的统计量,包括总编译距离,最大值,中位数和平均值。在关于随机性的明确假设下,我们绘制了所有这些统计量的经验分布。有些统计量,比如最大和总变异距离,分布明显偏向一个方向。但是,无论研究对象如何,样本均值的经验分布几乎总是接近钟形。
ApacheCN_飞龙
2022/12/01
1.1K0
计算与推断思维 十二、为什么均值重要
从统计到概率,入门者都能用Python试验的机器学习基础
要学习统计,就不可避免得先了解概率问题。概率涉及诸多公式和理论,容易让人迷失其中,但它在工作和日常生活中都具有重要作用。先前我们已经讨论过描述性统计中的一些基本概念,现在,我们将探讨统计和概率的关系。
机器之心
2018/09/20
4990
从统计到概率,入门者都能用Python试验的机器学习基础
Python Numpy随机数生成的实战技巧分享
在数据科学、机器学习和数值模拟中,随机数的生成是非常重要的一个环节。无论是在模拟随机现象、生成测试数据,还是在训练模型时进行随机初始化,随机数都扮演着至关重要的角色。Python中的Numpy库为我们提供了强大且灵活的随机数生成功能,能够满足各种场景下的需求。
sergiojune
2024/09/17
1210
Python Numpy随机数生成的实战技巧分享
Python数据分析之Numpy入门
NumPy(Numerical Python)是Python语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型,多维数组上执行的数值运算。
仙人技术
2020/04/29
3.1K0
蒙特卡洛模拟求圆周率
。蒙特卡洛方法是一种以概率统计为基础的数值计算方法,通过随机采样得到结果或近似值。在这个程序中,我们生成了一个以原点为中心、半径为
GeekLiHua
2025/01/21
1170
Numpy常用random随机函数
在现代数据科学和机器学习领域,随机性是解决许多问题的关键。而NumPy作为Python中一流的科学计算库,其强大的随机函数模块为我们提供了丰富的工具,用以模拟实验、生成数据或执行随机抽样。本文将深入探讨NumPy中常用的随机函数,为你揭示其背后的原理以及如何在数据科学项目中充分利用这些功能。无论你是新手还是经验丰富的开发者,本文都将帮助你更好地理解和应用NumPy的随机函数,为你的项目注入新的活力。
老虎也淘气
2024/01/30
4450
Numpy常用random随机函数
Python伪随机数模块random
该模块实现了各种分布的伪随机数生成器。(包括在实数轴上计算均匀、正态(高斯)、对数正态、负指数、伽马和贝塔分布的函数)不应将此模块的伪随机生成器用于安全目的。有关安全性或加密用途,请使用secrets模块。 关于random模块的更多详细内容,请参考官方文档random — 生成伪随机数 下面列举一下该模块常用的功能。
zy010101
2022/09/21
4550
Processing沙画风向测试
http://mpvideo.qpic.cn/0b2e5uaawaaa6eacwioipfqvb3odbpwqacya.f10002.mp4?dis_k=9e6f8b5f1ea5c88259e0cb9
ChildhoodAndy
2022/03/30
3160
NumPy 1.26 中文文档(四十二)
要计算的百分位数或百分位数序列,必须在 0 和 100 之间(包括 0 和 100)。
ApacheCN_飞龙
2024/06/28
2380
NumPy 1.26 中文文档(四十二)
Python标准库random用法精要
random标准库主要提供了伪随机数生成函数和相关的类,同时也提供了SystemRandom类(也可以直接使用os.urandom()函数)来支持生成加密级别要求的不可再现伪随机数序列。 1、random.seed() 初始化随机数生成器。使用相同种子可以生成相同的随机数序列。例如: >>> random.seed(5) >>> random.random() 0.6229016948897019 >>> random.random() 0.7417869892607294 >>> random.seed(
Python小屋屋主
2018/04/16
1K0
random使用
本文主要是记录numpy中随机模块random的使用方法 import numpy as np np.random.rand(1,2,3) # 生成指定维度的均匀分布的随机数组,浮点数,范围是0-1 array([[[0.94051693, 0.30998811, 0.48737386], [0.22611184, 0.20013266, 0.1551036 ]]]) np.random.randn(1,2,3) # 生成指定维度的正态分布的随机数组,浮点数,平均值是0,标准差
皮大大
2021/03/02
5100
tf.random_uniform与tf.truncated_normal
生成的值在该 [minval, maxval) 范围内遵循均匀分布.下限 minval 包含在范围内,而上限 maxval 被排除在外.
周小董
2019/03/25
1.1K0
数据科学 IPython 笔记本 六、SciPy 统计推断
为了探索量化效应量的统计量,我们将研究男女之间的身高差异。 我使用来自行为风险因素监测系统(BRFSS)的数据,来估计美国成年女性和男性的身高的平均值和标准差(cm)。
ApacheCN_飞龙
2022/05/07
8280
数据科学 IPython 笔记本 六、SciPy 统计推断
Python 随机数生成:深入探索 random 模块的功能与应用
random.random()函数返回一个范围在[0.0, 1.0)之间的随机浮点数。这是生成均匀分布随机数的基础函数。
一键难忘
2024/03/19
7120
Numpy与矩阵
请注意,本文编写于 980 天前,最后修改于 980 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
1.4K0
Numpy与矩阵
用于时间序列概率预测的蒙特卡罗模拟
蒙特卡罗模拟这个名称源自于摩纳哥王国的蒙特卡罗城市,这里曾经是世界著名的赌博天堂。在20世纪40年代,著名科学家乌拉姆和冯·诺依曼参与了曼哈顿计划,他们需要解决与核反应堆中子行为相关的复杂数学问题。他们受到了赌场中掷骰子的启发,设想用随机数来模拟中子在反应堆中的扩散过程,并将这种基于随机抽样的计算方法命名为"蒙特卡罗模拟"(Monte Carlo simulation)。
数据STUDIO
2024/05/20
3810
用于时间序列概率预测的蒙特卡罗模拟
Python【statistics】 — 统计学计算(总结一)
statistics 模块实现了许多常用的统计公式,以便使用 Python 的各种数值类型(int,float,Decimal 和 Fraction)进行高效的计算。
Python知识大全
2020/02/13
1.1K0
Numpy
对数组运算相当于对数组每一个元素进行运算 a = np.arange(24).reshape((2,3,4))
Fred Liang
2018/08/02
9330
python中数值相关的操作
最后一个函数比较特殊,ord函数根据ASCII码将单个字符转换为数值,与之相对,chr函数可以将数值转换为ASCII编码的字符。
生信修炼手册
2020/05/07
1.2K0
周末重温——TensorFlow之参数初始化
CNN中最重要的就是参数了,包括W和b。训练CNN的最终目的就是得到最好的参数,使得目标函数取得最小值。参数的初始化也同样重要,因此微调受到很多人的重视。tf提供的所有初始化方法都定义在tensorflow/python/ops/init_ops.py。
lujohn3li
2021/06/10
1.1K0
相关推荐
计算与推断思维 十二、为什么均值重要
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验