講義資料の予習

以下のプログラムを見やすくすることを考えると,

// 定数
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);  
}

としたい.

ボールを動かす関数を作ることを考える.

  1. 関数名はboundBallとする
  2. 戻り値は不要
  3. 引数には動かす対象のボールを指定できるようにする

1と2から,

void boundBall(){
 
}

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

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

となる.

再帰

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

void setup(){
  int x = 5;
  int y;
  y = factorial(x);
  println(x + "!=" + y);
}

int factorial(int x){
  if (x <= 0)
    return 1; 
  else 
    return x * factorial(x-1);
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-19 (水) 15:34:37