このホームページで公開している グラフィックス・クラスライブラリ GLIBW32 に添付してあるサンプルソースにある key6.cpp はカラーボールの衝突運動のアニ メーション・プログラムです。ソースのコメントにあるようにボールの衝突の扱い は手抜き計算です(まったく非現実的なボール)。 サンプルファイルは実装関数の機能確認のためのもので、できるだけ小さいプログ ラムにしたいためにそのようにしました。 ところが、きちんとプログラムを書いてみると、なかなかおもしろいボールの振 る舞いを見ることができます。 ここで取り扱うのは、四角形の領域内に幾つかの自由なボールを走らせ、壁やボ ール同士の衝突を考えます。衝突はすべて完全弾性衝突とします。つまり無重力空 間内でのボールの理想的な衝突現象を(まじめに)考えます。 以下では予備知識として高校の1,2年で習う程度の物理の基本的な概念と、平 面の代数・幾何の計算知識を仮定します。正確に理解するためには、紙と鉛筆を使 って実際に図形を描いて計算してみることをお薦めします(少し面倒ですが内容は シンプルです)。 3つのステップで話を進めます。まず、現象についての物理的概念を整理し、次 にそれを純粋な平面幾何の問題に焼き直します。最後はプログラムの実装で、ボー ルの運動についてのクラスの設計を行います。衝突現象 まずは、ボールが壁にぶつかる場合を考えましょう。衝突が完全弾性衝突だと下 図のようにボールは跳ね返ります。
完全弾性衝突では、衝突の前後でボールの持つエネルギーは変化しません。従って、 跳ね返る速さVは衝突前と同じです。速度ベクトルを壁に対して水平方向と垂直方 向とに分けて考えると、水平成分は変化しなくて、垂直成分は反転します。従って、 図の中の黒丸で示すように入射角度と反射角度が等しくなります。この図のような 衝突では、角度θ(横軸のx軸から測る)でボールが角度0(ゼロ)の壁に衝突す ると、跳ね返るボールの角度は、 2×0−θ=−θ, となります。いろんな場合の図形を描いてみると分かりますが、一般に、角度φの 壁に対してボールが角度θでぶつかると、 2φ−θ, の角度で跳ね返ります。 次に、ボール同士の衝突を考えます。今度は、壁とは違って衝突し合う2つのボ ールの動きを同時に追っかけなければならないので、複雑なように見えます。 しかし、すぐ後で分かるように、2つのボールの間の衝突にはとても簡単で見通 しを良くする性質があります。 [注] 煩いことをいうと、上の表現は正しくありません。完全弾性衝突とは、壁に 垂直な方向の速度成分の比(反発係数)が1ということであって、水平成分とは 無関係なものです。衝突の前後で、速度の水平成分がどのように変化するかは、 ボールと壁の接触がなめらかである(滑る)か粗である(擦る)かといった性質 によって決まるものです。粗であれば、衝突で擦りあってエネルギーを失います。 ここでは、接触がなめらかであることを暗黙に前提しています。