キラキラ星(1/f ゆらぎによる星の瞬き) 〜JAVA プログラム
自然界には 「1/f ゆらぎ」と言われる変化を示すものが多くあり、人間はそのゆらぎに心地よさや安らぎを覚えるということはよく知られています。
別なところで 「1/f
ゆらぎ」を利用して、耳障りではない音楽を作曲できないかというシミュレーションをしてみました。(1/f
ゆらぎを利用した自動作曲)
ここでは、星の瞬きをJavaプログラムでシミュレーションしてみます。
大気のゆらぎが、星の瞬き(光の強度変化)を発生させます。 (木星などの、「点」として扱えない近くの天体は、ほとんど瞬きません。) 星の強度変化は、大気のゆらぎに起因し、大気のゆらぎは 1/f の性質を持っているため、星の強度変化(瞬き)も1/f
の性質を持つことになります。
シミュレーションでは、黒い背景の上に小さな点を描き、そのα(透明度)を「1/f ゆらぎ」に従って変化させることで、星の瞬きのような効果を持たせました。
下に、プログラムの大まかな流れを示します。 1/fゆらぎ発生には 処理負荷を考えアルゴリズムが単純な「間欠カオス法」を用いました。
int m_lAlpha; // <--
描画時のα値(透明度) int m_iColorR; // 星の色(赤成分) int m_iColorG; // 星の色(緑成分) int m_iColorB; // 星の色(青成分) for(;;) // ∞ループ { m_lAlpha の値を 1/f ゆらぎを持たせて変化させる(間欠カオス法による) α値 // 描画色等設定 ↓ Color m_csColorTwincle = new Color(m_iColorR,m_iColorG,m_iColorB,m_lAlpha); Graphics g; g.setColor(m_csColorTwincle); // <-- 色の設定 g.fillRect(m_lX, m_lY, m_lSize, m_lSize); // <-- 星(小さな矩形)を描画 Thread.sleep(105); // <-- 一定周期で繰り返す } |
<シミュレーション>
作成したシミュレーションは、600×480ピクセルの空間の中に、1000個の星を、大きさ:1、2、3
ピクセルの矩形として描きました。
小さいな星ほど多くなるようにしています。 また、星の配置は 乱数を使用してばら撒いています。
シミュレーションでは、比較のため、 一定周期で変化する星空(但し、各星の周期は異なる)、 一様乱数(ホワイトノイズ)で瞬く星空も作成してみました。
★ 1/f ゆらぎを用いた場合の星空
★ 一定周期変化の星空
★ ホワイトノイズで変化する星空
液晶パネルで見た場合、多少斜め方向から見た方が、星の瞬きが良く解ります。
各夜空を見た感想は人によって異なると思いますが、「一定周期変化の星空」は、クリスマスのイルミネーションの点滅の様で人工的な感じがします。
一方、「ホワイトノイズで変化する星空」は点滅が激しすぎて忙しなく思えます。
やはり、「1/f
ゆらぎを用いた星空」が一番自然に見えます。
表示した星空の例
(.mp4形式動画)
・周期変化
・1/f ゆらぎ
・ホワイトノイズ
<プログラム動作上の注意>
同じプログラムで アプレット起動時のパラメーターで それぞれ異なる動作をするように作成しました。
この時のスイッチとなるべき変数を static
変数としたため、 同一のプロセス内では 同じ値になってしまいます。
このため、異なる星空を同時に見る場合に、同一ブラウザ上で別タブを開いて表示すると、同じ動きをしていまう可能性があります。
同時に動作させる場合には、必ず、別ブラウザを開いて下さい。
<参考文献>
1) ピエール・ベルジェ他著 カオスの中の秩序
(1992)産業図書株式会社
2) J.ブリッグス他著 鏡の伝説
(1992)ダイヤモンド社
3) 1/f ゆらぎ <https://www.tounichi-g.co.jp/saver/1_f_info.html
>
キーワード: 1/fゆらぎ、星の瞬き、Javaプログラム、シミュレーション
初版:2013/10/27 |