#author("2016-10-19T15:32:55+09:00","default:kyo-in","kyo-in")
#author("2016-10-19T15:34:37+09:00","default:kyo-in","kyo-in")
*講義資料の予習 [#i0f87ff4]
以下のプログラムを見やすくすることを考えると,

 // 定数
 final float gravity = 9.8 / 60;  // <-- 1/60秒あたりの重力加速度
 // 変数
 float y;                         // <-- ボールのy座標
 float vy;                        // <-- ボールの速度のy成分 
 
 void setup() {
   size(200, 480);
   noStroke();
   fill(0, 0, 0);
   y = 0;
   vy = 0;
 }
 
 void draw() {
   vy += gravity;    // <-- 速度に重力加速度を加算する
   y += vy;          // <-- ボールが速度ぶん移動する 
 
   background(255, 255, 255);
   ellipse(100, y, 40, 40);
 }

ボールを描いている,
 ellipse(100, y, 40, 40);
は,引数に直接値を指定しており,プログラムの見やすさとしてはよろしくない.そこで,変数を使用し,
 ellipse(x, y, d, d);
とする.
~
~
~

課題を進めていくと,ボールのために

 float x;  //x座標
 float y;  //y座標
 float vx; //x方向速度
 float vy; //y方向速度

という4つのグローバル変数ができる.しかしながら,再度プログラムの見やすさという観点からすれば,

 float ボールの情報;

として,まとめたい.そこで配列の出番である.

 float[] ball0;

ただし,配列はnew演算子を使用し,メモリ上に実際に値を記憶する領域を作らなければ使えない.また,プログラム中にball0[0]と書かれても,この値が何を示しているのか分からないので,添え字に定数を使用する.

 ...
 final int X = 0;
 final int Y = 1;
 final int VX = 2;
 final int VY = 3;
 float[] ball0;
 ...
 
 void setup(){
   ...
   ball0 = new float[4];
   ball0[X] = ...;
   ball0[Y] = ...;
   ...
   ...
 }
~
~
~

さらに課題を進めていくと,

 void draw(){
   background(0, 0, 100); //画面を白(HSB)でぬりつぶす
 
   //ボールを動かす
   ...
   ...
   ...
   ...
 
   //ボールを描く
   ellipse(ball0[X], ball0[Y], d, d);  
 }

となっていく.またプログラムを見やすくるのであれば,自分で関数を作り,
 void draw(){
   background(0, 0, 100); //画面を白(HSB)でぬりつぶす
 
   //ボールを動かす
   ボールを動かす(動かすボール);
 
   //ボールを描く
   ellipse(ball0[X], ball0[Y], d, d);  
 }
としたい.

ボールを動かす関数を作ることを考える.
+関数名はboundBallとする
+戻り値は不要
+引数には動かす対象のボールを指定できるようにする

1と2から,

 void boundBall(){
  
 }

3は,今,1個のボールの情報を1つのfloatの配列にまとめているので,引数(入力)にはfloatの配列を指定できるようにしなければならない.よって,

 void boundBall(float[] b){
   //ボールbを動かす処理
   ...
   ...
   ...
 }

となる.

*再帰 [#t839a26e]
基本的な再帰を使ったプログラム(階乗を計算する).
基本的な再帰を使ったプログラム(階乗を計算する).使いどころによっては,プログラムを見やすく短くすることができる.

 void setup(){
   int x = 5;
   int y;
   y = factorial(x);
   println(x + "!=" + y);
 }
 
 int factorial(int x)
 {
 int factorial(int x){
   if (x <= 0)
     return 1; 
   else 
     return x * factorial(x-1);
 }

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