Processing

8. 繰返し

プログラム的な繰返しを用いて、同じ図形を並べたりすると、プログラムを用いたヴィジュアルらしいものに近づきます。

for文で繰返し描く

繰返しを実現する方法の1つがfor文を用いることです。あらかじめ繰返しの回数が決まっている(分かっている)場合にはfor文が便利です。

for文の書式は、以下のようになります。

for( 変数の初期値; 繰返しを続ける条件; 変数の増分 ) {
繰返したい処理;
}

例えば、以下のように書くと、線を21本、描くことができます。

size( 500, 500 );
background( 255 );

stroke( #339933 );

for( int i = 0; i < 21; i++ ) {
  line( 50 + i * 20, 50, 50 + i * 20, 450 );
}

6行目は、良く使う書き方の1つと思ってもらって構いません。繰返し回数を変える場合は、21の部分を書き換えます。

どのように繰返すかを定めるのがforの後の()の中ですが、まず繰返しの回数を数える変数iを作りその値を0にしています。

続く;の後に繰返しを終える条件を書きますが、i < 21とは、iが21より小さい間だけ、繰返しを行うという意味になります。

続く;の後には、繰返しのたびにiの値をどの程度増やすのかを書きます。i++と書けばiの値が1ずつ増えていきます。

続く{から、8行目の}までの間に処理を記述すれば、その処理が繰返されます。iの値が0から21より小さい間繰返されますので、結果として21回繰返されることになります。iの値は0から始まり、繰返しのたびごとに1ずつ増えていきます。

7行目、ここでは繰返す処理として直線を描いています(ここでは1行ですが、複数行書くこともできます)。

直線を描くline()命令の座標を指定する際、直線の始点のx座標と終点のx座標の指定にiの値を利用し、繰返しのたびごとに描かれる位置を変えています。

50 + i * 20の値は、iが0の時には50に、iが1のときには70にと、繰返しのたびごとに20ずつ増えていきます。結果として20ピクセル間隔の線が、21本引かれることになります。

for文で直線を繰返し描く

for文を書き間違え、繰返しの回数を数える変数(上記の場合はi)を繰返しのたびに増やすのを忘れたり、繰返しを終える条件を指定し間違えると、いつまでも終わりのこない繰返しを作ってしまうことになります。そうするとプログラムが止まらなくなりますので、とても注意が必要です。

ページの先頭へ↑

2重のfor文で描く

for文の中にfor文を書くことができます。図形を縦横に並べるのにも利用できます。

size( 500, 500 );
background( 255 );

stroke( #339933 );

for( int i = 0; i < 9; i++ ) {
  for( int j = 0; j < 9; j++ ) {
    ellipse( 50 + j * 50, 50 + i * 50, 40, 40 );
  }
}

6〜10行目のfor文の中に、もう一つのfor文(7〜9行目)が入っており、どちらも9回、繰返しています。

内側、7〜9行のfor文は、前述の線を描くのと同様に、0〜8まで変化する変数jを円のx座標を決めるのに利用して、繰返しの度に、x座標を50ずつ増やしながら描画しています。結果として横1行に9個の円が、このfor文で描かれています。

外側のfor文では、変数iが0〜8まで変化しますが、iは円のy座標を決めるのに利用されています。結果として、1行9個の円が9行描かれることになります。

2重のfor文で図形を並べる

ページの先頭へ↑

while文で描く

繰返しを実現する方法にはwhile文というのもあります。繰返しの回数は決まっておらず、ある条件になるまで繰返しを行いたい場合などに便利です。

while文の書式は、以下のようになります。

whole( 条件 ) {
繰返したい処理;
}

例えば、以下のように書くと、円を画面の端に達するまで、描くことができます。

size( 500, 500 );
background( 255 );

stroke( #339933 );
noFill();

int drawPointX = 0;

while( drawPointX <= 500 ) {
  ellipse( drawPointX, 250, 40, 40 );
  drawPointX = drawPointX + 20; 
}

7行目、円を描くx座標の値を格納する変数drawPointXを作り0を代入しています。

9行目、whieの後の()の中で繰返しを終える条件を設定しています。drawPointX <= 500とは、drawPointXの値が500以下の場合、という意味になりますので、drawPointXの値が500以下の場合に繰返しが実行され、500(画面横幅のサイズ)より大きくなったら繰返しが終わります。

10行目で円を描画しています。円を描くx座標はdrawPointXで指定をしています。

11行目、drawPointXの値を変えています。=がある場合、その右側が先に計算され左側に代入されますので、この場合、現在のdrawPointXの値に20が足され、改めてdrawPointXに代入されます。つまりこのように書くと、drawPointXの値が20増えることになります。

drawPointXの値は繰返しのたびに20ずつ増えていき、いつか500を超えます。その時に繰返しが終わります。結果として、画面の端まで円が描かれることになります。

while文で円を画面の端まで描く

for文同様、while文を書き間違え、繰返しを終える条件を指定し間違えたり(上記の場合は9行目)、drawPointXのような条件に使われる変数を作らなかったり、値を増やし忘れたりすると(上記の場合は11行目)、いつまでも終わりのこない繰返しを作ってしまうことになります。そうするとプログラムが止まらなくなりますので、とても注意が必要です。

ページの先頭へ↑

< 7. 色の指定

9. 条件分岐 >