講義資料の予習

以下は演習問題2の基になる第1回資料から引用した「練習: アニメーションで色相環」のプログラムである.前回に引き続き、関数を導入しプログラムを見やすく、また再利用可能なように改良する。

int r = 150;          // 円の半径
int theta;            // 回転角
int dTheta = 5;       // 回転角の増分/点
float rad;            // 回転角
int d = 8;            // 点の直径
float x, y;           // 点の中心座標

void setup() {
  size(400, 400);
  noStroke();
  background(255, 255, 255);
  fill(0, 0, 0);
  theta = 0;
  colorMode(HSB, 360, 100, 100);  // 色の指定をHSBに
                                  // (色相 0-360, 彩度 0-100, 明度 0-100)
}

 void draw() {
  rad = radians(theta);
  x = r * cos(rad);
  y = -r * sin(rad);
  fill(theta % 360, 100, 100);
  println("theta % 360 =" + (theta % 360));
  println("x=" + x);
  println("y=" + y);
  ellipse(x + 200, y + 200, d, d);      // 楕円の中心のx,y座標、幅、高さ
  theta = theta + dTheta;
}

問題を確認すると,「1つの小さな円を描くときに、その小さな円の中心のx座標、y座標、色相を求めるが、 そのそれぞれを関数を用いて求めるようにしなさい。 関数名は pointX(), pointY(), pointHue() とする。 適切な引数、戻り値とすること。」とある.

上記プログラムでx座標,y座標,色相を求めている箇所は以下である.

  x = r * cos(rad);               //x座標を計算(r * cos(rad))して変数xに代入する
  y = -r * sin(rad);              //y座標を計算(-r * sin(rad))して変数yに代入する
  fill(theta % 360, 100, 100);    //色相を計算(theta % 360)してfill関数の第1引数に使用する

x座標の計算を例にすると,今x座標の計算に使用されているグローバル変数は半径rと角度radである.これらは関数化する際には引数で与えられる必要がある(これから作成する関数pointX内でグローバル変数であるxとradを使ってしまうと,pointX関数だけをコピーしても他のプログラムに持っていっても動かないから(かっこよく言えば,関数の再利用ができないから)).

関数名がpointX,引数が2つ(半径,角度)指定できるようする必要があることから,pointX関数が完成したと仮定すると,

 x = r * cos(rad);  

x = pointX(r, rad);

となる.

次に実際にpointX関数を作る.関数名はpointX,引数は2つfloat型を受け取るので,

void pointX(float circleR, float circleRad){
 
} 

となる.

しかし,今回は戻り値が必要となる.前回は戻り値がない関数を扱っていたため,関数の最初に戻り値がないことを示すため「void」と記述していた.今回は,実際にdraw関数内でpointX関数が使用される際は,

x = pointX(r, rad);

なので,pointX関数は引数で渡された半径と角度を基に,計算結果であるX座標を戻り値として返し,その返した値が変数xに代入されることになる.

そこで,pointX関数は計算結果であるX座標をfloat型の戻り値で返す,ということを示すために,

float pointX(float circleR, float circleRad){
 
} 

となる.

計算結果を戻り値として返すためには,

float pointX(float circleR, float circleRad){
    //circleRとcircleRadからX座標を計算する 
    return 計算したX座標;
} 

とする.これでpointX関数の完成である.pointXが完成したとするとプログラムは以下のようになる.

int r = 150;          // 円の半径
int theta;            // 回転角
int dTheta = 5;       // 回転角の増分/点
float rad;            // 回転角
int d = 8;            // 点の直径
float x, y;           // 点の中心座標

void setup() {
  size(400, 400);
  noStroke();
  background(255, 255, 255);
  fill(0, 0, 0);
  theta = 0;
  colorMode(HSB, 360, 100, 100);  // 色の指定をHSBに
                                  // (色相 0-360, 彩度 0-100, 明度 0-100)
}

 void draw() {
  rad = radians(theta);
  x = pointX(r, rad);
 
 



  y = -r * sin(rad);
  fill(theta % 360, 100, 100);
  println("theta % 360 =" + (theta % 360));
  println("x=" + x);
  println("y=" + y);
  ellipse(x + 200, y + 200, d, d);      // 楕円の中心のx,y座標、幅、高さ
  theta = theta + dTheta;
}

float pointX(float circleR, float circleRad){
    //circleRとcircleRadからX座標を計算する 
    return 計算したX座標;
}

関数に戻り値がある場合,一連のプログラムの流れは以下のようになる.Δ肪躇佞擦茵

flow.png

添付ファイル: fileflow.png 1013件 [詳細]

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