• 締切済み

水面の波紋

水面を伝わる波紋のプログラムを作りたいのですがどういう風に作っていけばいいでしょうか?? 何か参考になるものなど教えていただければうれしいです。 よろしくお願いします。

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

No.2です、前回の回答で、色濃度変換関数が変でしたね。sin関数の範囲を勘違いしたものになっていました。あと、振幅の減衰も入ってなかった。 まあ、物理学的な細かい計算は省いて、単純なsin関数で色を決めて、同心円を描くだけでも、雰囲気は出せそうです。 ということでJava Appletで作ってみました。 減衰を入れてないのと、drawOvalの精度の問題で水面と云うより、なんだか電波の発信のような感じになってしまったけど、絵を描くところだけ抜粋すると以下のようなプログラムです。 MATLABはやったことないので、Cも今使ってないので忘れたし、計算部分をコメントでなんとか理解して貰えれば、画像出力部分を使用言語に合わせて書き換えれば、なんとかなるかと思います。 あと、定数項を適宜変更すると、もうちょっと雰囲気が出るかもです。 // クラス内フィールドで保持変数 private int img_width = 200; // 画像横幅 private int img_height = 200;; // 画像縦幅 private int x0 = 100; // 中心位置x private int y0 = 100; // 中心位置y private double rmax= 100; // 最大半径 private double rf = 50; // 波の水平方向 1周期の距離 dot private double tf = 2; // 中心での波の 1周期に要する時間 sec /** @param t : 時刻tでの画像を得る */ Image calcImage( double t ){ Image off_img = createImage(img_width,img_height); Graphics dt_img = off_img.getGraphics(); double tht,k; int r,g,b,x,y,rr; double pai_rad = 2* Math.PI ; // 1周期=2π for ( int i = 2; i< rmax; i+=2 ){ tht = pai_rad * ( (t/tf) - ((double)i/rf) ); // t/tf で中心位置の位相、 i/rf で半径r位置の位相、離れたところは位相が遅れるので引き算 k = ( Math.sin( tht ) +1.0 ) * 0.5; //sin関数を 0~1に変換 g = (int)( 255.0 * k); // green if( g>255 ){ g=255; }else if( g<0 ){ g=0; } r = 125; // red b = 255; // blue dt_img.setColor(new Color( r, g, b)); // ペン色設定 青紫~薄水色で変化 x = x0-i; y = y0-i; rr= i*2; dt_img.drawOval( x,y, rr,rr); // javaでは外接四角形を指定して内接円を描くので } return off_img; }

the_koba
質問者

お礼

重ね重ねご回答ありがとうございます。 Javaはよく知らないので理解するのに手間取ってしまいました。 ネット上にいくつかうまく作っているのを見ましたが、それらは波動方程式を差分法で解いているような感じなんでしょうか?? よくはわからないのですが。 いろいろ調べてみてうまくできるようにがんばってみます。 ありがとうございます。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

プログラムする前に、波紋を現すための物理学的記述の方は、解ってるのでしょうか? これが解っているとして、(私はそこまで調べる気はないので) 1.水面を真横から眺めるのか、上から眺めるのか、をまず決める。 1a。横から眺めるなら、 横軸を波紋伝搬方向x、縦軸を波の高さh、F(t、x)を時刻tでの波の位相を求める関数として    h = sin( F(t,x) ); でグラフを書いていけばよいかと。 1b。上から眺めるなら、画面は水面x,y、で波の位相を色の濃淡で現すのが多いかな。 F(t,x,y)を時刻tでの波の位相を求める関数として    色濃度(0~1.0) = sin( F(t,x,y) ) + 0.5; でx、y平面をプロットしていけば、有る時刻の水面が書ける。 具体的なプログラムは、それぞれの言語のお作法によるから、まずは画像表示させるところはクリアする必要があります。 Fの記述については、以下あたりをみると結構面倒なプログラムになりそう http://www.acs.i.kyoto-u.ac.jp/info/ndyn/articles/ron34/ron34.html 上記サイトで出てくる関数やフーリエ変換とかを計算させるアルゴリズムが知りたいのだったら、掲示板では無理です。 物理シミュレーションとか流体物理とかの解説本を探して下さい。

the_koba
質問者

お礼

回答ありがとうございました。 上から眺めるようなのにしたいので1bを参考にさせていただきたいと思います。

  • Nigun
  • ベストアンサー率22% (200/893)
回答No.1

せめて使用したい言語くらいは書こうよ。

the_koba
質問者

補足

すいません。MATLABで作ろうと思うのですが、MATLABを使用されている方が少ないと思ったので。 C++でもある程度わかるます。 主にアルゴリズムの部分をアドバイス頂きたいと思います。 配慮に欠けまして申し訳ないです。 どうかよろしくお願いします。

専門家に質問してみよう