ジェネレーティブアートメモ

これは[Processing Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/processing)の15日目の記事です。



半年間、趣味として「ジェネレーティブアート」を Processing を用いて描いていました。
その中でよく使った文法をこの機会にまとめてみようと思い、 Advent Calendar 2017に参加させていただきました。



#変数
```java
void setup() {
  size(300, 300);
  noFill();//図形を塗りつぶさない
}
int a = 0;//変数を宣言する
void draw() {
  ellipse( 150, 150, a, a);
  a+=4;
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/06ee195a-4d1a-8021-1397-d3b5ade4ce92.png)

#繰り返し文
```java
void setup() {
  size( 300, 300);
  int r = 82;
  noFill();
　//繰り返し文を使う
  for (int i= 0; i < width; i += 20) {
    for (int k = 0; k < width; k += 20) {
      ellipse( i , k , r , r);
      
    }
  }
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/996f6366-922a-4ea0-116a-243d66d572b3.png)

#配列
```java
//配列を宣言する
int[] x = new int[4];
int[] y = new int[4];
int[] sx = new int[4];
int[] sy = new int[4];
void setup() {
  size( 300, 300);
  x[0] = 33;    y[0] = 300;
  x[1] = 245;   y[1] = 240;
  x[2] = 40;    y[2] = 10;
  x[3] = 224;   y[3] = 110;
  sx[0] = 1;    sy[0] = -1;
  sx[1] = -1;   sy[1] = -1;
  sx[2] = 1;    sy[2] = 1;
  sx[3] = -1;   sy[3] = 1;
  strokeWeight(0.1);
}
void draw() {

  for (int i=0; i < 4; i++) {
    for (int k=0; k < 4; k++) {
      line(x[i],y[i],x[k],y[k]);
    }
  }
  for (int i=0; i < 4; i++) {
    x[i] += sx[i];
    y[i] += sy[i];
  }
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/2d0679bf-f213-cfae-39af-bfa4ba250157.png)

#三角関数
```java
void setup() {
  size( 300, 300);
  strokeWeight(1);//点の大きさを１にする
}
float a, b, c, x, y ,r1 ,r2, h = 150;
void draw() {
  b=sin(r2);
  a=b*h+1;
  c=cos(r2);
  x=a*sin(r1+c);
  y=a*cos(r1+c);
  point(150+x, 150+y);
  r1 +=0.11;
  r2 +=0.2;
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/fd422dd9-7ecc-0a37-c397-9f9a8743b03d.png)

#乱数

```java
void setup() {
  size( 300, 300);
  noStroke();//図形の外線に色を設定しない
}
void draw() {
  fill(random(255));
  bezier(random(300),random(300),random(300),random(300),
         random(300),random(300),random(300),random(300));
}

```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/6ca752ba-ac40-5c6f-cf14-8562d909b835.png)



#カラーモード
```java

void setup() {
  size( 300, 300);
  colorMode(HSB);//カラーモードを変更する
  background(0);
  strokeWeight(10);

}
float r = 0, t = 0;
void draw() {
  stroke(frameCount%255,255,255);
  point(r*cos(t)+150,r*sin(t)+150);
  r+=0.1;
  t+=0.01;
}


```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/90e076e3-b1b1-bca6-e371-e790eadff44e.png)




#透過度
```java
void setup(){
  size(300,300);
  background(0); 
}
float t = 0;
void draw(){
 stoke(20,240,25,10);//透過度を設定する
 translate(width/2,height/2);
 float r = random(130);
 line( 130*sin(t), 130 * cos(t), r*sin(frameCount), r*cos(frameCount)  ); 
 t+=0.5;
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/4c88a417-5068-d035-3c87-381272c8fe2a.png)

#条件分岐

```java

void setup() {
  size( 300, 300);
  strokeWeight(3);
  background(0);

  for (int i = 0; i < 300; i += 20) {
    for (int k = 0; k < 300; k += 20) {
      stroke(i,k,255);
      float r = random(1);
      if(r>0.5) line(i,k,i+20,k+20);//条件分岐させる
      else      line(i,k,i-20,k+20);
      
    }
  }
}

```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/0c2605d6-e1ad-92e4-a625-462d5c6bda16.png)



#回転

```java
void setup() {
  size( 300, 300);
}
float a = random(-120,120);
float b = random(-120,120);
float c = random(-120,120);
float d = random(-120,120);
float e = random(-10,10);
float f = random(-10,10);
void draw(){
  fill(20,200,100);
  translate(width/2,height/2);
  rotate(frameCount);//回転させる
  triangle(a,b,c,d,e,f);
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/ea0e8b2c-f2cb-5d6d-3072-a37a80a2e95b.png)

#フェード
```java
void setup() {
  size(300, 300);
  strokeWeight(4);
}
float t;
void draw() {
 // background(20);
  translate(0, height/2);
  for (int i = 0; i < width; i++) {    
    stroke(i, 0, 255,70);
    t+=0.00098;
    point(i, 2*noise(t)*150-100);
  }
  stroke(10,10);
  fill(10,10);
  rect(0, -height/2,width,height);//画面全体をフェードさせる
　}
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/80741a66-7779-3952-ae86-059e62915ba9.png)


#ライブラリ

```java
import java.util.ArrayList;
import peasy.*;//ライブラリをインポートする
PeasyCam cam;
void setup() {
  size(300, 300, P3D);//３Dモードを使う
  cam = new PeasyCam(this, 500);
}
void draw() {
  background(30);
  for (int x=0; x < width; x +=50 ) {
    for (int y=0; y < width; y +=50 ) {
      for (int z=0; z < width; z +=50 ) {
        fill(x,y,z,150);
        stroke(z,y,x,200);
        pushMatrix();
        translate(x, y, z);
        box( 30 );
        popMatrix();
      }
    }
  }
}
```
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/205129/badd250c-5f67-07dd-3dac-6fa289bd3eb4.png)

---