コード
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);
}
リファレンス