見出し画像

Generative Art #129

Code

ArrayList<Form> forms;
Grid grid;

void setup() {
  size(840, 840);
  pixelDensity(2);
  rectMode(CENTER);
  grid = new Grid(0, 0, width, 84);
  newForm();
}

void draw() {
  background(255);
  for (int i = 0; i < forms.size(); i ++) {
    Form f = forms.get(i);
    f.show();
  }
  //grid.show();
}

void newForm() {
  forms = new ArrayList<Form>();
  boolean useGrid[][ ]= new boolean[grid.cw][grid.cw];
  int empty = grid.cw*grid.cw;
  while (empty > 0) {
    float c = grid.c;
    int w = int(random(1, grid.cw));
    int x = int(random(grid.cw - w+1));
    int y = int(random(grid.cw - w+1));
    boolean collision = true;
    for (int j = 0; j < w; j ++) {
      for (int i = 0; i < w; i ++) {
        if (useGrid[x+i][y+j]) {
          collision = false;
          break;
        }
      }
    }
    if (collision) {
      for (int j = 0; j < w; j ++) {
        for (int i = 0; i < w; i ++) {
          useGrid[x+i][y+j] = true;
        }
      }
      forms.add(new Form(grid.x + x * c, grid.y + y * c, w * c));
      empty -= w * w;
    }
  }
}

void mousePressed() {
  newForm();
}

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

//int[] colors = {#fdfffc,#235789,#c1292e,#f1d302,#3b3c42};
int[] colors = {#c33c54,#254e70,#37718e,#8ee3ef,#aef3e7};
int getCol() {
  return colors[(int)random(colors.length)];
}

//-----------------------------------------------------------

class Form {
  float x, y, w;
  float hw = w/2;
  float angle;
  float x1, x2, y1, y2;
  color col1, col2, col3;
  Form(float x, float y, float w) {
    this.x = x;
    this.y = y;
    this.w = w;
    hw= w/2;
    x1 = random(-hw, hw);
    x2 = random(-hw, hw);
    y1 = random(-hw, hw);
    y2 = random(-hw, hw);
    col1 = getCol();
    col2 = getCol();
    col3 = getCol();
    angle = int(random(4)) * HALF_PI;
  }
  void show() {
    noStroke();
    push();
    translate(x + hw, y + hw);
    rotate(angle);
    fill(col1);
    square(0, 0, w);
    noStroke();
    fill(col2);
    circle(0, 0, w-1);
    fill(col3);
    beginShape();
    vertex(-hw, -hw);
    vertex(-hw, hw);
    bezierVertex(x1, y1, x2, y2, hw, -hw);
    vertex(-hw, -hw);
    endShape();
    pop();
  }
}

//-----------------------------------------------------------

class Grid {
  float x, y, w, c;
  int cw;
  Grid(float x, float y, float w, float c) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.c = c;
    cw = int(w/c);
  }
  void show() {
    noStroke();
    fill(#ffffff);
    for (float i = x; i <= x + w; i += c) {
      for (float j = y; j <= y + w; j += c) {
        circle(i, j, 2);
      }
    }
  }
}

正方形を敷き詰めて、中身はベジェ曲線を使って正方形の角から角へ曲線を結んだ。
正方形、曲線、円がたまたま同じ色だったりとか、隣り合う形がたまたま繋がったりして面白い形が出ておるわ。

ベジェ曲線でいうとこんなゲームがあって

これで遊んでたらベジェ曲線描けるようになった。ベジェ曲線をよくわからなかった頃は車を描く問題で諦めるっていうのを10回ぐらい繰り返していて、でもある日急にできるようになった。
車が描けるようになってからはそのあとはもうさくさくクリアっすわ。

今回の作品はベジェ曲線描けるかどうかあまり関係ない気もするけどね。

特に何かに使いたくてやった訳ではないけれど結果的に自分で画像作る時に役立っている。

ゲーム感覚でできるって強いよ。

Happy coding!!

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