2010年9月7日火曜日

非線形

世の中、非線形な変化にあふれている


たとえば、風に揺れる草木
たとえば、人間の表情
たとえば、膨張するち○こ

その変化をプロットしたら、
きっと非線形な曲線があらわれるはず

人はその変化を見て、自然と感じる。
というか気にもならないと思う。
つまりは、自然ということ

逆に、それらがリニアな変化をしだしたら
とたんに不自然なものに見えてくるだろう

リニアに揺れる草木
作り物にしか見えない

リニアに変化する人の表情
まるでロボットみたい

リニアに膨張するち○こ
想像したくもない

何が言いたいのかというと、
自然に見せたい場合は、できるだけ非線形な変化をさせる、ということだ

そこで、プログラムでお手軽に非線形な値を得られる関数を紹介。
この間、本を読んでて見つけました。

f(x) = 3*x^2 - 2*x^3

この関数は、0~1の入力に対して、滑らかに変化する値を0~1の範囲で返してくれます。

プログラムで書くと

float smooth(float x)
{
    return x*x*(3-2*x);
}

ホーナー法を使用して乗算回数を削減、キリッ。プロフェッショナルですな。
実際にプロットしてみると、下の図みたいになります。


考えるのがめんどくさくて、リニアに逃げそうになったとき、代わりに使ってみるといいかも。

2 件のコメント:

  1. >自然に見せたい場合は、できるだけ非線形な変化をさせる、ということだ
    まったくもってそのとおりですよね。
    線形は線形で男のロマンですけど。

    > 実際にプロットしてみると、下の図みたいになります。
    思っていた以上に綺麗なカーブですね。
    勉強になります。

    返信削除
  2. >線形は線形で男のロマンですけど。
    線形でも使い方しだいで効果的にみせられますよね。

    >勉強になります。
    えっへん。

    返信削除