柏林噪波:云与海 Perlin Noise: Clouds and Sea

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;
  }
}