前へ 上へ 次へ


Processing入門9


配列(その1) 

雨粒とか鳥や魚の群とかのようにたくさんの同じものを動かしたい場合がある。二個程度なら、以下のように書いてもいいだろう

 int x1,x2;
 void setup()
 {
   size(600,600);
   x1 = 10; x2 = 30;
 }
 void draw() 
 { 
   background(0);
   x1 += 1;
   ellipse(x1,x1,20,20);
   x2 += 1;
   ellipse(x2,x2,20,20);
 }

しかし、10個だとか100個だとかいうときにこれをやっていたのでは大変だ。そこで、配列というものを使う。以下は20個の点を動かすプログラム

 int[] x;
 void setup()
 {
   int i;
   x = new int[20];
   size(600,600);
   for(i = 0; i < 20; ++i){x[i] = 20*i;}
 }
 void draw() 
 { 
   int i;
   background(0);
   for(i = 0; i < 20; ++i){
     x[i] += 1;
     ellipse(x[i],x[i],20,20);
    }
 }

もっともこのプログラムは配列を使う必要もないのだけど。

変数を数字をいれる箱とするなら、配列はその箱を並べて番号をつけたようなものだ。小学校の下駄箱や居酒屋の下足箱だと思っておくと、それほどはずれていない。たとえば、整数をいれる箱を並べて、全体に x という名前をつけることにする。ただの変数のときは int x; と宣言すればよかったが、配列の場合は

 int[] x;

[] をつけて宣言する。int[] が変数をいれる配列という意味。ただし、これは「xという名前は整数の配列だよ」と名前を宣言しただけなので、これだけでは配列は使えない。配列を実際に作るのが new という命令。このときに箱を何個並べるかを指定する。20個の箱を使うなら

 x = new int[20];

とする。それぞれの箱は、番号がつけられている以外は普通の変数と同じだと思ってよい。使う際には何番の箱かを指定する。普通はこれを「配列の要素」と呼ぶ。ただし、番号は0から始まることに注意。今の場合、20個の要素は x[0], x[1], x[2], .... , x[18], x[19] となる。こんなことをして何がうれしいのかというと、要素の番号も変数で指定してよいという点だ。たとえば、x[3] = 10; は整数変数 i を使って

 i = 3;
 x[i] = 10;

のように書いてもよい。これを使って、すべての要素に 1 を代入したければ

 for(i = 0; i < 20; ++i){ x[i] = 0;}

とできる。また、すべての要素に要素番号の二倍の数を代入したければ

 for(i = 0; i < 20; ++i){ x[i] = i*2;}

でよい

配列

たくさんの変数をひとまとめにして番号をつけたもの。それぞれの変数は配列の要素と呼ばれる。要素の番号は0から始まることに注意

int[] x;

xは整数の配列の名前だよという宣言

x = new int[20];

実際にxとして、20個の要素を持つ配列を作る

fig27.jpg

なお、宣言と配列を作るのは同時にできて

 int[] x = new int[20];

でもよい。

以下は色の指定に配列を使う例

 int[] x = new int[20];
 int[] r = new int[20];
 int[] g = new int[20];
 int[] b = new int[20];
 void setup()
 {
   int i;
   size(600,600);
   for(i = 0; i < 20; ++i){ x[i] = 20*i;}
   for(i = 0; i < 20; ++i){
      r[i] = 10*i; 
      g[i] = (10*i + 100)%256; 
      b[i] = (10*i + 200)%256;
   }
 }
 void draw() 
 { 
   int i;
   background(0);
   for(i = 0; i < 20; ++i){
     x[i] += 1;
     fill(r[i],g[i],b[i]);
     ellipse(x[i],x[i],20,20);
    }
 }

もちろん、forを使わずにひとつひとつの要素に数値を代入してもよい。大変なので9個にしておくと、たとえば

 int[] x = new int[9];
 int[] y = new int[9];
 void setup()
 {
   int i;
   size(600,600);
   x[0] = 0; y[0] = 0;
   x[1] = 20; y[1] = 20;
   x[2] = 40; y[2] = 40;
   x[3] = 60; y[3] = 60;
   x[4] = 80; y[4] = 80;
   x[5] = 60; y[5] = 80;
   x[6] = 40; y[6] = 80;
   x[7] = 80; y[7] = 60;
   x[8] = 80; y[8] = 40;
 }
 void draw() 
 { 
   int i;
   background(0);
   for(i = 0; i < 9; ++i){
     x[i] += 1; y[i] += 1;
     ellipse(x[i],y[i],20,20);
    }
 }

以下は横に動く円が壁で跳ね返る例。このくらいになると、配列を使うご利益もはっきりしてくると思う。ここでは整数配列を三つ使っている。「条件分岐」の1個だけ動かす場合と比較せよ

 int[] x,y,lr;
 void setup()
 {
   int i;
   x = new int[10];
   y = new int[10];
   lr = new int[10];
   size(400,400);
   for(i = 0; i<10; ++i){
    y[i]  = 40*i;
    lr[i] = 1;
   }
   x[0] = 30; x[1] = 60; x[2] = 40; x[4] = 300; x[5] = 150;
   x[6] = 350; x[7] = 100; x[8] = 200; x[9] = 180;
   noStroke();
 }
 void draw() 
 { 
   int i;
   background(0);
   for(i = 0; i < 10; ++i){
      x[i] += lr[i];
     if (x[i] == 385) { lr[i] = -1;}
     else if (x[i] == 14) { lr[i] = 1;}
     ellipse(x[i],y[i],30,30);
   }
 }
 

前へ 上へ 次へ