/********************************************************************************** * * * ダイアモンド図形のアプレット * * Diamond diagram Applet * * ( Diamond.java ) * * Author : Seiichi Inoue * **********************************************************************************/ /******************** << インポートパッケージクラス定義 >> ******************/ import java.applet.Applet; /* Appletパッケージ */ import java.awt.*; /* Abstract Windowing Toolkitパッケージの全て*/ import java.lang.Math; /* Mathパッケージ */ /************************ << 自分のクラス定義 >> ****************************/ // クラス名称 : Diamond // アクセス制御 : public(どのクラスからもアクセス可能) // 継承クラス : Applet // 引継クラス : Runnable // 入力パラメータ: NANE="r" (半径) // NAME="node" (ノード数) public class Diamond extends Applet implements Runnable { /************************** << クラス変数属性の宣言 >> **********************/ Thread kicker=null; /* スレッド制御(初期値:停止) */ Dimension d; /* 表示領域 */ Image offs; /* オフスクリーンエリア */ Graphics grf; /* 描画領域 */ Color color; /* 線の色 */ int red,green,blue; /* 線の色成分格納 */ String param; /* パラメータ引き取り */ int r; /* 描画半径 */ int n; /* ノード数 */ int x; /* 描画オフセット(横軸) */ int y; /* 描画オフセット(縦軸) */ int k; /* 線の引き始め位置カウンタ */ int x1; /* 線の引き始め横軸(x)座標 */ int y1; /* 線の引き始め縦軸(y)座標 */ int j; /* 線の引き終わり位置カウンタ */ int x2; /* 線の引き終わり横軸(x)座標 */ int y2; /* 線の引き終わり縦軸(y)座標 */ /******************** << クラスのメッソード指定(実行手順) >> **************/ /*********** 初期化(init)メッソード ***********/ public void init() { d = size(); /* 表示画面サイズ情報を設定 */ offs = createImage(d.width,d.height); /* オフスクリーン用表示エリア作成 */ grf = offs.getGraphics(); /* グラヒックオブジェクト取得 */ grf.setColor(Color.white); /* 背景色設定(白) */ grf.fillRect(0,0,d.width,d.height); /* 背景色塗りつぶし */ param = getParameter("r"); /* 半径パラメータ取込 */ r = (param != null)? /* 入力判定(無指定時:100ピクセル)*/ Integer.parseInt(param): 100; param = getParameter("node"); /* ノード数パラメータ取込 */ n = (param != null)? /* 入力判定(無指定時:16ノード) */ Integer.parseInt(param): 16; } /********** スタート(start)メソッド **********/ public void start() { if ( kicker == null ) { /* kickerがnull?(停止中?) */ kicker = new Thread(this); /* YES:kickerを動作中に設定 */ kicker.start(); /* startを設定 */ } } /* スタートメソッド終了 */ /*********** 繰り返し(run)メソッド ***********/ public void run() { Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3); while( kicker != null) { /* kickerがnullになるまで繰り返し */ try { /* 割り込み確認 */ red = (int) ( Math.random()*256 ); /* 赤色成分ランダム生成 */ green = (int) ( Math.random()*256); /* 緑色成分ランダム生成 */ blue = (int) (Math.random()*256); /* 青色成分ランダム生成 */ color = new Color( red,green,blue ); /* 線の色設定 */ double rd=3.14159/180; /* 角度値を64ビット値とする */ for ( k=0; k<=n-2; k++ ) { /* 線の描画開始座標計算 */ x1 = (int) ( r*Math.cos( k*360/n*rd ) + r ); /* 開始 x 座標 */ y1 = (int) ( r*Math.sin( k*360/n*rd ) + r ); /* 開始 y 座標 */ x = ( d.width - r*2 )/2; /* 描画オフセット(横)計算 */ if ( x <= 0 ) /* オフセット判定(負?) */ x = 0; /* YES:ゼロ設定 */ x1 += x; /* 開始座標オフセット(横)加算 */ y = ( d.height - r*2 )/2; /* 描画オフセット(縦)計算 */ if ( y <= 0 ) /* オフセット判定(負?) */ y = 0; /* YES:ゼロ設定 */ y1 += y; /* 開始座標オフセット(縦)加算 */ for ( j=k+1; j<=n-1; j++ ) {/* 線の描画終了座標計算 */ x2 = (int) ( r*Math.cos( j*360/n*rd ) + r );/* 終了 x 座標*/ y2 = (int) ( r*Math.sin( j*360/n*rd ) + r );/* 終了 y 座標*/ x2 += x; /* 終了点オフセット(横)加算 */ y2 += y; /* 終了点オフセット(縦)加算 */ kicker.sleep(20); /* 線描画待ち合わせ(20mSEC) */ repaint(); /* 描画メソッド呼び出し */ } } kicker.sleep(2000); /* 次の描画待ち時間:2秒 */ } catch(InterruptedException e) {} /* 割り込み処理 */ } kicker = null; /* 繰り返し処理終了設定 */ } /* 繰り返しメソッド終了 */ /************ 更新(update)メソッド ***********/ public void update(Graphics g) { /* 画面のちらつきを無くす */ paint(g); /* 描画 */ } /* 更新メソッド終了 */ /************ 描画(paint)メソッド ************/ public void paint(Graphics g) { grf.setColor( color ); /* 線の色設定 */ grf.drawLine( x1,y1,x2,y2 ); /* 線の描画 */ g.drawImage(offs,0,0,this); /* 描画設定 */ } /********** ストップ(stop)メソッド *********/ public void stop() { if( kicker != null ) { /* kickerがnullでない?(動作中?) */ kicker.stop(); /* kickerを停止に設定 */ kicker = null; /* kickerに停止状態を設定 */ } } /* ストップメソッド終了 */ } /* クラス設定終了 */ /********************************************************************************** * ダイアモンド図形のアプレット終了 * **********************************************************************************/