日常の進捗

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

Mod: Generative Design / P_1_2_3_02

f:id:takawo:20180102133058g:plain

コード

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

boolean savePDF = false;

int colorCount = 20;

float[] hue = new float[colorCount];
float[] sat = new float[colorCount];
float[] bri = new float[colorCount];

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

void draw() {
  if (savePDF) {
    beginRecord(PDF, timestamp()+".pdf");
    noStroke();
    colorMode(HSB, 360, 100, 100, 100);
  }

  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, 40);
  float rowHeight = (float)height / (float)rowCount;

  for (int i = 0; i < rowCount; i++) {
    int partCount = i+1;
    float[] parts = new float[0];
    for (int j = 0; j < partCount; j++) {
      if (random(1) < 0.075) {
        int fragments = (int) random(2, 10);
        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++) {
      int index = counter%colorCount;
      color c = color(hue[index], sat[index], bri[index]);
      fill(c);
      sumPartsNow += parts[j];
      float x = map(sumPartsNow, 0, sumPartsTotal, 0, width);
      float y = rowHeight*i;
      float w = map(parts[j], 0, sumPartsTotal, 0, -width);
      float h = rowHeight;
      rect(x, y, w, h);
      counter++;
    }
  }

  if (savePDF) {
    savePDF = false;
    endRecord();
  }
  noLoop();
}

void mousePressed() {
  redraw();
}

void keyReleased() {
  if (key == 's' || key == 'S') saveFrame(timestamp()+"_##.png");
  if (key == 'p' || key == 'P') savePDF = true;
  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");
  }
}


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

リファレンス