物体の移動先にある一点を通過したか判定するには内積が便利
電脳空間カウボーイズの「第百四十八回 アメリカ帰りゲームを語る 前編」で、
僕が「内積が便利だなと思った」という話をしてる部分が、全然意味わからんのじゃないか。
と思って、どういうことかというサンプルをActionScript3.0で書いてみました(DotProduct.as)。
このプログラムの肝は、throughPoint関数。
このプログラム、ボールの移動スピードを管理している変数dxは、正の値にも負の値にもなります。
で、このボールが画面の真ん中、座標200を超えたら上または下に移動させたい。
このような場合、どのように判定を書けばシンプルに書けるか?っという話ですね。
内積について、ざっくり説明すると、ベクトルaと、ベクトルbをかけると、二つの成す角cosθが求まるという公式です。
ここでポイントになるのは、このcosθが求まるという点。
cosは、90度から270度までが、負の値。
0度から90度と、270度から360度までが正の値。
という性質があります。
なんで、移動前の位置から目的地までのベクトルaと、移動後の位置から目的地までのベクトルbを求めて、これを掛けあわせます。
目的地を通過したならば、aとbのなす角は180度になるはず。
つまり掛けた結果は負の値になると。
逆に通過していないならば、aとbのなす角は0度なので、正の値となるはず。
そういう処理を行っているのが、throughPoint関数。
ということですね。
背景グラフィックはこれ。
最近のコメント