演習問題: 問題1

前回の問題3(fishTurning2.pde)をもとに、魚を3匹にし、3種類の水深で横に泳ぐようにしなさい。 魚1匹の姿を描画する関数 drawFish() を引き続き利用すること。 引数は、魚の中央の座標と、魚の形状の情報を格納している配列(への参照)とする。

提出ファイル名: fishTurning3.pde

演習問題: 問題1 ヒント

魚が複数 → 中心座標や向きといった情報も魚の数だけ保持

演習問題: 問題1 ヒント

魚の形状は 1匹分がすでに配列 int[] なので、配列を参照する変数の配列 int[][] を考える。

// 変数
int[][] fish;                        // 現在の魚の形状
// 変数の初期値
fish = new int[3][];                 // 配列を参照する int[] を 3匹分
for (int i = 0; i < 3; i++) {
  fish[i] = fishToRight;             // fish[i] は 変数 fishToRight と同じ配列を参照
}

演習問題: 問題2

第1回の演習問題 問題1 で、点(小さな円)を円周上に動かし大きな円を描いた。 1つの小さな円を描くときに、その小さな円の中心のx座標、y座標、色相を求めるが、 そのそれぞれを関数を用いて求めるようにしなさい。 関数名は pointX(), pointY(), pointHue() とする。 適切な引数、戻り値とすること。

提出ファイル名: extendedColorCircleFunctions.pde

演習問題: 問題2 (穴埋め)

定数は必要があれば追加すること。

// 定数
final float circleRadius = 150;   // 円の半径
final float dTheta = 5;           // 回転角 [degree] の増分/1フレーム
final float pointDiameter = 8;    // 点の直径
// 変数
float centerX;                    // ウィンドウの中心のx座標
float centerY;                    // ウィンドウの中心のy座標
float theta;                      // 回転角 [degree]

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

void draw() {
  float radTheta = radians(theta);                       // 回転角 [radian]

  // 関数を使って x 座標を求める
  // 関数を使って y 座標を求める
  // 関数を使って色相を求め、fill() で色を指定する

  ellipse(x + centerX, y + centerY, pointDiameter, pointDiameter);
  theta = theta + dTheta;
}

// ここに関数の定義を書く

演習問題: 問題3

問題2で、x座標とy座標で位相をずらすと、リサージュ図形になる。 必要な関数を改訂しなさい。 位相のずれの値も引数で与えること。

提出ファイル名: lissajousFigure.pde

参考: 位相のずれδの例

y = sin(θ)
x = cos(θ - δ)

演習問題: 問題3 (穴埋め)

前準備

定数は必要があれば追加すること。

// 定数
final float circleRadius = 150;   // 円の半径
final float dTheta = 5;           // 回転角 [degree] の増分/1フレーム
final float dDelta = 360.0 / 32;  // 位相差 [degree] の増分/1フレーム
final float pointDiameter = 8;    // 点の直径
// 変数
float centerX;                    // ウィンドウの中心のx座標
float centerY;                    // ウィンドウの中心のy座標
float theta;                      // 回転角 [degree]
float delta;                      // 位相差 [degree]

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

演習問題: 問題3 (穴埋め)

void draw() {
  float radTheta = radians(theta);                       // 回転角 [radian]
  float radDelta = radians(delta);                       // 位相差 [radian]

  // 関数を使って x 座標を求める
  // 関数を使って y 座標を求める
  // 関数を使って色相を求め、fill() で色を指定する

  ellipse(x + centerX, y + centerY, pointDiameter, pointDiameter);
  theta = theta + dTheta;
  delta = delta + dDelta;
}

// ここに関数の定義を書く

演習問題: 問題4

あらかじめ指定された身長の 7人の人物を並べて表示する。 左端から背の高い順に並ぶように、順番を入れ替えてから表示しなさい。 searchMaximum を使うこと。

提出ファイル名: sortedHumanSequenceSearchMax.pde

演習問題: 問題4

ヒント(再掲)

「例題: 最も背の高い人を先頭に」の方法で左端の人を確定させ、 残りの人たちについても同じ方法で(残りの範囲の)左端の人を確定させ、 と繰り返していくとよい (単純選択ソート)。

演習問題: 問題4 (穴埋め)

// 定数
final int x0 = 50;                          // 人の中心の x座標の初期値
final int y = 300;                          // 人の足元の y座標
final int dx = 50;                          // 人の中心線間の距離
final int humanBodyWidth = 20;              // 体の幅
final int faceDiameter = 30;                // 顔の直径
final int[] humanBodyHeight = new int[] {   // 胴体の長さ; 人数は7名
  145, 186, 176, 168, 186, 156, 172
};

void setup() {
  size(400, 400);             // ウィンドウのサイズ
  background(255, 255, 255);  // 背景色(白)
  noStroke();                 // 輪郭線を無効に
  
  // 人の列を背の高い順に並び替える
  ...

  // 人の列を描く
  fill(0, 0, 0);                                                     // 塗る色 (黒)
  ...

}

演習問題: 問題5 (Advanced)

問題4 の解答をアニメーションにし、徐々に背の高い順に並ぶ様子を可視化しなさい。 searchMaximum を使うこと。

提出ファイル名: beingSortedHumanSequenceSearchMax.pde

演習問題: 問題5 (穴埋め)

// 定数
final int x0 = 50;                          // 人の中心の x座標の初期値
final int y = 300;                          // 人の足元の y座標
final int dx = 50;                          // 人の中心線間の距離
final int humanBodyWidth = 20;              // 体の幅
final int faceDiameter = 30;                // 顔の直径
final int[] humanBodyHeight = new int[] {   // 胴体の長さ; 人数は7名
  145, 186, 176, 168, 186, 156, 172
};
// 変数
int p;                                      // 注目範囲の左端の位置

void setup() {
  size(400, 400);             // ウィンドウのサイズ
  background(255, 255, 255);  // 背景色(白)
  noStroke();                 // 輪郭線を無効に
  frameRate(1);               // 1秒1フレーム
  p = 0;
}  

void draw() {
  background(255, 255, 255);  // 背景色(白)
  // 最も背が高い人の位置を求める
  ...

  // 入れ替え
  ...

  // 人の列を描く (正しい位置に移動した人は色を変えること)
  ...

  // 並び替えが完了していたら draw の呼び出しを停止
  ...
}