日常の進捗

主に自分のための,行為とその習慣化の記録

三角形の辺の上を移動しながら結ぶ線

リファレンスのGIFアニメーションTwitterのタイムラインで見て,なんとなく書けそうと思って書いてみた.書けた.

コード

int num = 50;
float r = 270;
int current = 0;
ArrayList<PVector> triangle = new ArrayList<PVector>();
ArrayList<PVector> points = new ArrayList<PVector>();
// setup関数 : 初回1度だけ実行される
void setup() {
  //frameRate(1);
  size(960, 540); // ウィンドウサイズを960px,540pxに
  colorMode(HSB, 360, 100, 100); // HSBでの色指定にする
  smooth(); // 描画を滑らかに
  for (int i = 0; i < 3; i++) {
    PVector tp = new PVector(cos(TWO_PI * i/3f)*r, sin(TWO_PI * i/3f)*r);
    triangle.add(tp);
  }
  int n = 0;
  for (int i = 0; i < num * 3; i++) {
    if (i>0 && i%num == 0) {
      n++;
    }
    PVector t1 = triangle.get(n%3);
    PVector t2 = triangle.get((n+1)%3);
    PVector p = PVector.lerp(t1, t2, (float(i)%num)/float(num));
    points.add(p);
  }
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  noStroke();
  fill(0, 0, 0, 50);
  rect(0, 0, width, height);
  translate(width/2, height/2+50);
  rotate(PI/6);
  noFill();
  strokeWeight(2);
  stroke(frameCount%360, 40, 100);
  for (int n = current; n < current + num/3; n++) {
    PVector c1 = points.get(n%(num*3));
    PVector c2 = points.get((n+num)%(num*3));
    line(c1.x, c1.y, c2.x, c2.y);
  }
  current++;
  strokeWeight(4);
  stroke(0,0,100);
  for (PVector p : points) {
    point(p.x, p.y);
  }
}

リファレンス