#author("2019-05-21T23:49:43+09:00","default:qua","qua") 「変数」のページにあるプログラム #author("2019-05-21T23:52:17+09:00","default:qua","qua") #navi(Processing/1.はじめに) * 1-9 繰り返し [#yb84f5a5] [[変数>Processing/1.はじめに/8.変数]]のページにあるプログラム float cx=200; float cy=100; float r=50; beginShape(); vertex(cx + r * sin(radians( 0)), cy - r * cos(radians( 0))); vertex(cx + r * sin(radians( 72)), cy - r * cos(radians( 72))); vertex(cx + r * sin(radians(144)), cy - r * cos(radians(144))); vertex(cx + r * sin(radians(216)), cy - r * cos(radians(216))); vertex(cx + r * sin(radians(288)), cy - r * cos(radians(288))); endShape(); float cx=200; float cy=100; float r=50; beginShape(); vertex(cx + r * sin(radians( 0)), cy - r * cos(radians( 0))); vertex(cx + r * sin(radians( 72)), cy - r * cos(radians( 72))); vertex(cx + r * sin(radians(144)), cy - r * cos(radians(144))); vertex(cx + r * sin(radians(216)), cy - r * cos(radians(216))); vertex(cx + r * sin(radians(288)), cy - r * cos(radians(288))); endShape(); であるが、vertexから始まる5行はとても似ていることに気づくだろう。それぞれの行は角度を0, 72, 144, 216, 288度に変えて同じ計算を行っている。 角度を表す変数 th を用いてこれを少し書き換えると、次のようになる。intは整数を表す型である。 float cx=200; float cy=100; float r=50; int th=0; beginShape(); vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; endShape(); float cx=200; float cy=100; float r=50; int th=0; beginShape(); vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; endShape(); th = th + 72; はthの値を72だけ増やすことを表すので、これが実行されるたびに、thの値は0, 72, 144, 216, 288となり、最初のスケッチと同じ動作をすることがわかるだろう。 このスケッチを眺めると、全く同じ記述が5回繰り返されていることに気づく。こういった繰り返しを並べるのは、格好悪いし、間違いのもとである。Processingには、同じ動作を繰り返すための記述方法が用意されている。 float cx=200; float cy=100; float r=50; int th = 0; int i; beginShape(); for( i=0; i<5; i++ ){ vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; } endShape(); float cx=200; float cy=100; float r=50; int th = 0; int i; beginShape(); for( i=0; i<5; i++ ){ vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; } endShape(); ここで、for( i=0; i<5; i++ ){ } は、{ }の中のプログラムを5回繰り返して実行する。これをforループという。もう少し正確にいうと、まず、iに0が代入され、{ }の中のプログラムを実行し、i++でiの値を1だけ大きくする。そして、i<5が成り立たなくなったら繰り返しを終了する。 したがって、上のスケッチのfor...{ から }までの部分は、次の動作を行うのと同等である。 i=0; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=1; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=2; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=3; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=4; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=5; i=0; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=1; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=2; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=3; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=4; vertex(cx + r * sin(radians(th)), cy - r * cos(radians(th))); th = th + 72; i=5; このiの値も計算に用いることができる。thはi*72と表されるので、もう少し簡潔に書くことができる。 float cx=200; float cy=100; float r=50; beginShape(); for( int i=0; i<5; i++ ){ vertex(cx + r * sin(radians(i*72)), cy - r * cos(radians(i*72))); } endShape(); float cx=200; float cy=100; float r=50; beginShape(); for( int i=0; i<5; i++ ){ vertex(cx + r * sin(radians(i*72)), cy - r * cos(radians(i*72))); } endShape(); Forループは2つ以上入れ子にして用いることができる。 int i, j; size( 400, 200 ); for( i=1; i<=19; i++ ){ for( j=1; j<=9; j++ ){ circle( i*20, j*20, j+8 ); } } int i, j; size( 400, 200 ); for( i=1; i<=19; i++ ){ for( j=1; j<=9; j++ ){ circle( i*20, j*20, j+8 ); } } このプログラムは、i=1,2,...,19, j=1,2,...,9に対して点(i*20, j*20)を中心とする直径j+8の円を描く。 #ref(http://www.ist.aichi-pu.ac.jp/lab/qua/~qua/pbl/processing/img/1-9-1.png)