Processingで動的な配列からインスタンスを削除する。


タイトルはインスタンスに関する話ですが、実際にインスタンスを削除できると何ができるようになるのか?の例もつけて解説します。

processingで動的な配列にインスタンスを追加する場合、appendを使用すればよいのですが、配列の中の​特定のインスタンスだけを削除するコマンドは用意されていません。
そこで配列の一番最後のインスタンスを削除するコマンドである、shortenを使うと楽に除去できます。
方法は、配列の中の消したいインスタンスに、配列の一番最後のインスタンスの中身を入れてしまい、そのままshortenで配列の最後のインスタンスを消去するだけです。

以上で終わりなのですが、それではつまらないのでサンプルコードも貼っておきます。

球が飛び回り、それぞれの球に寿命を設定しています。寿命が尽きると配列からその球のインスタンスは除去されます。

サンプルコード

Ball[] st_arr = {};
int create=100;//最初に生まれる球の数

void setup() {
 size(1000, 1000);
 colorMode(RGB, 255, 255, 255, 100);
 background(0, 0, 0, 100);
 frameRate(60);
 float life=1000;//寿命
 for (int xpp=0; xpp<create; xpp++) {
   PVector v, p;
   p= new PVector(random(width), random(height));
   v= new PVector(random(20), random(20));

   Ball pp = new Ball(p, v, life);
   st_arr = (Ball[])append(st_arr, pp);
 }
}

void draw() {
 background(0, 0, 0);
 //st_arr=(Stems[])st_arr.sort();
 for (int i=0; i<st_arr.length; i+=1) {
   Ball pp = st_arr[i];
   pp.calculate();
   pp.display();
   if (pp.life_ex<0) {
     st_arr[i]=st_arr[st_arr.length-1];
     st_arr = (Ball[])shorten(st_arr);
   }
 }
}

class Ball {
 PVector v, p;
 float life_ex;
 Ball(PVector _p, PVector  _v, float _life) {
   v= _v;
   p = _p;
   life_ex=_life;
 }

 void calculate() {
   if (life_ex>0) {
     p.add(v);
     if ((p.x > width) || p.x < 0) {
       v.x *= -1;
     }
     if ((p.y > height) || p.y < 0) {
       v.y *= -1;
     }
     life_ex=life_ex-mag(v.x, v.y);
   }
 }

 void display() {   
   stroke(255, 255, 255);
   ellipse(p.x, p.y, 10, 10);
 }
}

球の寿命は一定であり、移動ベクトルの大きさで球の寿命の減少速度が変わります。もともとは人工生命を作るためのコードですのでこんな仕様に。
また面白いものができたら書く予定です。では。


この記事が気に入ったらサポートをしてみませんか?