Move the mouse above a triangle to split it into smaller triangles. Click on the image for the lazy/impatient
xxxxxxxxxx
/* @pjs preload="IMGP7224.jpg"; */
ArrayList<Triangle> triangles;
PImage pimg;
int[] pix;
int w, h;
void setup() {
size(500, 500, P2D);
noStroke();
pimg = loadImage("IMGP7224.jpg");
w = pimg.width;
h = pimg.height;
pix = new int[w * h];
arrayCopy(pimg.pixels, pix);
pimg.loadPixels();
pimg.updatePixels();
triangles = new ArrayList<Triangle>();
PVector A = new PVector(0, 0);
PVector B = new PVector(width, 0);
PVector C = new PVector(0, height);
triangles.add(new Triangle(A, B, C, 0));
A = new PVector(width, height);
triangles.add(new Triangle(A, B, C, 0));
}
void draw() {
if (mouseX != pmouseX || mouseY != pmouseY) {
for (int i = 0; i < triangles.size (); i ++) {
if (triangles.get(i).containsMouse()) {
transformTriangle(i);
break;
}
}
}
}
void transformTriangle(int i) {
Triangle t = triangles.get(i);
PVector A = t.A;
PVector B = t.B;
PVector C = t.C;
PVector D = B.get();
int r = t.rank;
D.add(C);
D.mult(.5);
Triangle t1 = new Triangle(D, A, B, r+1);
Triangle t2 = new Triangle(D, A, C, r+1);
triangles.remove(i);
if(r < 11){
triangles.add(t1);
triangles.add(t2);
}
}
void mousePressed(){
int qqq = ceil(float(triangles.size()) / 10);
for(int i = 0; i < qqq; i ++){
transformTriangle(floor(random(triangles.size())));
}
// println("done: " + qqq + ", " + triangles.size());
}
class Triangle {
float x, y;//position of the triangle
int c;//color of the triangle
PVector A, B, C;
int rank;
Triangle(PVector _A, PVector _B, PVector _C, int _rank) {
A = _A.get();
B = _B.get();
C = _C.get();
rank = _rank;
int x = int((A.x+B.x+C.x)/3);
int y = int((A.y+B.y+C.y)/3);
c = pix[x + y * w];
display();
}
void display() {
fill(c);
beginShape();
vertex(A.x, A.y);
vertex(B.x, B.y);
vertex(C.x, C.y);
endShape();
}
Boolean containsMouse() {
float l1 = ((B.y-C.y)*(mouseX-C.x)+(C.x-B.x)*(mouseY-C.y))/((B.y-C.y)*(A.x-C.x)+(C.x-B.x)*(A.y-C.y));
float l2 = ((C.y-A.y)*(mouseX-C.x)+(A.x-C.x)*(mouseY-C.y))/((B.y-C.y)*(A.x-C.x)+(C.x-B.x)*(A.y-C.y));
float l3 = 1 - l1 - l2;
return 0 < l1 && l1 < 1
&& 0 < l2 && l2 < 1
&& 0 < l3 && l3 < 1;
}
}