FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Objective-Cでsmoothstep関数を使いたい

よくある関数らしい(?)smoothstep関数をObjective-Cで使いたくなったのだが、なさそうなので書いてみた。C++でもあるらしいけどそれだけのためにObjective-C++にするのが面倒なので。

参考サイトを見つつ書いてみたのがこんなの↓
-(float)smoothstepEdge0:(float)edge0 edge1:(float)edge1 x:(float) x
{
    x = [self clamp:(x - edge0) / (edge1 - edge0) minX:0.0 maxX:1.0];
    float r = x * x * (3 - 2 * x);
    
    return r;
}

-(float)clamp:(float)x minX:(float)minX maxX:(float)maxX
{
     return fmin(fmax(x, minX), maxX);
}

{
    // 実行してみる 
    float edge0 = 0.1;//—(1)
    float edge1 = 0.4;//—(1)

    float dX = 0.01;
    for(NSUInteger ite=0;ite<50;ite++) {
        float x = dX * (float)ite;
        float y = [self smoothstepEdge0:edge0 edge1:edge1 x:x];
        
        NSLog(@"%f %f”,x,y);
    }
}
clamp関数を使うみたいだが、なぜかclamp関数は以前に作っていた。
(1)この場合、0.1より小さいと0、0.4より大きいと1となり、その間はなめらかにつないでくれる。
0から0.5で入力xを変化させ、その時の出力yを計算してグラフ化(MacのNumbersを使用)した。

smoothstep関数のグラフ

↑スムーズにつながっている。
こんな関数でこんなグラフになるって、、、考えた人すごいよなあ。


参考サイト
c++ - Smoothstep function - Stack Overflow
smoothstep

<< iOS版のドラクエ4を買った  TopPage  Metalシェーダのfloat3とpacked_float3の違い >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1280-598b4413




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad