ソフトウェア開発したい日記

「面白い!」と思った頭の体操や、数学の問題を載せていきます
その他ロードバイクででかけた先の写真や、ソフト開発のメモ等

自由落下のあとの跳ね返り

2010年04月30日 22時40分56秒 | ソフト開発日記
ものすごく簡単だと思い込んでいたけれど、
(実際簡単に感じる人は多いと思いますが)
ボールの自由落下のあと、ポーンポーンと減衰しながら跳ね返る
あのありがちなシミュレーションに思いのほかてこずってしまったので
それに関するメモ。


高さy0の位置から初速度v0でボールを投げ上げ(落下させ)、
t秒経過したときのボールの速度vと位置yは、それぞれ

v = v0 - G * t
y = y0 + v0 * t - G * t * t / 2

地面に接触したとき(y<0)の速度も、その時の時刻tによって v = v0 - G * t
跳ね返り係数をeとすると、地面に接触した瞬間、
初速度e * vで地面から鉛直打ち上げ運動になる(はず。)

このとき注意するのは、
跳ね返って打ち上げに運動になった瞬間に
時間tもリセットするということ。

あれ?合ってるのかなこれ
よくわかんなくなったのでまた明日いろいろ考えることに

ボールと壁の当たり判定

2010年04月29日 18時33分33秒 | ソフト開発日記
ボールと壁の当たり判定についてのメモ。
今まで適当にやってたけど、接触判定は
壁の法線ベクトルを利用するのがいいらしい。

まず、ボールが等速運動する場合、
p(x, y)を現在の座標
v(vx, vy)を現在の速度
p'(x', y')を次フレームの座標
v'(vx', vy')を次フレームの速度
とすると、

p' = p + v
v' = v

と表される。
ここで加速度a(ax, yx)がある場合は、

v' = v + a

となる。
どちらも1フレームの間では等速運動しているように考えている(離散化)。
こう考えることで、計算が楽になるとのこと。

次いで、壁との接触判定について。
ボールと壁が当たっているか否かは、下式を満たすか否かで判定できる。

(ボールの半径)>(ボールの中心座標と壁との距離)

この式を満たすとき、ボールは壁にめり込んだ状態
すなわち、壁と接触している。
ここで壁の座標を、次のように正規化された方程式で表すことにする。

ax + by + d = 0 (a^2 + b^2 = 1)

このとき、この壁と円の中心座標p(p_x, p_y)との距離Lは次のとおり。

L = ap_x + bp_y + d

すなわち、ap_x + bp_y + d = r となっているとき、ボールと壁は接触している。
今からtフレーム後の位置p'は

p'(p'_x, p'_y) = p(p_x, p_y) + v(v_x, v_y)t
        = (p_x + v_x * t, p_y + v_y * t)

であり、tフレーム後に接触するならば、

ap'_x + bp'_y + d = r

これらよりtを求めると

t = - (ap_x + bp_y + d - r) / (av_x + bv_y)

となる。
接触は t <1 のときに行えばよい。 しかしながら、大量のボールに関してすべて毎度毎度この判定をしていたら
かなりもっさりとしたプログラムになってしまう。

そこで使う方法の1つが、壁の法線ベクトルと。
まず壁の法線ベクトルと、ボールの速度ベクトルの内積を計算する。
すなわち、av_x + bv_y を求める。

この値が0より大きいとき、ボールは壁の法線と同方向に
0より小さいとき、ボールは壁の法線と逆方向に(つまり壁方向に)移動している。
つまり、壁の接触判定は av_x + bv_y <0 のときだけおこなえばよいと。 また、av_x + bv_y = 0 のときは壁に平行に進んでいることになり
このときも接触判定をおこなう必要はなし。

次はボール同士の衝突とかについて・・。

ボールの弾性衝突

2010年04月28日 20時38分49秒 | ソフト開発日記
物理エンジンもどきを作る課題がだされたので、
まずは基本っぽいボールの弾性衝突の勉強から復習を兼ねてコツコツと

パラメータ
ボール1・・・質量 m1, 衝突前の速度 v1, 衝突後の速度 v'1
ボール2・・・質量 m2, 衝突前の速度 v2, 衝突後の速度 v'2

エネルギー保存則より
(1/2)*m1v1^2 + (1/2)*m2v2^2 = (1/2)*m1v'1^2 + (1/2)*m2v'2^2

運動量保存則より
m1v1 + m2v2 = m1v'1 + m2v'2

この2つの式を解いて、衝突後のそれぞれの速度を求めると
v'1 = v1*(m1-m2)/(m1+m2) + 2*m2v2/(m1+m2)
v'2 = 2*m1v1/(m1+m2) + v2*(m2-m1)/(m1+m2)

となる。弾性体のボールの場合はこれでOK。
次に、非弾性衝突について考えると(衝突の際エネルギーが失われるため)
エネルギー保存則が使えないので、跳ね返り係数を導入。

跳ね返り係数Eは相対速度比であらわされ,v1, v'1, v2, v'2が既知のとき
E = -(v'1 - v'2)/(v1 - v2)
となる。

跳ね返り係数が既知であれば、運動量保存則と連立させて解くことができ、
v'1 = v1*(m1-Em2)/(m1+m2) + (1+E)*m2v2/(m1+m2)
v'2 = (1+E)*m1v1/(m1+m2) + v2*(m2-Em1)/(m1+m2)
となる。
跳ね返り係数E=1のとき、弾性衝突と同じ式になる。

・・・式書くのが面倒くさい&解りにくいなぁ。
以降どうやって書いていこう

【問題21】地球よりも月で重くなるものは?

2010年04月27日 22時01分04秒 | 頭の体操
【問題21】
月の重力は地球の6分の1です。
そんな月で、地球よりも重くなるものはあるでしょうか?

 解答はこちら 

【解答】
たとえば、ヘリウムの入った風船。

地球には大気があり、大気によって浮力がはたらきます。
この浮力が重力よりも大きいとき(空気よりも軽い気体など)
ふわふわと浮いて重さが測定できなくなります。

ところが月には大気がなく、空気よりも軽い気体も重さを測定できます。
実際のところ月で風船は作れませんが、
地球上の空気よりも軽い気体は、地球では浮くので重さがないのに対し
月では重さがあるため、月でのほうが重くなっていると言ってもよさそうです。

2cm×1000cmの領域に入る、直径1cmのコインの枚数

2010年04月26日 21時49分05秒 | 数学
昔テレビ(多分)で見たような話を思い出しながら。

「2cm×1000cmの領域がある。
ここに直径1cmのコインは何枚収まるか?」

という問題が出されていました。
最密充填問題です。

普通、綺麗に並べて丁度2000枚入るため
これが最大だと思ってしまう。

しかし答えは2011枚(以上)とのこと。
2011枚は確実に入ることがわかっているが、
2012枚入るかもしれないと。
(2013枚は入らないことが証明されてたような気がする)

詰め方は、(言葉では難しいけど一応書いてみると)
3枚をピラミッドのようにくっつけて、これを1セットとします。

セットA セットB
○○   ○
. ○   ○○

ここでセットAを2cm×1000cmの長方形領域の上側にくっつけ、
セットBを下側にくっつけ、そのまま左に詰めていく。
以下繰り返しやると、2011個入るらしい。というか計算したら入りました。

しかし2012個入るかもしれないとは面白いですね。
いや、これはもう解けてるのかな?

確か「ケプラー予想」がどうのこうのという話をしていた気がするのと、
当時はケプラー予想が解けていなかったような気がするので
1997年にケプラー予想が解かれた今、この問題も解決しているのでしょうか?