« 数式表示 MathJax -5- | トップページ | アニメーションを管理する4つの変数 »

2012年7月18日 (水)

散乱角の \(\sin\), \(\cos\)

先の記事「FlatTable アニメーションの流れ」の終わりで、衝突した球の速度よりも衝突された球の速度の方が速くなるという不具合が有ることを示しましたが、その不具合は解消しました。不具合の原因は、Flash 版のコードを見ながら SVG+JavaScript 版を作成した際の誤記によるものでした。問題の箇所は、衝突の散乱角の \(\cos\) を求めるルーチンに有りました。次のコードがそれに該当します(修正済み)。

function calcSin(inV, outV){
    if ( ((0 == inV.x)&&(0 == inV.y))||((0 == outV.x)&&(0 == outV.y)) )
        return 0;
    return (inV.x*outV.y - inV.y*outV.x)/
        Math.sqrt((inV.x*inV.x + inV.y*inV.y)*(outV.x*outV.x + outV.y*outV.y));
}

function calcCos(inV, outV){
    if ( ((0 == inV.x)&&(0 == inV.y))||((0 == outV.x)&&(0 == outV.y)) )
        return 0;
    return (inV.x*outV.x + inV.y*outV.y)/
        Math.sqrt((inV.x*inV.x + inV.y*inV.y)*(outV.x*outV.x + outV.y*outV.y));
}
このコードの中で「.x」や「.y」が一部入れ替わっていました。因みに、この関数は scanCollision() が再帰的に自身を呼び出した後に使用されます。

    if (scanCollision(target, propose)){
        if (!ent.fCurve){
            sin = calcSin(
                {x:(ent.x - trig.x), y:(ent.y - trig.y)},
                {x:(target.next.x - target.x), y:(target.next.y - target.y)}
            );
           cos = calcCos(
               {x:(ent.x - trig.x), y:(ent.y - trig.y)},
               {x:(target.next.x - target.x), y:(target.next.y - target.y)}
            );
        } else {
            ・・・
        }
        totalSpeedV += target.speed*sin;
        totalSpeedH += target.speed*cos;
    }

ついでなので、 \(\sin\) と \(\cos\) の計算を説明します。以下で \(\alpha\) は アニメーション機能の実装、その前にの衝突の図で入射する手球と散乱する1番の成す角度です。

\(\cos\) は内積から求めます。
\[ {\boldsymbol u}\cdot{\boldsymbol v} = \mid{\boldsymbol u}\mid\mid{\boldsymbol v}\mid \cos\alpha \tag{1} \] \[ {\boldsymbol u}\cdot{\boldsymbol v} = u_{x}v_{x} + u_{y}v_{y} \tag{2} \] この2式から、
\[ \cos\alpha = \frac{u_{x}v_{x} + u_{y}v_{y}}{\sqrt{(u_{x}^{2} + u_{y}^2)(v_{x}^{2} + v_{y}^{2})}} \tag{3} \] が求まります。

\(\sin\) は外積から求めます。
\[ {\boldsymbol u}\times{\boldsymbol v} = \mid{\boldsymbol u}\mid\mid{\boldsymbol v}\mid{\boldsymbol i}\sin\alpha \tag{4} \] \[ {\boldsymbol u}\times{\boldsymbol v} = (u_{y}v_{z} - u_{z}v_{y},\: u_{z}v_{x} - u_{x}v_{z},\: u_{x}v_{y} - u_{y}v_{x}) \tag{5} \]

式\((5)\) で \({\boldsymbol u}\) と \({\boldsymbol v}\) の \(z\) 成分を0とすると右辺は \(z\) 成分のみが非0となり、式\((4)\) の \({\boldsymbol i}\) は \(z\) 方向の単位ベクトルとなることが分かります。したがって、2つの式より、
\[ \sin\alpha = \frac{u_{x}v_{y} - u_{y}v_{x}}{\sqrt{(u_{x}^2 + u_{y}^2)(v_{x}^2 + v_{y}^2)}} \tag{6} \] が求まります。

\((3), (6)\) がコードの calcCos(), calcSin() に相当します。

« 数式表示 MathJax -5- | トップページ | アニメーションを管理する4つの変数 »

ビリヤードの配置図ソフト」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/584699/55223402

この記事へのトラックバック一覧です: 散乱角の \(\sin\), \(\cos\):

« 数式表示 MathJax -5- | トップページ | アニメーションを管理する4つの変数 »