float nx = 0;
float ny = 0;
float nz = 0;
int am = 3;
int range = 250;
float angle = 0;
float x = 0;
float y = 0;
float c = 0;
void setup () {
size (700, 700);
strokeCap(PROJECT);
strokeWeight(am);
background(27, 32, 24, 30);
}
void draw () {
noStroke();
for (int i = 0; i <= width; i++) {
for (int j = 0; j <= range; j++) {
float d = dist(width/2,0.65*range,i,j);
d = map(d,0,width/4,150,90);
color k = color(0.4*d,0.48*d,0.5*d);
set(i,j,k);
}
}
fill(27, 32, 24, 80);
rect(0, range, width, height);
nx = nz;
//water
for (int i=0; i<width; i += am) {
ny = 0;
for (int j=range; j<height; j += am) {
angle = map (noise (nx, ny, nz), 0, 1.0, 0, 4*PI);
x = am * cos (angle);
y = am * sin (angle);
c = dist(i, j, width/2, range/2);
c = map(c, 0, width/2, 100, 0);
stroke(10*angle-j/40+0.9*c, 11*angle+0.9*c, 13*angle+0.9*c, 4*angle+j/30);
line (i, j, i+x, j+y);
//flash
float xMax = width/2 + randomGaussian()*range/6;
float xMin = width/2 - randomGaussian()*range/6;
if (i > xMax && i < xMin && j < random(height)) {
if (random(angle) > 1.6*PI) {
pushMatrix();
translate(i, j);
rotate(PI/4);
stroke(255, 248, 219, 10+c/4);
fill(255, 248, 219, 40+c);
rect(0, 0, 2*am, 2*am);
popMatrix();
}
}
ny += 0.1;
}
nx += 0.01;
}
nz +=0.02;
//moon
for (int i = 0; i < 30; i++) {
noStroke();
fill(255, 248, 219, 100-i);
circle(width/2, 0.65*range, 3*i);
}
//cloud
for (int i=0; i<width; i += am) {
ny = 0;
for (int j=0; j<range; j += am) {
angle = map (noise (nx, ny, nz), 0, 1.0, 0, 4*PI);
x = am * cos (angle);
y = am * sin (angle);
noStroke();
c = dist(i, j, width/2, range/2);
c = map(c, 0, width/2, 100, -10);
fill(4*angle+1.2*c, 5*angle+1.1*c, 5*angle+0.9*c, 30*angle-1.3*j);
rect (i, j, 4*am, am);
ny += 0.1;
}
nx += 0.05;
}
}