0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Processing]クリック点を保存してアート作品を描く

Last updated at Posted at 2019-12-27

#vertexを使って動的アートを描く

Vertexer.gif

#説明
と言っても軽く動作説明をば

マウスクリックすると点がうたれます
先頭の点はマウスの位置を目指して移動し続けます
先頭以外の点は1つ前の(先輩にあたる点)の位置を目指します
⇒常に動くアートの出来上がり

先頭以外の点が若干近道をして目指すので、時間が経つと収束していくのが見ていて楽しいです
(^▽^)/

先頭の点がマウスの位置に到達すると、先頭の点は消え、そして...

#プログラム
拡張子本当は.pdeですけど、javaにした方が色ついて見やすいかなって

Vertexer.java

//リストから削除するかどうかboolean
boolean listReMove = false;

// beginShape() に入れる変数
int Mode_Number = 0;

//下の表をもとに図形の値を代入
int[] num = {11, 9, 16, 10, 18, 20};

//任意にリセットできるように変数として保持
int colorNum = 0;

String[] texter = 
  {
  "TRIANGLE_FAN", "TRIANGLES", "QUADS", 
  "TRIANGLE_STRIP", "QUAD_STRIP", "DEFAULT"
};

//連続してモード変更しないようにタイマー機能
int timer = 0;

/*
  //シェイプモード int の値
 TRIANGLE_FAN   // 11
 TRIANGLES      // 8,9
 QUADS          // 16,17
 TRIANGLE_STRIP // 10
 QUAD_STRIP     // 18
 LINES          // 5
 DEFAULT        // 20
 DEFAULT_NOFILL // 50
 NOFILL_CLOSE   // 51
 */

class Vertex {
  float x, y;
  color c;

  //一つ前のVertex
  Vertex prev;

  //prevの位置X,Y
  float prevX;
  float prevY;

  //一度だけロック
  boolean onceLock = true;

  Vertex(float x, float y, int r, Vertex pre) {
    this.x = x;
    this.y = y;
    c = color(r*2, 200 - r*2, 255 - r*4, 50);
    prev = pre;
  }

  void Move() {

    if (onceLock) {
      onceLock = false;

      if (prev != null) {
        //一つ前のVertexに向かう
        prevX = prev.x;
        prevY = prev.y;
      } else 
      {
        //prevがない(リストの先頭)はマウスに向かう
        prevX = mouseX;
        prevY = mouseY;
      }
    }

    //位置関係から移動
    x += sign(prevX - x);
    y += sign(prevY - y);

    //prevがかつていた位置に来たら、
    //再度prevの位置を確かめる
    if ((prevX - x) == 0 && (prevY - y) == 0) {
      //ロック解除
      onceLock = true;

      //先頭(prevがない)時、マウスと距離が離れてない時
      if (prev == null) {
        if (mouseX - x == 0 && mouseY - y == 0) {
          //リストの先頭削除 boolean 解除
          listReMove = true;
        }
      }
    }
  }
}

ArrayList<Vertex> vlist = new ArrayList<Vertex>();


void setup() {
  //size(1800, 800, P2D);
  fullScreen();
  frameRate(30);
  noStroke();
  textFont(createFont("MS Gothic", 48, true));
  textSize(50);
  textAlign(CENTER);
}

void draw() {
  background(255);

  beginShape( num[Mode_Number % num.length] );
  for (Vertex v : vlist) {
    v.Move();
    fill(v.c);
    vertex(v.x, v.y);
  }

  endShape();

  //モード表示
  text(texter[Mode_Number % texter.length], width/2, 50);

  timer++;

  //リストの先頭削除するかどうか if 文
  if (listReMove) {
    listReMove = false;

    //リストの長さを保つため if 文
    if (vlist.size() > 2 && timer > 60) {
      timer = 0;

      vlist.remove(0);
      //リストの先頭になる Vertex を先頭仕様に設定
      Vertex ver = vlist.get(1);
      ver.onceLock = true;
      ver.prev = null;

      // beginShape() モード変更
      Mode_Number++;
    }
  }
}

void mousePressed() {
  Vertex v ;

  //リストのサイズごとに場合分け
  if (vlist.size() == 0) {
    v = new Vertex(mouseX, mouseY, 0, null);
  } else {
    v = new Vertex(mouseX, mouseY, colorNum++, vlist.get(vlist.size()-1));
  }

  vlist.add(v);
}

void keyPressed() {
  //カラー数値リセット
  colorNum = 0;
}

//正なら1、負なら-1、0なら0を返す
float sign(float a) {
  if (a > 0) return 1;
  else if (a == 0) return 0;
  else return -1;
}

#続編?
[Processing]なぞって描くダイナミックアート

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?