ー 点群 ー  

今回は前回のひものような動きの仕組みを踏まえて,点群の動きを作ってみましょう.
一つ一つが同じ法則を持っていて,それが多数になったときに,そこに新しい動きが見えてきます。

動きはこのようになります.

そしてソースコードはこうなります.

 

point p[];

[setup, 400, 400]{
p = new point[100];
for(int i = 0; i < p.length; ++i){
int x = i % 10;
int y = i / 10;
p[i] = new point(100+x*20, 100+y*20);
}
}

[paint]{
clearAll();
for(int i = 0; i < p.length; ++i){
fillOval(p[i], 10, 10);
}
}

[always]{
for(int i = 0; i < p.length; ++i){

double dist = p[i].distanceTo(mouseX, mouseY);
double f = 0;
if(dist < 100) f = 100-dist;

double dire = p[i].directionTo(mouseX, mouseY)+Math.PI;

p[i].push(f*0.3, dire);

int x = i % 10;
int y = i / 10;
p[i].pushTo(100+x*20, 100+y*20);
}
}

まず前回と同じように
point p[]; で点群 p を準備し,それをsetup内の
p = new point[100];
for(int i = 0; i < p.length; ++i){
int x = i % 10;
int y = i / 10;
p[i] = new point(100+x*20, 100+y*20);
}
によって初期化しています.具体的には100個の点を準備して,縦横それぞれ10個並べようと考えているので,
int x = i % 10;
横位置(iを10で割ったあまり,つまり何列目か)を計算し,
int y = i / 10;
で縦位置(iを10で割った値,つまり何行目か)を計算し,
p[i] = new point(100+x*20, 100+y*20);
で,100という位置を基準としてそこから20ピクセルの間隔で並べていっています.

そして
[paint]{
clearAll();
for(int i = 0; i < p.length; ++i){
fillOval(p[i], 10, 10);
}
}
部分でpのそれぞれの場所で●を描画しています.

動きの記述ですが,動きは
マウスとの距離が近いほど強く離れるが,普段はホームポジションに戻ろうとしている
としました.これをalwaysの部分で処理しています。
まず,マウスとの距離が近いほど強く離れるに関しては
double dist = p[i].distanceTo(mouseX, mouseY);
double f = 0;
if(dist < 100) f = 100-dist;
double dire = p[i].directionTo(mouseX, mouseY)+Math.PI;
p[i].push(f*0.3, dire);
で実現しています。
double dist = p[i].distanceTo(mouseX, mouseY);
で点とマウスまでの距離を測ります。そして,
double f = 0;
if(dist < 100) f = 100-dist;
で,その距離が100より小さければfに100からその距離を引いた値,つまり,近ければ大きな値(100〜0)が入り,100より大きければ0がはいります.
そして
double dire = p[i].directionTo(mouseX, mouseY)+Math.PI;
で,点からマウスまでの方向を調べて,今回はマウスとは反対の方向に押されるので,Math.PIを加算して向きを逆にしています.
そして
p[i].push(f*0.3, dire);
によって点をfの30%の力でマウスとは反対の方向に押しています.

そして普段はホームポジションに戻ろうとしている動きに関しては
int x = i % 10;
int y = i / 10;
p[i].pushTo(100+x*20, 100+y*20);
で,実現しています.これはsetup内の点の位置の定義と同じように位置(x, y)を計算して,
その場所に点を押すという処理です.

このようにして,マウスと近ければ,マウスから離れる方向に押されているが普段はホームポジションに戻ろうとしている動きが出来ました.