>>ひらまる氏
>一度の移動量が多く、全ての線分と「同時」に衝突した場合の問題です。
いえ、こちらも表現が悪かったようです。申し訳ありません。
お詫び代わりに、改めて説明いたします。
まず、現フレーム時の座標を(A,B)、1フレーム後の座標を(C,D)とします。
前述の参照先の紙芝居1枚目を見れば分かる通り、(A,B)と(C,D)を通る線分はフレーム数tを噛ませて、
>X(t) = (C-A)t+A : Y(t) = (D-B)t+B {0≦t≦1}
と、表す事ができます。
もう一方の線分も同じようにsを噛ませて表せば、tとsの連立方程式によって交点のX座標とY座標が求まります。
ここで重要なのが、交点のX座標とY座標が求まる前に、フレーム数に相当するtも求まっていると言う事です。
このtは何を意味しているかというと、双方の直線が厳密にはtフレーム目に衝突していると言う事を意味しています。
例えば、前述の参照先の紙芝居の5枚目を例に出せば、t=0.7は0.7フレーム目に衝突、t=2.1は2.1フレーム目に衝突したと言う事になります。
そして、システム上は0フレーム目から1フレーム目までの衝突だけを抽出して、処理しているわけです。
このtを利用すれば、同一フレーム内での衝突の優先順位を付ける事ができます。
処理が重くなる心配もあるでしょうが、tを求める式は引き算10回、掛け算4回、割り算1回だけで済みます。当方の環境下では256回繰り返して、ようやく1ms遅れた程度でした。
参考までにline a, b, c, dとline e, f, g, hの接点のt(衝突フレーム数)は以下の式となります。(前述の参照先のスクリプトのtの算出法と同一)
t = double((e-g)*(b-f)-(f-h)*(a-e))/((c-a)*(f-h)-(d-b)*(e-g))
昨日の紙芝居にも少し説明を追加しておいたので、よろしければご覧ください。
http://hspdev-wiki.net/?Math%2F%C0%FE%CA%AC%C6%B1%BB%CE%A4%CE%B8%F8%BA%B9%C8%BD%C4%EA#z2fc9392
>逆に垂直な壁を表現するのが難しくなりました;
Y=aX+bのような形で処理しているとY軸に平行な直線を定義できません。
0=aX+bY+cの形であれば、ほぼ全ての直線を定義できます。(ヘボンの公式だったかそんな名前があった気がします)