YAS's VB.NET Tips
 
Pythonista活用
Pythonista活用 >> 記事詳細

2019/01/18

円が衝突したときの動き

Tweet ThisSend to Facebook | by:YAS
 Pythonista3で簡単なゲームをつくるために,ビリヤードのように平面上で円がぶつかる際の円の動きについて,高校時代のチャート式代数・幾何をひっぱりだしてきて考えてみた。奥付を見ると,昭和61年の改訂新版第2刷とあるが,まぁこんな基本的なことは30年やそこらでは変わらないであろう。

 下の図のように,\vec{v_{1}}で移動する円O1と静止している円O2が衝突するとする。また,衝突した瞬間の円O1の中心の座標は(x1, y1),円O2の中心を座標を(x2, y2)とする。

 
 「チャート式基本事項6ベクトルの表し方」より

 任意のベクトルは,ただ一通りに,下の式の形で表される。

   \vec{p}=k\vec{a}+l\vec{b} (klは実数)

 円の中心と中心を結んだ向きのベクトルを\vec{a}\vec{a}に垂直なベクトルを \vec{b} とすると,下の式で表すことができる。

   \vec{v_{1}}=k\vec{a}+l\vec{b} 

「チャート式基本事項10垂直条件」より


   \vec{a}\perp\vec{b}\;\Longleftrightarrow\;\vec{a}\cdot\vec{b}=0

 よって,\vec{a}=(a_{1},\;b_{1})\vec{b}=(a_{2},\;b_{2}) とすると,

   a_{1}b_{1}+a_{2}b_{2}=0


 上の垂直条件は, b_{1}=a_{2}b_{2}=-a_{1}のときにも成り立つ。よって,下の図のように,以下の式が成り立つ。


   \vec{v_{1}}=k\vec{a}+l\vec{b}
   \vec{a}=(x_{2}-x_{1},\;y_{2}-y_{1})
   \vec{b}=(y_{2}-y_{1},\;-(x_{2}-x_{1}))

 \vec{v_{1}}=(a,\;b)とすると,以下の式が成り立つ。
   
   \begin{eqnarray}a&=&k(x_{2}&-&x_{1})&+&l(y_{2}&-&y_{1})\\b&=&k(y_{2}&-&y_{1})&-&l(x_{2}&-&x_{1})\end{eqnarray}

 X=x_{2}-x_{1}Y=y_{2}-y_{1}とすると,

   \begin{eqnarray}a&=&kX&+&lY\;\cdots\;\text(1)\\b&=&kY&-&lX\;\cdots\;\text(2)\end{eqnarray}

 これらをklについて解くと,下のようになる。

   (1)の両辺にXをかけると,
   aX=kX^2+lXY\;\cdots\;\text(3)
   (2)の両辺にYをかけると,
   bY=kY^2-lXY\;\cdots\;\text{(4)}

   (3)と(4)の両辺を足すと,
   aX+bY=kX^2+kY^2

   よって,
   k=\frac{aX+bY}{X^2+Y^2}

 kがもとめられれば,l\vec{b}=\vec{v_{1}}-k\vec{a} で l\vec{b} も簡単に求められるため,わざわざ l を求める必要はないが,一応続きを書いてみる。

   同様に,(1)の両辺にYをかけると,
   aY=kXY+lY^2\;\cdots\;\text(5)
   (2)の両辺にXをかけると,
   bX=kXY-lX^2\;\cdots\;\text(6)

   (5)から(6)の両辺を引くと,
   aY-bX=lY^2+lX^2

   よって,
   l=\frac{aY-bX}{X^2+Y^2}

 円がぶつかったときに,静止している円O2に k\vec{a} の速度ベクトルが加わり,移動している円O1から k\vec{a} の速度ベクトルが失われる。
 両方の円が移動している場合は,入れ替えて考え,速度ベクトルを合成する。
20:00 | 投票する | 投票数(0) | コメント(0)