Skip to content

Instantly share code, notes, and snippets.

@hitode909
Forked from kimoto/sin_is_god.txt
Created February 1, 2012 06:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save hitode909/1715463 to your computer and use it in GitHub Desktop.
Save hitode909/1715463 to your computer and use it in GitHub Desktop.
sin関数の使い方についてメモ
sin関数の魅力に迫る!
これは超ハイテンションでsin関数の魅力に迫るという文章です
sin関数は入力された角度(ラジアン)を元に、-1から1までのあいだの値を返却します
sin関数は周期的な特徴があって入力する値を増やしていくと...
-----------------
sin(0) = 0
sin(1) = 0.1
sin(2) = 0.14
...
sin(89) = 0.999 # 1.0に到達すると次は減少していく
sin(91) = 0.9
sin(92) = 0.8
...
※この文字列はあくまでもイメージです、値はすごく適当で事実とことなります
※というかsin関数に渡すべきなのは、正しくは角度ではなくラジアンです
-----------------
みたいな感じで、sin関数に渡す値を増やしていけば
-1から1までのあいだを行ったり来たりするような値の返し方をします。
ゲームではこの周期的な特徴を利用して、たとえば左右に移動しつづける敵を作ったりするわけです。
もちろん上下移動も同様に簡単にできる。
たとえばカラフルに発光させたい時なんかも色素を周期的に変化させればいいわけだから使えるんです!
たとえばRGBで色を設定できるオブジェクトがあったとすればそのR,G,Bそれぞれの値を
sinで求めた周期的な値を入れればクールなカラフルになります。
そのときに渡す引数、ラジアンは生涯に渡ってずっと増えつづけるものでよい、
ここでは経過時間を使いましょう。
しかしこのままでは駄目で、sin関数は通常-1から1までの値でしかないので、
これを0 - 255の範囲に元のsin関数の特性を保持したまま写像(=マッピング)する必要がある。
まずマイナスの値は不要なので+1します。すると
式は、sin(経過時間) + 1となって、返却される値の特性は0 - 2となります
次にこれを2で割って、0 - 1の範囲におさまるようにします
----------------------------------------------------
(sin(経過時間) + 1) / 2
----------------------------------------------------
こうすれば、0 から 1 までの値が返却されるようになります、だいぶ扱いやすい値範囲になりました。
が、現在必要なのは0から255までの値です。256倍します
なぜ255倍ではないのか、実はsinが返す値は0から2"未満"の値だからです。
sinが2を返却することはない! なので255倍だとちょっと数がすくなくなってしまいます。
説明するのがめんどくさい! 俺はファミリーマートのファミチキを早く食べねばならぬのだ、暴君ディオニス!
----------------------------------------------------
(sin(経過時間) + 1) / 2 * 256
----------------------------------------------------
こうすることで、0から255までの値が返却されるようになります。
おや、どうせ256倍したものを割る2するならはじめから、割っとけばええやんということで式を変形させます
256を2で割ると128になりますのでこうなります
----------------------------------------------------
(sin(経過時間) + 1) * 128
----------------------------------------------------
これで経過時間をもとに0から255までの周期的な変化をする値を取得できるようになったので
それぞれのRGB値にわりあてます
----------------------------------------------------
R = (sin(経過時間) + 1) * 128
G = (sin(経過時間) + 1) * 128
B = (sin(経過時間) + 1) * 128
----------------------------------------------------
coooooooooooooooool
lolololololol
このままだと、暗い色(0,0,0) から 明い色(255,255,255) へと変化していった後、
明い色から(255,255,255) から 暗い色(0,0,0) に変化する特性を持ってしまうので
緑色の色素はsin関数の位相である(逆の周期の仕方をする)cos関数を使うとか
あるいは、いまは共通の経過時間を渡していますが、そこを毎回ランダムで初期化するとか
そういった工夫があったほうがもっとcoolなglowingするかもしれないですね :o
jesus
jesus
jesus
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment