Pythonista3で簡単なゲームをつくるために,ビリヤードのように平面上で円がぶつかる際の円の動きについて,高校時代のチャート式代数・幾何をひっぱりだしてきて考えてみた。奥付を見ると,昭和61年の改訂新版第2刷とあるが,まぁこんな基本的なことは30年やそこらでは変わらないであろう。
下の図のように,
![\vec{v_{1}}](./?action=common_tex_main&c=%_5Cvec%_7Bv_%_7B1%_7D%_7D)
で移動する円O
1と静止している円O
2が衝突するとする。また,衝突した瞬間の円O
1の中心の座標は(x
1, y
1),円O
2の中心を座標を(x
2, y
2)とする。
「チャート式基本事項6ベクトルの表し方」より
任意のベクトルは,ただ一通りに,下の式の形で表される。
( と は実数) |
円の中心と中心を結んだ向きのベクトルを
![\vec{a}](./?action=common_tex_main&c=%_5Cvec%_7Ba%_7D)
,
![\vec{a}](./?action=common_tex_main&c=%_5Cvec%_7Ba%_7D)
に垂直なベクトルを
![\vec{b}](./?action=common_tex_main&c=%_5Cvec%_7Bb%_7D)
とすると,下の式で表すことができる。
「チャート式基本事項10垂直条件」より
![\vec{a}\perp\vec{b}\;\Longleftrightarrow\;\vec{a}\cdot\vec{b}=0](./?action=common_tex_main&c=%_5Cvec%_7Ba%_7D%_5Cperp%_5Cvec%_7Bb%_7D%_5C%_3B%_5CLongleftrightarrow%_5C%_3B%_5Cvec%_7Ba%_7D%_5Ccdot%_5Cvec%_7Bb%_7D%_3D0)
よって, , とすると,
![a_{1}b_{1}+a_{2}b_{2}=0](./?action=common_tex_main&c=a_%_7B1%_7Db_%_7B1%_7D%_2Ba_%_7B2%_7Db_%_7B2%_7D%_3D0)
|
上の垂直条件は,
![b_{1}=a_{2}](./?action=common_tex_main&c=b_%_7B1%_7D%_3Da_%_7B2%_7D)
,
![b_{2}=-a_{1}](./?action=common_tex_main&c=b_%_7B2%_7D%_3D-a_%_7B1%_7D)
のときにも成り立つ。よって,下の図のように,以下の式が成り立つ。
![\vec{v_{1}}=(a,\;b)](./?action=common_tex_main&c=%_5Cvec%_7Bv_%_7B1%_7D%_7D%_3D(a%_2C%_5C%_3Bb))
とすると,以下の式が成り立つ。
![X=x_{2}-x_{1}](./?action=common_tex_main&c=X%_3Dx_%_7B2%_7D-x_%_7B1%_7D)
,
![Y=y_{2}-y_{1}](./?action=common_tex_main&c=Y%_3Dy_%_7B2%_7D-y_%_7B1%_7D)
とすると,
![\begin{eqnarray}a&=&kX&+&lY\;\cdots\;\text(1)\\b&=&kY&-&lX\;\cdots\;\text(2)\end{eqnarray}](./?action=common_tex_main&c=%_5Cbegin%_7Beqnarray%_7Da%_26%_3D%_26kX%_26%_2B%_26lY%_5C%_3B%_5Ccdots%_5C%_3B%_5Ctext(1)%_5C%_5Cb%_26%_3D%_26kY%_26-%_26lX%_5C%_3B%_5Ccdots%_5C%_3B%_5Ctext(2)%_5Cend%_7Beqnarray%_7D)
これらを
![k](./?action=common_tex_main&c=k)
と
![l](./?action=common_tex_main&c=l)
について解くと,下のようになる。
(1)の両辺にXをかけると,
![aX=kX^2+lXY\;\cdots\;\text(3)](./?action=common_tex_main&c=aX%_3DkX%_5E2%_2BlXY%_5C%_3B%_5Ccdots%_5C%_3B%_5Ctext(3))
(2)の両辺にYをかけると,
![bY=kY^2-lXY\;\cdots\;\text{(4)}](./?action=common_tex_main&c=bY%_3DkY%_5E2-lXY%_5C%_3B%_5Ccdots%_5C%_3B%_5Ctext%_7B(4)%_7D)
(3)と(4)の両辺を足すと,
![aX+bY=kX^2+kY^2](./?action=common_tex_main&c=aX%_2BbY%_3DkX%_5E2%_2BkY%_5E2)
よって,
![k](./?action=common_tex_main&c=k)
がもとめられれば,
![l\vec{b}=\vec{v_{1}}-k\vec{a}](./?action=common_tex_main&c=l%_5Cvec%_7Bb%_7D%_3D%_5Cvec%_7Bv_%_7B1%_7D%_7D-k%_5Cvec%_7Ba%_7D)
で
![l\vec{b}](./?action=common_tex_main&c=l%_5Cvec%_7Bb%_7D)
も簡単に求められるため,わざわざ
![l](./?action=common_tex_main&c=l)
を求める必要はないが,一応続きを書いてみる。
同様に,(1)の両辺にYをかけると,
![aY=kXY+lY^2\;\cdots\;\text(5)](./?action=common_tex_main&c=aY%_3DkXY%_2BlY%_5E2%_5C%_3B%_5Ccdots%_5C%_3B%_5Ctext(5))
(2)の両辺にXをかけると,
![bX=kXY-lX^2\;\cdots\;\text(6)](./?action=common_tex_main&c=bX%_3DkXY-lX%_5E2%_5C%_3B%_5Ccdots%_5C%_3B%_5Ctext(6))
(5)から(6)の両辺を引くと,
![aY-bX=lY^2+lX^2](./?action=common_tex_main&c=aY-bX%_3DlY%_5E2%_2BlX%_5E2)
よって,
![l=\frac{aY-bX}{X^2+Y^2}](./?action=common_tex_main&c=l%_3D%_5Cfrac%_7BaY-bX%_7D%_7BX%_5E2%_2BY%_5E2%_7D)
円がぶつかったときに,静止している円O
2に
![k\vec{a}](./?action=common_tex_main&c=k%_5Cvec%_7Ba%_7D)
の速度ベクトルが加わり,移動している円O
1から
![k\vec{a}](./?action=common_tex_main&c=k%_5Cvec%_7Ba%_7D)
の速度ベクトルが失われる。
両方の円が移動している場合は,入れ替えて考え,速度ベクトルを合成する。