複数の粒子が落下
複数の円が上部から落下します。ひとつ(落下)は垂直落下で、x座標は変化しませんでしたが、このプログラムの円は、x方向へ速度をもって落下します。このような落下運動をする粒子のクラスParticleFallを定義して、そのオブジェクトをn(200)個生成して使っています。
コンストラクタ ParticleFall(float xpos, float ypos, float sx, float sy, float gra, float rr) xpos: x座標 ypos: y座標 sx : x方向速度 sy : y方向速度 gra : y方向加速度 rr : 粒子の半径 メソッド void ballFall() 粒子の位置の計算 void drawObj() 粒子の描画
クリックで停止⇔再開
【リスト FallParticle】 int r = 2; // 円の半径 float g =2; float x, y; // 位置 float dy, dx; // 移動速度 PBall[] ball; int n = 200; // 円の数 void setup() { size(150, 150); //描画するための画面 fill(0); ball = new PBall[n]; x = width/2; for(int i=0; i<n; i++){ dx = random(-3.0, 3.0); // x速度は-2と2の間でランダム dy = random(0.1, 1.0); // y速度は0-2の間でランダム g = random(0.2, 1.0); // 重力は0-2の間でランダム // x座標,y座標,x速度,y速度,重力,半径を指定して粒子を作る ball[i] = new PBall(x, y, dx, dy, g, r); } } void draw() { background(255); //画面背景を白でクリア for(int i = 0; i<n; i++){ ball[i].ballFall(); ball[i].drawObj(); } }
【リスト クラスPBall】 class PBall { float x, y; // position float dx, dy; // velocities float r; // radius float gravity; // 重力加速度 float friction=0.9; //減衰 float orix, oriy; //最初の位置 float oridx, oridy; //最初の速度 PBall(float xpos, float ypos, float sx, float sy, float gra, float rr) { x = xpos; y = ypos; dx = oridx = sx; dy = oridy = sy; gravity = gra; r = rr; orix = x; oriy = y; //元の位置を覚えておく } void ballFall(){ dy = dy + gravity; //y方向には重力加速度が加わる y = y+dy; //y座標を動かす x = x+dx; //x座標を動かす if (y>height-r){//下の壁 y = height-r; //めり込み調整 dy = -dy * friction; //方向反転、減衰 if(abs(dy)<=g) { //ほぼ止まったどうかを判定 x=orix; y=oriy; //止まったら、再度落下 dx = oridx; //最初の速度に戻す dy = oridy; } }else if(y<r){//上の壁 y = r - (y-r); //めり込み調整 dy = -dy * friction; //移動方向反転、減衰 } if(x>width-r){ //右の壁 x = width-r; dx = -dx * friction; //方向反転、減衰 }else if(x<r){ //左の壁 x = r; dx = -dx * friction; //方向反転、減衰 } } void drawObj() { ellipse(x, y, 2*r, 2*r); } }