Pythonista3で簡単なゲームをつくるために,ビリヤードのように平面上で円がぶつかる際の円の動きについて,高校時代のチャート式代数・幾何をひっぱりだしてきて考えてみた。奥付を見ると,昭和61年の改訂新版第2刷とあるが,まぁこんな基本的なことは30年やそこらでは変わらないであろう。
下の図のように,
で移動する円O
1と静止している円O
2が衝突するとする。また,衝突した瞬間の円O
1の中心の座標は(x
1, y
1),円O
2の中心を座標を(x
2, y
2)とする。
「チャート式基本事項6ベクトルの表し方」より
任意のベクトルは,ただ一通りに,下の式の形で表される。
(とは実数) |
円の中心と中心を結んだ向きのベクトルを
,
に垂直なベクトルを
とすると,下の式で表すことができる。
「チャート式基本事項10垂直条件」より
よって,, とすると,
|
上の垂直条件は,
,
のときにも成り立つ。よって,下の図のように,以下の式が成り立つ。
とすると,以下の式が成り立つ。
,
とすると,
これらを
と
について解くと,下のようになる。
(1)の両辺にXをかけると,
(2)の両辺にYをかけると,
(3)と(4)の両辺を足すと,
よって,
がもとめられれば,
で
も簡単に求められるため,わざわざ
を求める必要はないが,一応続きを書いてみる。
同様に,(1)の両辺にYをかけると,
(2)の両辺にXをかけると,
(5)から(6)の両辺を引くと,
よって,
円がぶつかったときに,静止している円O
2に
の速度ベクトルが加わり,移動している円O
1から
の速度ベクトルが失われる。
両方の円が移動している場合は,入れ替えて考え,速度ベクトルを合成する。