問題1-1: のんびり歩く亀

亀は上から見ると、甲羅の他に足が4本と頭が1つ見える。 包含関係を使って、亀の姿を描きなさい。 足はすべて同じ形(つまり1つのクラス)とすること。

等速で下から上にゆっくり移動させること。 ウィンドウの上まで来ると止まるようにすること。

提出ファイル名: turtle.pde

問題1-1: のんびり歩く亀

参考

例示している亀の大きさと色は下記の通り。

色は colorMode(HSB, 360, 100, 100); の場合。

甲羅と足の位置は、亀本体の移動にあわせて移動する。 移動後の甲羅と足の位置は、本体の側で計算することも、甲羅や足の側で計算することもできるが、 いずれにしても本体の側から甲羅や足に情報を与える必要がある。

問題1-1: のんびり歩く亀

補足

余力のある人は、足を動かして前に進むように見せる方法を考えてみよう。 亀は両前足を同時に前に出すのだろうか...。

問題1-2: のんびり歩く亀たち

問題1-1の亀を3匹に増やしなさい。

提出ファイル名: turtles.pde

問題1-3: さわられるとしかたなく動く亀たち

問題1-2を変更し、亀の体のどこかにマウスカーソルが重なっている場合のみ、 亀が移動するようにすること。

ヒント: 体のパーツそれぞれで、カーソルが重なっているかを判定し、 その結果を集計する必要がある。 1つ1つのパーツが丸いので、ボールと同じ方法で判定することができる。

提出ファイル名: lazyTurtles.pde

問題2-1: 太陽のまわりを地球が回る

太陽(The Sun)のまわりを地球(The Earth)が回るアニメーションを作成しなさい。 太陽は動かなくてよい。 太陽と地球の関係は包含関係とすること。 なお、太陽と地球の大きさの比や軌道の半径、回転周期などの物理量は実際と異なってよい。

提出ファイル名: sunAndEarth.pde

問題2-1: 太陽のまわりを地球が回る - 前半部分の例

Sun theSun;

void setup() {
  size(480, 480);
  noStroke();
  colorMode(HSB, 360, 100, 100);
  theSun = new Sun(50, width / 2, height / 2);
}

void draw() {
  background(0, 0, 100);
  theSun.drawFigure();
  theSun.move();
}

class Sun {
  float d;                // 直径
  float x;                // 中心のx座標
  float y;                // 中心のy座標
  Earth theEarth;
  Sun(float d, float x, float y) {
    this.d = d;
    this.x = x;
    this.y = y;
    theEarth = new Earth(0.6 * d, 150);    // 直径および回転の半径を与える
  }
  void move() {
    theEarth.move(x, y);         // 地球を動かす (太陽の周りを回るので太陽の位置を与える)
  }
  void drawFigure() {
    theEarth.drawFigure();       // Earthオブジェクトに描画を指示
    fill(30, 100, 100);
    ellipse(x, y, d, d);         // 自分自身を描画
  }
}

問題2-1: 太陽のまわりを地球が回る

class Earth は自分で考えること。回転運動は第1週「アニメーションで色相環」と同様に回転角をフレームごとに増加させていく方法で実現できる。

回転の中心を原点(0, 0)、回転の半径を orbitRadius, 回転角を theta とすると、物体の位置 (x, y) は次のようになる。

  float rad = radians(theta);
  x =   orbitRadius * cos(rad);
  y = - orbitRadius * sin(rad);

回転の中心が原点ではなく (centerX, centerY) だとすると、次のようになる。

  float rad = radians(theta);
  x = centerX + orbitRadius * cos(rad);
  y = centerY - orbitRadius * sin(rad);

問題2-1: 太陽のまわりを地球が回る - 補足

前半部分の例では Earth のコンストラクタで太陽の位置を与えていたが、 太陽そのものを与えることもできる。

  Sun(float d, float x, float y) {
    this.d = d;
    this.x = x;
    this.y = y;
    theEarth = new Earth(0.6 * d, 150, this);    // 直径および回転の半径、太陽(の参照)を与える
  }

this は自分自身のオブジェクト、つまり太陽のオブジェクトを表す。

この場合には、太陽 Sun に getX, getY を用意しておき、 必要に応じて地球 Earth 側から情報を得ることができる。

問題2-2: 太陽のまわりを回る地球のまわりに月が回る

問題1-1の地球のまわりに月(The Moon)が回っているアニメーションを作成しなさい。 太陽は動かなくてよい。 太陽と地球、地球と月の関係は包含関係とすること。

提出ファイル名: sunAndEarthAndMoon.pde

問題2-2: 太陽のまわりを回る地球のまわりに月が回る - ヒント

class Sun は問題2-1と同じ。 太陽の立場からすれば、子分の地球が月を引き連れているかどうかは関知しない。

class Moon の動きは class Earth と同じだが、回転の中心が移動することだけが異なる。

1フレームごとの move の流れ

問題3: 首を振りながらのんびり歩く亀たち (Advanced)

問題 1-3 で登場した亀たちが、 以下の例のように首を振って前に進むようにしなさい。

提出ファイル名: headShakingLazyTurtles.pde

問題3: 首を振りながらのんびり歩く亀たち - ヒント