xxxxxxxxxx
// A "paint-splatter" kaleidoscope. Takes a few seconds to appear.......
// PImage, PGraphics, ArrayList, texture, TWO_PI, class, vertex, HSB, PVector, frameCount, translate, rotate, curveTightness, random, curveVertex, cos, generative
// Kaleidoscope structure from "a kaleidoscope" by emdrift - https://www.openprocessing.org/sketch/139372
PImage img;
PGraphics pg;
PaintPot pntpt;
ArrayList<Triangle> triangles;
int numTriangles;
float ang1;
void setup() {
size(1100, 650, P3D);
textureMode(NORMAL);
numTriangles = 12;
ang1 = TWO_PI/float(numTriangles);
triangles = new ArrayList<Triangle>();
for (int j = 0; j < numTriangles; j++) {
triangles.add(new Triangle(j*ang1));
}
pntpt = new PaintPot();
pg = createGraphics(200, 300);
}
void draw() {
frameRate(20);
pg.beginDraw();
pg.noStroke();
pg.colorMode(HSB, 360, 100, 100, 100);
pg.background(360);
pntpt.run();
pg.endDraw();
img = pg.get();
for (int i = 0; i < numTriangles; i += 2) {
triangles.get(i).display(float(width)/2, float(height)/2);
triangles.get(i+1).display2(float(width)/2, float(height)/2);
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// class defs
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class Triangle {
PVector vert1 = new PVector();
PVector vert2 = new PVector();
float rad = 650;
Triangle(float ang2) {
float ang3 = ang1+ang2;
vert1.x = width/2+rad*cos(ang2);
vert1.y = height/2+rad*sin(ang2);
vert2.x = width/2+rad*cos(ang3);
vert2.y = height/2+rad*sin(ang3);
}
void display(float x, float y) {
noStroke();
beginShape();
texture(img);
vertex(x, y, .5, 0);
vertex(vert1.x, vert1.y, 0, 1);
vertex(vert2.x, vert2.y, 1, 1);
endShape();
}
void display2(float x, float y) {
noStroke();
beginShape();
texture(img);
vertex(x, y, .5, 0);
vertex(vert1.x, vert1.y, 1, 1);
vertex(vert2.x, vert2.y, 0, 1);
endShape();
}
}
class PaintPot {
ArrayList<Splatter> splatterArray;
PVector pos;
float xPos;
PaintPot() {
xPos = 0;
splatterArray = new ArrayList<Splatter>();
}
void run() {
// limit particle generation frequency
if (frameCount % 100 == 0) {
pos = new PVector(xPos, -150);
splatterArray.add(new Splatter(pos));
xPos += 100;
if (xPos > pg.width) xPos = 0;
}
for (int i = splatterArray.size ()-1; i >= 0; i--) {
Splatter p = splatterArray.get(i);
p.display();
if (p.pos.y > pg.height + 150) {
splatterArray.remove(i);
}
}
}
}
class Splatter {
PVector pos;
PVector vel;
int numVerts = 100;
float[] rad = new float[numVerts];
float min = random(20, 50);
float max = random(70, 150);
float tghtnss = random(0, 15);
float h = random(180, 360);
float s = random(100);
float b = random(100);
float alpha = random(85, 95);
Splatter(PVector here) {
pos = here.get();
vel = new PVector(0, .8);
for (int i = 0; i < rad.length; i++) {
rad[i] = random(min, max);
}
}
void display() {
pos.add(vel);
pg.noStroke();
pg.fill(h, s, b, alpha);
pg.curveTightness(tghtnss);
pg.pushMatrix();
pg.translate(pos.x, pos.y);
pg.rotate(cos(frameCount * .002));
pg.beginShape();
for (int i = 0; i < numVerts; i++) {
float radius = rad[i];
float angle = (TWO_PI * i/float(numVerts));
pg.curveVertex(radius * cos(angle), radius * sin(angle));
}
pg.endShape(CLOSE);
pg.popMatrix();
}
}