我最近发现了泰勒·霍布斯(Tyler Hobbs)创作的这件艺术品(LINES 2A(2017))。这张照片看起来很手工绘制,但是完全是生成的。关于这幅画的一些事情以及它的纹理引起了我的共鸣,所以我想尝试使用p5js研究和复制(或从中获得灵感)。
我首先在这样的圆圈内绘制了一堆随机点。
w = 1000function setup(){createCanvas(w,w); background('#F9F8F4');}函数draw(){x = random(w)y = random(w)if(pow(w / 2-x,2)+ pow(w / 2- y,2)< 7e4){point(x,y)}}
这是一个非常缓慢的过程,很难在圆上生成随机点。我后来发现了一种更好的方法。我接下来要做的是生成流场,但仅限于圆形区域。
我们将在圆内绘制流场。让我们尝试一下。
const is_in_circle =(x,y)=> (pow(w / 2-x,2)+ pow(w / 2-y,2)< 7e4)function draw(){if(is_in_circle(x = random(w),y = random(w))) while(is_in_circle(x,y)){n =噪声(x,y)x + = sin(n * TAU)y + = cos(n * TAU)point(x,y)}}
好吧,不是很好。在这个水平上的噪声是相当粗糙的。我们将放大噪声函数(通过将x,y输入除以某个常数值),并可能使用circle(x,y,0.3)来绘制点函数,因为我觉得它看起来更平滑。另外,我要添加一个random()>循环中的条件为0.01,这样我们还可以获得未被圆的边缘修剪掉的短线。
函数draw(){如果(is_in_circle(x = random(w),y = random(w)))而while(is_in_circle(x,y)&& random()> 0.01){n =噪声(x / 500,y / 500)x + = sin(n * TAU)y + = cos(n * TAU)circle(x,y,.3)}}
其实..还不错。我认为我们几乎可以复制原始纹理。倒置版本看起来也不错。
从技术上讲,我们现在编写的代码具有动画效果。但是动画不是很流畅。
为了制作平滑的动画,我们需要在圆中生成新点,并在draw()函数之外跟踪这些点。我发现了这种巧妙的技术,可以在圆中找到随机点,在该圆中选择了随机半径r和角度theta,并获得x,y点,因为x = centerX + r * cos(theta)且y = centerY + r * sin (θ)
函数random_point(){r = random(w / 4)t = random(TAU)return [w / 2 + cos(t)* r,w / 2 + sin(t)* r]}函数setup(){createCanvas ((w = 1e3),w); background(255)k = w / 2 m =(Array(w).fill(0))。map(random_point)}函数draw(){for(i = k; --i;){[x,y] = m [i] circle(x,y,.3); }}
函数random_point(){r = random(w / 4)t = random(TAU)return [w / 2 + cos(t)* r,w / 2 + sin(t)* r]} const w = 1000函数设置( ){createCanvas(w,w);背景('#F9F8F4')k = w / 2点=(Array(k).fill(0))。map(random_point)}函数draw(){for(i = k; --i ;){[x,y] = m [i] x + = sin(n =噪声(x / 400,y / 400)* TAU)* hy + = cos(n)* h笔触(i%255)圆(x,y,.3)if(pow(k-x,2)+ pow(k-y,2)< 7e4)//如果点在圆点中[i] = [x,y,t] else points [i] = random_point()//如果没有则替换为新点}}
有许多使该草图着色的策略。一种是只给每个粒子一个随机的初始颜色。
但是,我发现保持粒子阵列中的初始x或y位置并使用它来导出色相信息可以为我们提供一些不错的木星/气态行星振动。 可以通过在相反方向上移动50%的点来避免侧面的条纹。