2008年12月5日金曜日

TA関連

プログラミングの授業をTAでしていて、今週から最終のグループ課題が始まった。ワタシらは言語がJavaに切り替わった最初の代だったので、方針とか固まってなかったせいか、個人でする課題だけで、アプレットに適当に図形出して終わりとかだったんだが、今のグループ課題ってのは班ごとに描画ソフトウェアつくってこいとか結構いかつい課題が出るみたいだ。最近の子はたいへんやねぇ~とか思ってたら、各班に一人TAがついて面倒見るってことなので、他人事じゃなくなった。

課題は選択なので、なんとかして楽勝なのを選んでもらおうと誘導を試みる。非線形微分方程式の数値計算のが一番楽だしGUIも大していらんし超お勧めだったんだが、学部生は数値計算を避けたがるぽい。全然凝ってない差分方程式とかアルゴリズムも課題文に書いてあるようなもんだし一番楽やのに。カオスとかにも絡んできて結構面白いと思うんやけどなぁ。結局クリスマスツリー+イルミネーションを表示するていう課題になったらしい。

Fortranの人なのでJavaで描画とか全然わかんねぇよと思いながら、片手間にちょろっと調べてみる。聞かれてわかんねーとかDの面目がね・・・(専門外だけど)。まぁそれにDMRGやらサイトパーコレーションのJavaアプレット作成例とかもあるし、物理屋も可視化の方法を知っておくのは悪くなかろうと。

まず必須の機能である「・マウスで選択した部分に・電球を示すブツを配置して・点滅させる」をどう実現するかを考える。Swingはなんかしんどそーなのでとりあえずアプレットを作る。
いちおうそれっぽいのが実現したのでメモ

import java.awt.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.*;

public class Myapplet extends Applet implements Runnable{
    String status;
    int radius=20;
    boolean flag=true;
    private final int MAX=100;        // 描ける丸の最大数
    private int num=0;            // 描かれている丸の数
    private Point[] oval=new Point[MAX];    // 座標を保持するための配列
    public static final Color[] pal = new Color[256];//色の情報を保持
    Thread th;
   
    static
    {
        for(int c=0;c<256;c++)
        {
            pal[c]=new Color(c,c,0);
        }
    }
    public void init(){
        //初期化
       
        setBackground(Color.black);
        setForeground(Color.black);
        setFont(new Font("Serif", Font.BOLD, 20));
        //リスナークラスのインスタンス化
        EventHandler eh = new EventHandler(this);
        //フィールドの初期化
        status="out";
        //リスナーの追加
        this.addMouseListener(eh);
       
    }


    public void start(){
        //開始
        th = new Thread(this);
        th.start();
    }
   
    public void run(){

      for(;;){
          repaint();
            flag=! flag;
            try{
                   Thread.sleep(300);//スレッドの停止(点滅させる)
                }
                catch(InterruptedException e){
                }

        }
    }
   
    public void paint (Graphics g){
        if (flag==true){
             for (int i=0;i<num ;i++){
                 g.clearRect(oval[i].x-radius/2,oval[i].y-radius/2,radius,radius);
                 //描画した円がある部分をクリアする
                 }
        }
       
        else{
     for (int i=0;i<num ;i++){
        for(int j=radius;j>0;j-=2)
            {
                int c=255-255*j/25;
                g.setColor(pal[c]);//重ねて描画すると電球ぽく
                g.fillOval(oval[i].x-j/2,oval[i].y-j/2,j,j);
            }
        }
        }
           
    }

    public void stop(){}
    public void destroy(){}
   
    class EventHandler implements MouseListener {
        Myapplet apl;
        EventHandler(Myapplet obj){
            apl = obj;
          }
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}

        public void mouseClicked(MouseEvent e) {
             if(num<MAX){        // 最大数を超えていなければ、
                 oval[num]=new Point(e.getX(),e.getY());    // 座標を保存
                 num++;            // 円の数を1つ増やす
                 repaint();        // 再描画する
               }
                               
        }
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
    }
}

まぁ最低限、点滅する電球的なものを作れることはわかった。あとは背景に画像を入れたり、描画した部分のクリアのしかたをもうちょっと何とかしたり、ボタン作って色選択したりとかかねー。それにしてもJavaって長い名前多いな。ややこしい。イベントハンドラをインスタンス化とか言われても宇宙語?って感じっす。あー学生になんて説明したらいいんだ?


0 コメント: