#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)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS