#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;
}