日常の進捗

主に自分のための,行為とその習慣化の記録

Mod: Generative Design / P_1_2_3_03 + P_1_2_3_04

f:id:takawo:20180102183212g:plain

コード

import generativedesign.*;
import processing.opengl.*;
import java.util.Calendar;

int colorCount = 20;
float[] hue = new float[colorCount];
float[] sat = new float[colorCount];
float[] bri = new float[colorCount];
float alpha = 50;

int actRandomSeed = (int)random(10000);

void setup() {
  size(960, 540, P2D);
  colorMode(HSB, 360, 100, 100, 100);
  blendMode(ADD);
  noStroke();
}

void draw() {
  background(0, 0, 0);
  randomSeed(actRandomSeed);

  float temp = 0;
  for (int i = 0; i < colorCount; i++) {
    if (i%3 == 0) {
      temp = random(360);
      hue[i] = temp;
      sat[i] = 100;
      bri[i] = random(100);
    } else if (i%3 == 1) {
      hue[i] = (temp + 120)%360;
      sat[i] = random(100);
      bri[i] = 100;
    } else {
      hue[i] = (temp + 240)%360;
      sat[i] = random(100);
      bri[i] = 100;
    }
  }

  int counter = 0;
  int rowCount = (int)random(5, 20);
  float rowHeight = (float)height / (float)rowCount;

  for (int i = rowCount; i >= 0; i--) {
    int partCount = i + 1;
    float[] parts = new float[0];

    for (int j = 0; j < partCount; j++) {
      if (random(1) < 0.065) {
        int fragments = (int) random(2, 20);
        partCount = partCount + fragments;
        for (int k = 0; k < fragments; k++) {
          parts = append(parts, random(2));
        }
      } else {
        parts = append(parts, random(2, 20));
      }
    }

    float sumPartsTotal = 0;
    for (int j = 0; j < partCount; j++) {
      sumPartsTotal += parts[j];
    }
    float sumPartsNow = 0;
    for (int j = 0; j < parts.length; j++) {
      sumPartsNow += parts[j];
      float x = map(sumPartsNow, 0, sumPartsTotal, 0, width);
      float y = rowHeight * i;
      float w = map(parts[j], 0, sumPartsTotal, 0, width)*-1;
      float h = rowHeight * 1.5;

      x += (random(1) < 0.5) ? (int)random(10) * 10 : (int)random(10) * -10;
      y += (random(1) < 0.5) ? (int)random(10) * 10 : (int)random(10) * -10;


      int index = counter % colorCount;

      beginShape();
      fill(0, 0, 0);
      vertex(x, y);
      vertex(x+w, y);
      color c1 = color(hue[index], sat[index], bri[index], alpha);
      fill(c1);
      vertex(x+w, y+h);
      endShape(CLOSE);

      color c2 = color((hue[index]+180)%360, sat[index], bri[index], alpha);
      beginShape();
      fill(c2);
      vertex(x, y+h);
      fill(c2);
      vertex(x+w, y+h);
      fill(0, 0, 0);
      vertex(x, y);
      endShape(CLOSE);

      counter++;
    }
  }
  noLoop();
}

void keyReleased() {
  if (key == 's' || key == 'S') saveFrame(timestamp()+"_####.png");
  if (key == 'c' || key == 'C') {
    color[] colors = new color[colorCount];
    for (int i=0; i<colorCount; i++) {
      colors[i] = color(hue[i], sat[i], bri[i]);
    }
    GenerativeDesign.saveASE(this, colors, timestamp()+".ase");
  }
}

void mousePressed() {
  actRandomSeed = (int) random(100000);
  redraw();
}

String timestamp() {
  Calendar now = Calendar.getInstance();
  return String.format("%1$ty%1$tm%1$td_%1$tH%1$tM%1$tS", now);
}

リファレンス