From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

差分法によるなんちゃって波動方程式

よくわからんタイトルですが、水面上を波紋が広がるような感じがするプログラムです。
特に役には立ちません。
実行画面
WavePanel.jpg

クリックすると波が広がっていきます。外側の壁で跳ね返ります。

ソースコード
メインクラス

 


 

package program;

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class WavePanel {
   
    public static void main(String[] args) {
       
        JFrame jf = new JFrame("WavePanel");
        jf.setPreferredSize(new Dimension(300,300));
       
        NPane np = new NPane();
        np.setPreferredSize(new Dimension(300,300));
       
        jf.add(np);
       
        jf.pack();
        jf.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                //dispose();
                System.exit(0);
            }
        });
        jf.setResizable(false);
        jf.setVisible(true);
       
       
    }

   
}

表示パネルクラス


package program;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;

public class NPane extends JLabel
implements MouseListener, Runnable{

    int i, j, k, l;
    int[][] data = new int[300][300];
    double[][] datanow = new double[300][300];
    double[][] datapre = new double[300][300];
    double[][] dataprepre = new double[300][300];
    double keisuu = 0.45;
    Thread t;
   
    NPane(){
       
        for(i=0;i<300;i++){
            for(j=0;j<300;j++){
                data[i][j]=125;
                datanow[i][j]=125;
                datapre[i][j]=125;
                dataprepre[i][j]=125;
            }
        }
        this.addMouseListener(this);
        t = new Thread(this);
        t.start();
    }
   
    public void run() {
        try {
            while(true){
               
                for(i=0;i<300;i++){
                    for(j=0;j<300;j++){
                        if(i==0){
                            datanow[i][j]=125;
                        }else if(i==299){
                            datanow[i][j]=125;
                        }else if(j==0){
                            datanow[i][j]=125;
                        }else if(j==299){
                            datanow[i][j]=125;
                        }else{
                            datanow[i][j]=2*(1-2*keisuu)*datapre[i][j]-dataprepre[i][j]
                            +keisuu*(datapre[i+1][j]+datapre[i-1][j]
                            +datapre[i][j+1]+datapre[i][j-1]);
                        }
                       
                       
                    }
                }
               
                for(i=0;i<300;i++){
                    for(j=0;j<300;j++){
                        dataprepre[i][j]=datapre[i][j];
                        datapre[i][j]=datanow[i][j];
                        if(datanow[i][j]>255){
                            datanow[i][j]=255;
                        }else if(datanow[i][j]<0){
                            datanow[i][j]=0;
                        }
                        data[i][j]=(int)datanow[i][j];
                    }
                }
               
                Thread.sleep(100);
               
                repaint();
            }
        }catch(Exception e){
           
        }
    }
   
    public void paint(Graphics g) {
        for(k=0;k<300;k++){
            for(l=0;l<300;l++){
                g.setColor(new Color(data[k][l],data[k][l],255-data[k][l]));
                g.fillRect(k, l, 1, 1);
            }
        }
       
    }

    public void mouseClicked(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    public void mouseEntered(MouseEvent arg0) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    public void mouseExited(MouseEvent arg0) {
        // TODO 自動生成されたメソッド・スタブ
       
    }

    public void mousePressed(MouseEvent me) {
        Point p0 = me.getPoint();
        datanow[p0.x][p0.y]=255;
        datapre[p0.x][p0.y]=255;
        dataprepre[p0.x][p0.y]=255;
        data[p0.x][p0.y]=255;
        repaint();
    }

    public void mouseReleased(MouseEvent me) {
        // TODO 自動生成されたメソッド・スタブ
       
    }
}




解説
波動方程式を差分法で近似的に表現し、スレッドにより一定間隔で新しく計算した答えを描画しています。色が微妙です。外側の境界では値を固定しています。計算した値が色の範囲を超えていたら修正しています。計算方法自体は雑な近似なので…

 

スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/16-da7b49a3
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。