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