トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「数学」に関連する記事一覧

0  

FFT のわかりやすい資料

FFT についてとてもわかりやすい資料があったのでメモ代わりに貼っておきます。

http://lab.sdm.keio.ac.jp/maenolab/makino/documents/20090827_Fourier.pdf

一度理解しても、数年後にまた使う時に細かいところを忘れているので、こういう資料があるとすぐに思い出せて助かります。

MEL パラボラフィッティング

2012/01/25

研究で与えられた3点をパラボラフィッティング(Parabola Fitting)で関数近似して最小解を求めるようなC++プログラムを作る機会があったので、ちゃんとできているか確認するためにMELで同じようなものを書いてMayaでビジュアル化しました。

本当はMathematicaとか使うんでしょうけど、私には慣れているMayaの方が手っとり早い。

3つトランスフォームノードを選んで、下記のようにコマンドを実行するとフィッティングしたカーブに沿ったアニメーションが作られます。


createXYParabolaAnimExpression_SelectedThreePoints("pSphere1", 0.1, -30);

この場合はpSphere1というオブジェクトにExpressionでアニメーションがつきます。0.1がアニメーション速度で、-30は接線が平行になる点のオフセットです。

動画にするとこんな感じです。

こういった関数あてはめを行うことで、サンプル点よりも細かい情報を得ることができます。MELで作ったところで、このままでは何の役にも立ちませんけどソースを載せておきます。


global proc fit2dParabolaFromThreePoints(
                float $in_x1, float $in_x2, float $in_x3, 
                float $in_y1, float $in_y2, float $in_y3,
                float $o_result[]
){
        float $denom = ($in_x1 - $in_x2)*($in_x1 - $in_x3)*($in_x2 - $in_x3);
        $o_result[0] = ($in_x3 * ($in_y2 - $in_y1) + $in_x2 * ($in_y1 - $in_y3) + $in_x1 * ($in_y3 - $in_y2)) / $denom;
        $o_result[1] = ($in_x3*$in_x3 * ($in_y1 - $in_y2) + $in_x2*$in_x2 * ($in_y3 - $in_y1) + $in_x1*$in_x1 * ($in_y2 - $in_y3)) / $denom;
        $o_result[2] = ($in_x2 * $in_x3 * ($in_x2 - $in_x3) * $in_y1 + $in_x3 * $in_x1 * ($in_x3 - $in_x1) * $in_y2 + $in_x1 * $in_x2 * ($in_x1 - $in_x2) * $in_y3) / $denom;
};
// Example
// createXYParabolaAnimExpression("pSphere1", 1, 1, 0, 0.1, -30);
global proc createXYParabolaAnimExpression(
        string $target_transform, 
        float $a, float $b, float $c, 
        float $speed, 
        float $frame_offset
){
        string $tx = $target_transform + ".tx";
        string $ty = $target_transform + ".ty";
        string $exp_str = 
                "float $a="+$a+";\n"+
                "float $b="+$b+";\n"+
                "float $c="+$c+";\n"+
                "float $speed="+$speed+";\n"+
                $tx+" = (frame+"+$frame_offset+")*$speed;\n"+
                $ty+" = $a*"+$tx+"*"+$tx+" + $b*"+$tx+"+$c;";
        expression -s $exp_str;
};
// Example
// createXYParabolaAnimExpression_SelectedThreePoints("pSphere1", 0.1, -30);
global proc createXYParabolaAnimExpression_SelectedThreePoints(
        string $target_transform, 
        float $speed, 
        float $frame_offset
){
        string $point_list[] = `ls -sl`;
        if(size($point_list)<3){
                print "error: Number of selected point is not enough, must be more than 3."; return;
        }
        float $coefs[3];
        fit2dParabolaFromThreePoints(
                `getAttr ($point_list[0]+".tx")`,
                `getAttr ($point_list[1]+".tx")`,
                `getAttr ($point_list[2]+".tx")`,
                `getAttr ($point_list[0]+".ty")`,
                `getAttr ($point_list[1]+".ty")`,
                `getAttr ($point_list[2]+".ty")`,
                $coefs
        );
        createXYParabolaAnimExpression($target_transform, $coefs[0], $coefs[1], $coefs[2], $speed, $frame_offset);
}

台形公式(Trapezoid)による求積法

2010/10/03
授業で求積法について学びました。
今まで積分をプログラムでやる方法は触れたことがありませんでしたが、実際に勉強してみると離散データをできるだけ連続する積分値に近づけるための工夫がなされているところがおもしろいです。

台形公式による方法とシンプソン則による方法を勉強したので、まずはシンプルな台形公式のアルゴリズムをまとめましたものと擬似コードを載せます。

1.    原理

領域を台形に分割して , その和から積分値を近似する求積法である. xのユニット間の間隔を h とすると, f(x) [a,b] 区間の積分は (1) 式のように近似する .

      ...(1)

この式の計算の冗長性を省くと (2) 式のように書き換えられる .

            ...(2)

2. 擬似コード     

function trapezoid(a, b, h)

    sum=( f(a)+f(b) )*h/2;

    for x=[a, b-1]
        sum = sum + h*f(x);
    end for

end function
 
0  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0232 sec

Copyright(C)2006-2018 wsp All Rights Reserved