見出し画像

ProcessingでGenerative art #83

今回は三角形を4つに分けました。

シェルビンスキーのギャスケットとも少し違う。

Code

int actRandomSeed = 0;
int count = 3; 

void setup() {
  size(800, 800, P2D);
  pixelDensity(2);
  colorMode(HSB, 360, 100, 100, 100);
}

void draw() {
  randomSeed(actRandomSeed);

  background(0);
  divideTriangle(0, 0, width, 0, mouseX, mouseY, count);
  divideTriangle(width, 0, width, height, mouseX, mouseY, count);
  divideTriangle(width, height, 0, height, mouseX, mouseY, count);
  divideTriangle(0, height, 0, 0, mouseX, mouseY, count);
}

void divideTriangle(float x1, float y1, float x2, float y2, float x3, float y3, float n) {
  stroke(360);
  fill(randomColor());
  beginShape();
  vertex(x1, y1);
  vertex(x2, y2);
  fill(randomColor());
  vertex(x3, y3);
  endShape(CLOSE);

  n -- ;

  if (n > 0) {
    float random1 = map(randomGaussian(), -5, 5, 0, 1);
    float randomX1 = x3 + (x1- x3) * random1;
    float randomY1 = y1 + (y3 - y1) * (1 - random1);

    float random2 = map(randomGaussian(), -5, 5, 0, 1);
    float randomX2 = x1 + (x2- x1) * random2;
    float randomY2 = y1 + (y2 - y1) * random2;

    float random3 = map(randomGaussian(), -5, 5, 0, 1);
    float randomX3 = x3 + (x2- x3) * random3;
    float randomY3 = y3 + (y2 - y3) * random3;

    float probability = map(n, 1, count, 0.9, 0);  
    if (random(1) > probability) {
      divideTriangle(x1, y1, randomX2, randomY2, randomX1, randomY1, n);
    }
    if (random(1) > probability) {
      divideTriangle(randomX1, randomY1, randomX2, randomY2, randomX3, randomY3, n);
    }
    if (random(1) > probability) {
      divideTriangle(randomX2, randomY2, x2, y2, randomX3, randomY3, n);
    }
    if (random(1) > probability) {
      divideTriangle(randomX1, randomY1, randomX3, randomY3, x3, y3, n);
    }
  }
}

color randomColor() {
  float r = random(1);
  float alph = 100;

  if (r > 6.0/7.0) return color(0, 100, 100, alph);
  else if (r > 5.0/7.0) return color(52, 100, 100, alph);
  else if (r > 4.0/7.0) return color(144, 100, 100, alph);
  else if (r > 3.0/7.0) return color(216, 100, 100, alph);
  else if (r > 2.0/7.0) return color(288, 100, 100, alph);
  else if (r > 1.0/7.0) return color(360, alph);
  else return color(0, alph);
}

void mousePressed() {
  actRandomSeed = (int) random(10000);
}

void keyPressed() {
  if (key == 's')saveFrame("####.png");

  if (keyCode == UP)count += 1;
  if (keyCode == DOWN)count -= 1;
}

Happy coding!!

応援してくださる方!いつでもサポート受け付けてます!