演習問題: 問題1

重力によって落下し、床・天井・壁面によってバウンドする1個のボールを考える。 ボールの色が、通常は水色(色相: 180)で、 マウスカーソルがボールの上にあるときのみ赤(色相: 0)に変化するようにしなさい。

重力加速度、反発係数の値、ボールの現在位置と速度の入った4要素の配列を用意すること、 そのの配列を参照する変数(仮に ball0 とする)を引数に与えると、 その配列の内容を更新し、ボールの位置・速度の情報を次の時刻(フレーム)のものに更新する関数 boundBall(ball0) を使うことは、 前回の問題6と同様とする。

提出ファイル名: ballColorChangable.pde

演習問題: 問題1 - ヒント

マウスカーソルがボール上にあるかは、 マウスカーソルの位置(mouseX, mouseY)とボールの中心との距離が、ボールの半径以内かを調べればよい。 2点間の距離は三平方の定理より求まる。

マウスカーソルがボール上にあるか否かは関数を利用して判断すること。

演習問題: 問題1 - ヒント

参考: 円の中心が原点の場合

点 (x, y) が、原点中心で半径 r の円に含まれているかどうかは、 原点からの距離を比較すればよい。 原点からの距離が r 以下であれば、点は円内にある。

両辺を2乗しても成り立つので

点(x,y)が上記の条件を満たしているか調べればよい。

演習問題: 問題1 - 前準備

// 定数
final int X = 0;
final int Y = 1;
final int VX = 2;
final int VY = 3;
final float vx0min = -7;            // vxの初期値の下限
final float vx0max = 5;             // vxの初期値の上限
final float vy0min = 4;             // vyの初期値の下限
final float vy0max = 15;            // vyの初期値の上限
final int fps = 60;                 // 1秒間あたりのフレーム数
final float gravity = 9.8 / fps;    // 1フレームあたりの重力加速度
final float elas = 0.98;            // 反発係数
final float d = 40;                 // ボールの直径
final float hueMax = 360.0;         // 色相の最大値

// 変数
float[] ball0;                      // ボールの x, y, vx, vy を要素とする配列を参照する変数

void setup() {
  frameRate(fps);
  size(480, 480);
  noStroke();
  colorMode(HSB, hueMax, 100, 100);
  fill(0, 0, 0);
  ball0 = new float[4];                         // ボールの x, y, vx, vy を要素とする配列
  ball0[X]  = random(d / 2, width - d / 2);     // x
  ball0[Y]  = random(d / 2, height / 5);        // y
  ball0[VX] = random(vx0min, vx0max);           // vx
  ball0[VY] = random(vy0min, vy0max);           // vy
}

演習問題: 問題1 - 穴埋め

void draw() {
  background(0, 0, 100);

  // ここを考える

  ellipse(ball0[X], ball0[Y], d, d);
}

// 必要な関数は適宜追加

void boundBall(float[] ball) {
  ball[X]  += ball[VX];          // ボールが速度ぶん移動する
  ball[VY] += gravity;           // 速度のy成分に重力加速度を加算する
  ball[Y]  += ball[VY];          // ボールが速度ぶん移動する
  if (ball[X] < d / 2) {
    ball[VX] = - ball[VX] * elas;
    ball[X] = d / 2;
  } else if (ball[X] > width - d / 2) {
    ball[VX] = - ball[VX]  * elas;
    ball[X] = width - d / 2;
  }
  if (ball[Y] > height - d / 2) {
    ball[VY] = - ball[VY] * elas;
    ball[Y] = height - d / 2;
  } else if (ball[Y] < d / 2) {
    ball[VY] = - ball[VY] * elas;
    ball[Y] = d / 2;
  }
}

演習問題: 問題2

問題1 を変更し、 ボールにマウスカーソルを持って行くと、ボールの動きを止めることができるようにしなさい。 マウスカーソルをボールから離せば、再び元の速度で動き始めるものとする。

提出ファイル名: ballCatchable.pde

演習問題: 問題3 (Advanced)

問題2 のボールの数を複数(例えば6個)にしなさい。

前回の問題7 と同様に、複数のボールの初期位置と初期速度が入った 2次元配列 balls を用意し、 それぞれのボールを boundBall(balls[i]) で動作させるようにしなさい。

提出ファイル名: ballsCatchable.pde

演習問題: 問題3 - 前準備

// 定数
final int X = 0;
final int Y = 1;
final int VX = 2;
final int VY = 3;
final float vx0min = -7;            // vxの初期値の下限
final float vx0max = 5;             // vxの初期値の上限
final float vy0min = 4;             // vyの初期値の下限
final float vy0max = 15;            // vyの初期値の上限
final float fps = 60.0;             // 1秒間あたりのフレーム数
final float gravity = 9.8 / 60;     // 重力加速度を1フレームあたりにしたもの
final float elas = 0.98;            // 反発係数力
final float d = 40.0;               // ボールの直径
final float hueMax = 360.0;         // 色相の最大値
final int nBalls = 6;               // ボールの個数

// 変数
float[][] balls;                    // 複数のボールの位置と速度を保持する2次元配列を参照する変数

void setup() {
  frameRate(fps);
  size(480, 480);
  noStroke();
  colorMode(HSB, hueMax, 100, 100);
  fill(0, 0, 0);
  balls = new float[nBalls][4];                      // ボールの x, y, vx, vy を nBalls 個分
  // 初期位置と初期速度をボールごとに決定(乱数で)
  for (int i = 0; i < balls.length; i++) {
    balls[i][X]  = random(d / 2, width - d / 2);     // x
    balls[i][Y]  = random(d / 2, height / 5);        // y
    balls[i][VX] = random(vx0min, vx0max);           // vx
    balls[i][VY] = random(vy0min, vy0max);           // vy
  }
}

演習問題: 問題3 - 穴埋め

void draw() {
  background(0, 0, 100);

  // ここを考える

}

// 必要な関数は適宜追加

void boundBall(float[] ball) {
  ball[X]  += ball[VX];          // ボールが速度ぶん移動する
  ball[VY] += gravity;           // 速度のy成分に重力加速度を加算する
  ball[Y]  += ball[VY];          // ボールが速度ぶん移動する
  if (ball[X] < d / 2) {
    ball[VX] = - ball[VX] * elas;
    ball[X] = d / 2;
  } else if (ball[X] > width - d / 2) {
    ball[VX] = - ball[VX]  * elas;
    ball[X] = width - d / 2;
  }
  if (ball[Y] > height - d / 2) {
    ball[VY] = - ball[VY] * elas;
    ball[Y] = height - d / 2;
  } else if (ball[Y] < d / 2) {
    ball[VY] = - ball[VY] * elas;
    ball[Y] = d / 2;
  }
}

演習問題: 問題4 (Advanced)

これまでの演習問題を参考に、 動く物体に対してマウスカーソルの位置でなんらかの働きかけをする、 独自のインタラクティヴなアニメーションを作成しなさい。

物体の形状はボールでなくてよいし、変化してもよい。

提出ファイル名: ObjectsAndMouseCursor.pde