[Processing] 클릭 포인트를 저장하고 아트 작품 그리기

vertex를 사용하여 동적 아트를 그립니다.





설명



라고해도 가볍게 동작 설명을

마우스를 클릭하면 점이 기울어집니다.
첫 번째 점은 마우스의 위치를 ​​목표로 계속 움직입니다.
선두 이외의 점은 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;
}

속편?



[프로세싱] 수수께끼 그리는 다이나믹 아트

좋은 웹페이지 즐겨찾기