このエントリーをはてなブックマークに追加
2013/03/15

凸レンズを通過する波のシミュレーション

凸レンズ形状の高密度媒質を通過する波のシミュレーションです。

RINEARN CODE - 凸レンズを通過する波のシミュレーション
スクリーンショット
※ ダウンロードしたZIPファイルを展開し、中のVCSSL.jarをダブルクリックして下さい。
※ 各種デスクトップOSで動作しますが、動作には Java が必要です。

概要

このVCSSLプログラムは、凸レンズ形状をした高密度媒質を、波が通過する様子をシミュレーションします。 レンズ通過時に波が屈折し、焦点に集まる様子を、アニメーションで見る事ができます。

使用方法

このプログラムは、Webページ上でも、ダウンロードしてでも使用できます。

Webページ上で起動

上の画面の実行ボタンを押すと、実行用のWebページに移動し、プログラムが起動します。

ダウンロードして起動

上の画面のダウンロードボタンを押して ZIP ファイルをダウンロードし、解凍した中にある「 VCSSL.jar 」をダブルクリックすると、プログラムが起動します。 なお、ZIPファイルの解凍は、右クリックして「 すべて展開 」などで行えます。

起動後の操作方法

起動すると、ウィンドウ上に画面が表示され、波が凸レンズ状の高密度媒質を通過する様子がアニメーションで見られます。

画面

画面ウィンドウ上では、下記のマウス操作を行えます。

  • 左ドラッグ … 視点の回転
  • 右ドラッグ … 視点の平行移動
  • ホイールスクロール … 拡大/縮小

密度分布の変更

密度分布は、画像ファイル「 density.png 」として描いたものを読み込むようになっています。実際にこのシミュレーションで用いているのは以下の画像です:

密度分布画像

この通り、凸レンズ状の形状が描かれています。この画像ファイルの内容を描きかえる事により、自由な密度分布に設定できます。 画像ファイルのピクセルごとの明るさが、その点の媒質密度に対応します。具体的には、暗いほど密度が重く、明るいほど軽くなります。

パラメータの変更

波に関する各種パラメータは、プログラムのコードの先頭領域にまとめて記載されています。 それらの値を書き換えると、色々と条件を変えてシミュレーションを楽しめます。

シミュレーションの題材解説

このプログラムでは、凸レンズ形状の媒質を、波が通過する様子をシミュレーションしています。ここでは、その際に生じる現象について、物理学的な観点から、簡単に考察してみましょう。

凸レンズ形状の密度分布

上でも述べましたが、このシミュレーションで用いた媒質の密度分布は、以下のPNG形式画像ファイルとして読み込んでいます。

密度分布を設定する画像ファイル。
密度分布を設定するPNG形式画像ファイル
ピクセルごとの明度がその点の密度分布に対応します。暗い部分ほど密度が重く、明るい部分ほど軽くなります。このプログラムでは、上記のように凸レンズ形状の分布となっています。

上記の図の、ピクセルごとの明度情報が、その点の密度分布に対応します。暗い部分ほど密度が重く、明るい部分ほど軽くなります。

上図の通り、このシミュレーションの媒質は、低密度の媒質中に、凸レンズ形状の高密度領域が埋め込まれた密度分布となっています。

媒質密度と波の速さ

このシミュレーションにおいて重要なのは、媒質密度と、波の速さとの関係です。

波は、密度の大きい(重い)媒質中では遅く、逆に密度の小さい(軽い)媒質中では速く伝わるという、非常に重要な性質があります。実は波の屈折現象は、この性質に起因するものです。逆に言えば、この性質さえ覚えておけば、レンズにおける屈折現象なども、直感的に理解する事ができます。

このあたりについては、以下のシミュレーションで分かりやすく見る事ができます。ぜひ合わせてご参照下さい。

光でも「密度」を「屈折率」に置き換えて解釈すれば同様

今回のシミュレーションでは、電磁気的な波である「 光 」では無く、力学的な波(つまりは弾性体の振動)を扱っています。

しかし、光の場合でも、媒質密度を屈折率に置き換えれば、ほぼ同様の議論を行う事ができます。

光の場合は、屈折率が高いほど、遅く進みます。つまり、よく言われる「光の速さ」は真空中のもので、ガラスの中などではそれよりも遅く進むのです。 これは、媒質密度が高いほど、力学的な波が遅く進むのと同じ対応関係です。

そのため、光学的なレンズに対しては、今回のシミュレーションにおけるレンズの高密度領域を、単に高屈折率の領域と見なせば、同様の解釈が可能です。

シミュレーション結果

それではシミュレーションの結果を見てみましょう。

実際に、このシミュレーションを実行した様子が下図です。

シミュレーションの様子。
シミュレーションの様子
波は左から右へ進行しています。

上図において、波は左から右へまっすぐ入射しています。波が進行する向きと速さを、矢印で表したのが下図です。

波の進み方
波の進み方
矢印の太さが波の速さに対応しています。レンズ内は高密度で、波の速さが遅いため、厚い中央部を通る波を、薄い端部を通る波が追い越し、回り込むようにして「屈折」が生じます。

上図において、矢印の太さが波の速さ、矢印の向きが波の進行方向に対応しています。

レンズ内は密度が高いため、波の進む速さが遅くなります。 そしてレンズ中央部以外は、波の進行方向に対して境界に角度が付いているため、先にレンズに触れた中心側の波が遅れ、外側の波はそれを追い越すように回り込み、波の進行方向が屈折します。

さらに、レンズ中央部は厚く、端部は薄くなっているため、中央部よりも端部のほうが、通過時に早いタイミングでレンズを脱出します。 端部の波がレンズを脱出しても、中央部の波はまだ(進むのが遅い)レンズ内に取り残されているため、ここでも回り込むように波の屈折が生じます。

このようにして、最初はまっすぐに入射してきた波が、レンズに進入・脱出する際に屈折し、通過後に一点に収束するような方向に進みます。 この収束点は一般に「 焦点 」と呼ばれます。

焦点の様子。
焦点の様子
レンズにまっすぐ入射した波は、通過後に「焦点」に収束するような方向に進みます。

なお、ここで「 何故、凸レンズでは一点に集中するように屈折するのか ? 」という疑問が生じるかもしれません。

この疑問はもっともです。実は波が焦点に集中するのは自然の法則でも何でもなく、単に凸レンズをそのような形に製造しているだけです。 そして、そのように製造する理由も、単純に「 便利だから 」です。

つまり、適当に凸形状を作っておけば、波や光は一点に集中するという訳では決してありません。それどころか、精度良く波や光を一点に収束させる、つまり高精度な焦点を実現するには、高度な技術と複雑な理論が必要です。

高精度な焦点を得るのは難しい


凸レンズの焦点を高精度に得るのは、数多くの課題があります。

一つは形状の問題です。光や波を一点に収束させるための理想的な形のレンズ(いわゆる非球面レンズ)を磨くには、技術的にも高精度な加工が必要ですし、コストも高くつきます。 そのため、一般的な用途において、よく球面形状のレンズ(球面レンズ)が使われています。しかし球面レンズでは、球面の中心線付近を通る光は良いのですが、中心線から遠い部分を通る(つまり局率の大きなレンズで端のほうを通る)光が、焦点からずれてしまいます。これは一般に球面収差と呼ばれます。

もう一つは、たとえレンズ形状を理想的に加工できたとしても、波の波長(光で言えば色)によって屈折率が微妙に変わるため、焦点の位置がずれてしまう事です。つまりは赤色と青色の光では焦点が違ってしまうのです。 これは一般に色収差と呼ばれます。色収差を消すのはなかなか困難で、カメラや望遠鏡のレンズなどでは、複数のレンズを複雑に組み合わせて、色収差を打ち消すような工夫がよく行われています。

凸レンズで綺麗に焦点を持たせる難しさを実感してみたい方は、ぜひこのプログラムをダウンロードし、密度分布の画像ファイル「 density.png 」に凸レンズを描いてみて下さい。 適当に書いた形では、まず綺麗な焦点は得られないでしょう。実はこのプログラムで使用している「 density.png 」も、何度も試行錯誤を繰り返した結果の形状を用いています。

さて、波の先端が焦点に収束した後、波はどう進むのでしょうか。もう少し後の時間まで見てみましょう。すると以下の図のようになります。

もう少し後の様子
もう少し後の様子
収束して焦点を通過した波は、今度は拡散するように進みます。

このように、収束して焦点を通過した波は、今度は逆に、拡散するように進みます。

上図では、上下の境界部分での反射波などが影響して、少し見辛くなっていますので、波の腹の部分を赤い線で強調してみましょう。

波の腹を赤い線で強調した図
波の腹を赤い線で強調した図
焦点を通過した波は、焦点を中心として放射状に拡散する事が見て取れます。

この通り、焦点に向かって収束した波は、その後拡散していく際も、焦点を中心として進む様子が見て取れます。

ここまでをまとめて図にすると、凸レンズを通過する波の進み方は、以下のようになります。

凸レンズを通過する波の進み方
凸レンズを通過する波の進み方
凸レンズに対してまっすぐ入射してきた波は、全て焦点に収束し、その後は焦点から放射状に拡散します。

上図の通り、「凸レンズに対してまっすぐ入射してきた波は、全て焦点に収束し、その後は焦点から放射状に拡散する」、とまとめる事ができます。 この事が、凸レンズのもっとも重要な性質です。

ところで、実際には凸レンズを通過する波は、レンズ表面で二回屈折するわけですが、レンズ内のある面(線)で一回だけ屈折するとみなすと(上図の補助線)、扱いが簡単になります。 この面は一般に主面と呼ばれます。 そして、主面から焦点までの距離は焦点距離と呼ばれます。

例を挙げると、カメラのレンズは簡単に言えば凸レンズと見なす事ができますが(実際には収差を消すため、多くのレンズが組み合わさっています)、広角レンズやマクロレンズの焦点距離は短く、望遠レンズの焦点距離は長いものとなっています。

コード解説

このプログラムのコードは、プログラミング言語 VCSSL で記述されています。

実は、コード内容は以下のページのプログラムと全く同じで、密度分布を設定する画像ファイル( density.png )が異なるだけです。モデルやシミュレーション方法、コードなどについての詳しい解説は、以下のページをご参照下さい。

ここでは、コード全体のみを掲載しておきます。

コードのライセンス

このVCSSLコードは著作権フリー(パブリックドメイン)で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。



スポンサーリンク


このエントリーをはてなブックマークに追加
新着プログラム

台形近似による数値積分
2015年06月25日

長方形近似による数値積分
2014年11月01日

小数(浮動小数点数)から分数へ近似的に変換する
2014年08月10日

ユーザーが入力した数式を2次元グラフにプロットする
2013年11月30日

配列を3次元グラフにプロットする
2013年11月28日

配列を2次元グラフにプロットする
2013年11月28日

ファイルを3次元グラフにプロットする
2013年11月27日

ファイルを2次元グラフにプロットする
2013年11月26日

ウィンドウの生成
2013年08月28日

ボタンが並ぶパネルの配置(ButtonPanel)
2013年08月28日

ボタンの配置
2013年08月28日

2DCGと3DCGの合成
2013年05月04日

凹レンズを通過する波のシミュレーション
2013年03月16日

凸レンズを通過する波のシミュレーション
2013年03月15日

乱雑な密度分布における波のシミュレーション
2013年03月12日

ローレンツアトラクタ(ファイル出力版)
2013年02月28日

波の屈折のシミュレーション
2012年12月05日

力学アルゴリズムによる波のシミュレーション(面上の波)
2012年11月21日

手動で波を発生させるシミュレーション
2012年11月19日

力学アルゴリズムによる波のシミュレーション(線上の波)
2012年11月18日

カラーコードとRGBの相互変換と色表示
2012年11月15日

頂点配列によるモデルの変形アニメーション
2012年11月14日

頂点配列によるモデルの作成(四角形格子メッシュ形式)
2012年11月11日

円周率1万桁の計算(ガウス=ルジャンドル法)
2012年08月22日

2DCG用フレームワークの使用サンプル(アニメーション版)
2012年08月09日
  スポンサー リンク

  おすすめ / 人気のコーナー
フリーソフト
RINEARN では、インストール不要の各種解析ソフトを無償公開しています。Windows 8.1 で動作確認済み !
ピックアップ
【VCSSL実践講座】 3Dグラフ描画ツールを作ろう!
C言語系の簡易プログラミング言語「 VCSSL 」で、色々なものを作っていく連載記事コーナーです。現在は3Dグラフ描画ツールを開発中 !
2013年08月29日
【RINEARN CODE】 凸レンズを通過する波のシミュレーション
凸レンズ形状の高密度媒質を通過する、波のシミュレーションです。まっすぐ入射した波がレンズ通過時に屈折し、焦点へ収束する様子がアニメーションで楽しめます。
2013年03月15日
  新着情報
RSSフィード
RINEARN の新着・更新情報をRSSフィードで配信しています !
新着リスト
台形近似による数値積分

積分の値を数値的に求めます。長方形近似よりも高精度な方法として、台形で近似した微小領域を足しあげる方法を使用します。
2015年06月25日
長方形近似による数値積分

積分の値を数値的に求めます。長方形で近似した微小領域を足しあげる、最も単純な方法を使用します。
2014年11月01日
小数(浮動小数点数)から分数へ近似的に変換する

小数(浮動小数点数)を、適当な誤差の範囲内で、近い分数に変換するプログラムです。
2014年08月10日
ベクターソフトニュース様でリニアングラフ3Dをご紹介頂きました!

オンラインソフトウェア流通サイトVector様の「ベクターソフトニュース」コーナーにて、リニアングラフ3Dを取り上げて頂きました。
2014年07月31日
ユーザーが入力した数式を2次元グラフにプロットする

実行時にユーザーが入力した数式の値を、2次元グラフにプロットするサンプルプログラムです。
2013年11月30日
配列を3次元グラフにプロットする

座標値配列の内容を、3次元グラフにプロットするサンプルプログラムです。
2013年11月28日
配列を2次元グラフにプロットする

座標値配列の内容を、2次元グラフにプロットするサンプルプログラムです。
2013年11月28日
ファイルを3次元グラフにプロットする

座標値ファイルの内容を、3次元グラフにプロットするサンプルプログラムです。
2013年11月27日
ファイルを2次元グラフにプロットする

座標値ファイルの内容を、2次元グラフにプロットするサンプルプログラムです。
2013年11月26日
2013年の不具合修正情報

2013年1月〜12月に実施された不具合修正に関する情報を掲載しています。
2013年11月01日
3Dグラフ描画ツールを作ろう!〜第5回縮尺を自動調整する

VCSSL実践講座、3Dグラフ開発編。第5回では、最大最小値に応じて、縮尺を自動調整する処理を実装します。
2013年09月02日
3Dグラフ描画ツールを作ろう!〜第5回縮尺を自動調整する

VCSSL実践講座、3Dグラフ開発編。第5回では、最大最小値に応じて、縮尺を自動調整する処理を実装します。
2013年09月02日
  Twitter