日常の進捗

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

Mod: Generative Design / P_1_2_2_01

f:id:takawo:20180101131503g:plain

ロードした画像のピクセルから色を取得してタイル状に敷く.改変したところはウィンドウ/画像サイズを正方形でなくした.それに伴って配列に色を詰め込む計算が若干面倒な処理をしている.色の配列をソートする部分はほぼライブラリがやっているのであまり見どころがないのだけど,Javadoc(ライブラリの関数・定数などが参照できる取扱説明書のようなもの)が確認できたのは良かった.

コード

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

boolean savePDF;

PImage img;
color[] colors;

String sortMode = null;

void setup() {
  size(960, 540);
  colorMode(HSB, 360, 100, 100, 100);
  noStroke();
  noCursor();
  img = loadImage("pic0.jpg");
}

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

  int tileCountX = (int)map(mouseX, 0, width, 100, 10);
  float rectSize = width / float(tileCountX);
  int tileCountY = round(height / rectSize);
  int i = 0;
  colors = new color[tileCountX * tileCountY];
  for (int gridY=0; gridY<tileCountY; gridY++) {
    for (int gridX=0; gridX<tileCountX; gridX++) {
      int px = (int) (gridX * rectSize);
      int py = (int) (gridY * rectSize);
      colors[i] = img.get(px, py);
      i++;
    }
  }
  if (sortMode != null) colors = GenerativeDesign.sortColors(this, colors, sortMode);
  i = 0;
  for (int gridY=0; gridY<tileCountY; gridY++) {
    for (int gridX=0; gridX<tileCountX; gridX++) {
      fill(colors[i]);
      rect(gridX*rectSize, gridY*rectSize, rectSize, rectSize);
      i++;
    }
  }

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

void keyReleased() {
  if (key=='c' || key=='C') GenerativeDesign.saveASE(this, colors, timestamp()+".ase");
  if (key=='s' || key=='S') saveFrame(timestamp()+"_##.png");
  if (key=='p' || key=='P') savePDF = true;

  if (key == '1') img = loadImage("pic0.jpg");
  if (key == '2') img = loadImage("pic1.jpg");
  if (key == '3') img = loadImage("pic2.jpg");

  if (key == '4') sortMode = null;
  if (key == '5') sortMode = GenerativeDesign.HUE;
  if (key == '6') sortMode = GenerativeDesign.SATURATION;
  if (key == '7') sortMode = GenerativeDesign.BRIGHTNESS;
  if (key == '8') sortMode = GenerativeDesign.GRAYSCALE;
}

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

リファレンス