processing으로 눈송이를 만들어 보자.

2192 단어 processing

소개



만나서 반갑습니다. 아다치입니다.

이번에는 Processing을 사용하여 클릭하면 모서리의 수가 늘어나는 눈결정의 프로그램을 공개하려고 합니다.

주의



Processing에 대해서는 Processing3.4의 Java 모드를 사용하고 있습니다.

code



코드는 다음과 같습니다.
ArrayList<Koch>koch=new ArrayList<Koch>();
ArrayList<Koch>kochSTK=new ArrayList<Koch>();

void setup() {
  size(800, 800);
  strokeWeight(0);
  stroke(#ffffff);
  fill(255);
  noFill();
  int n=6;
  for (int i=0; i<n; i++) {
    float d=i*TWO_PI/n;
    float r=width*0.37;
    koch.add(new Koch(width/2+cos(d)*r, height/2+sin(d)*r, 
      width/2+cos(d+TWO_PI/n)*r, height/2+sin(d+TWO_PI/n)*r));
  }
  noLoop();
}

void mousePressed() {
    redraw();
}

void draw() {
  background(0);

  beginShape();
  for (Koch k : koch) {
    k.update();
    kochSTK.addAll(k.mkKoch());
  }
  endShape();
  koch.clear();
  koch.addAll(kochSTK);
  kochSTK.clear();

  println("step : "+frameCount);
}

public class Koch {
  float sx, sy, ex, ey;
  public Koch(float sx, float sy, float ex, float ey) {
    this.sx=sx;
    this.sy=sy;
    this.ex=ex;
    this.ey=ey;
  }

  public void update() {
    vertex(sx, sy);
    vertex(ex, ey);
  }

  public ArrayList<Koch>mkKoch() {
    ArrayList<Koch>koch=new ArrayList<Koch>();
    float l=sqrt((sq(sx-ex)+sq(sy-ey)))/3;
    float a=atan2(ey-sy, ex-sx)+PI/3;
    float x=lerp(sx, ex, 1./3.);
    float y=lerp(sy, ey, 1./3.);
    float xx=x+cos(a)*l;
    float yy=y+sin(a)*l;
    koch.add(new Koch(sx, sy, x, y));
    koch.add(new Koch(x, y, xx, yy));
    x=lerp(sx, ex, 2./3.);
    y=lerp(sy, ey, 2./3.);
    koch.add(new Koch(xx, yy, x, y));
    koch.add(new Koch(x, y, ex, ey));
    return koch;
  }
}

실행 결과



↑클릭 6회했을 때의 눈의 결정

참고문헌



쓰라네의 일기 : h tp : // 고드름. 는 bぉ. jp/엔트리/2015/03/01/002827

좋은 웹페이지 즐겨찾기