日常の進捗

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

2軸で動く点

f:id:takawo:20171231135753g:plain

blendMode(ADD)を使いつつ背景をフェードさせ動きを効果的に見せる方法が分かっていなかったが,今回のようにblendMode(BLEND)と組み合わせると行けるのが分かった.

全く関係ないが,久しぶりにWeb開発などをしようと思いCodekitというアプリケーションで作業をしようと思ったのが運の尽きで,作業フォルダを書類(Document)フォルダに設定した所書類フォルダに入っていた文書などが全て消えた.特に大事だと思うものはなかったがProcessingのファイル類が消えた.

コード

ArrayList<Point> points = new ArrayList<Point>();
int num = 200;

void setup() {
  fullScreen(P2D);
  colorMode(HSB, 360, 100, 100, 100);
  noCursor();
  for (int i = 0; i < num; i++) {
    points.add(new Point());
  }
  background(0, 0, 0);
}

void draw() {
  blendMode(BLEND);
  fill(0, 0, 0, 10);
  noStroke();
  rect(0, 0, width, height);
  blendMode(ADD);  
  for (Point p : points) {
    p.update();
    p.draw();
  }

  float d = dist(mouseX, mouseY, pmouseX, pmouseY);
  if (d > 10) {
    for (Point p : points) {
      p.resetTarget();
    }
  }
}



class Point {
  PVector pos;
  PVector original;
  PVector target;
  boolean isVertical;
  boolean isHorizontal;
  color c;
  float speed = random(0.05, 0.1);
  int nTimes = 0;
  Point() {
    float x = random(width);
    float y = random(height);
    pos = new PVector(x, y);

    original = new PVector(width/2, height/2);
    resetTarget();

    c = color(random(360), 80, 100, 50);

    if (random(1) < 0.5) {
      isVertical = true;
    } else {
      isHorizontal = true;
    }
  }

  void update() {
    float dy = target.y-pos.y;
    float dx = target.x-pos.x;
    nTimes += 1;
    if (isVertical && abs(dy) > 3) {
      pos.y += (target.y-pos.y)*speed;
    } else if (isVertical && abs(dy) < 3 && nTimes > 200) {
      pos.y = target.y;
      isVertical = false;
      isHorizontal = true;
      nTimes = 0;
    }
    if (isHorizontal && abs(dx) > 3) {
      pos.x += (target.x-pos.x)*speed;
    } else if (isHorizontal && abs(dx) < 3 && nTimes > 200) {
      pos.x = target.x;
      isVertical = true;
      isHorizontal = false;
      resetTarget();
      nTimes = 0;
    }
  }

  void draw() {
    strokeWeight(8);
    stroke(c, 50);
    point(pos.x, pos.y);
  }

  void resetTarget() {
    float tx = mouseX+random(-200, 200);
    float ty = mouseY+random(-200, 200);
    target = new PVector(tx, ty);
  }
}