ー 点群 ー  

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

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

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

 

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 = point.directionBetween(preMouseX, preMouseY, mouseX, mouseY);

if(preMouseX != mouseX && preMouseY != mouseY){
p[i].push(f*0.8, dire);
}

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

点群を動かす大きな仕組みは前回前々回と同じです.

今回は点を動かすのを今までの「マウスと点自身」ではなく「マウスの動いた方向」にしています.
つまりalwaysの中での点の動く方向を計算している
double dire = point.directionBetween(preMouseX, preMouseY, mouseX, mouseY);
にて動く方向を(preMouseX, preMouseY)から(mouseX, mouseY)へと,つまり,以前のマウスの位置から今回のマウスの位置への方向を計算しています.ちなみに(preMouseX, preMouseY)は前回alwaysが実行されたときのマウスの座標が入っています.

そして,そのままそれを点の動かす方向としたのでは,マウスが移動していないときにdirectionBetweenが返す値「0」にも反応してしまうため,実際に点を動かす(押す)段階で
if(preMouseX != mouseX && preMouseY != mouseY){
p[i].push(f*0.8, dire);
}

と記述することで,マウスが移動したときだけ押すようにしています.

このようにして,マウスの動きになびくような動きを生成しました.