#include using namespace std; using namespace wfl; using namespace cwfl; int main(void) { /////////////初期化/////////// StartCWFL(); //引数無しでスタート FieldParam::SetDefault(128,128,2e-6); //生成されるフィールドのデフォルト値を設定 double R = 1e-3; //レンズの半径 WaveField saver; //ファイルセーブ用のWFオブジェクト /////////元画像の準備///////// WaveField temp; //画像ロード用のWFオブジェクト //↓bmpを振幅像として読み込み temp.LoadBmp("./EyeSimulation/lena128x128.bmp",AMPLITUDE); CudaWaveField source = temp; //コピーコンストラクタで、データを渡す source.Embed(3); //縦横それぞれ8倍の64倍拡張を行う //////////レンズ設定////////// CudaWaveField lens; //レンズの役割をするCWFオブジェクト lens.Embed(3); //64倍拡張 lens.SetGaussian(R,100); //開口をスーパーガウシアンとして生成 lens.SetQuadraticPhase(10e-3); //焦点距離10mmのレンズとして位相設定 lens >> saver; //CWF -> WFに転送 saver.SaveAsWf("./EyeSimulation/lens.wf");//WFデータとしてセーブ ////////////元位置 -> レンズ位置伝搬//////// source.AsmProp(20e-3); //角スペクトル法で伝搬(20mm) ////////////レンズ乗算////////////////// lens *= source; //レンズにソースを乗算 source.Dispose(); //不要になったsourceを明示的に破棄 ///////////レンズ位置 -> スクリーン位置伝搬/////// lens.AsmProp(20e-3); //レンズからスクリーンまで伝搬(20mm) ///////////後処理//////////////// CudaWaveField& screen = lens; //わかりやすいように別名をつけた screen.Extract(3); //64倍縮小(元のサイズに戻す) screen.Normalize(); //正規化 ///////////保存/////////// screen >> saver; //最終結果をGPUからCPU側に転送 saver.SaveAsBmp("./EyeSimulation/image.bmp",AMPLITUDE);//振幅画像として保存 return 0; }