/**********************************************************************************
 *                                                                                *
 *                         ダイアモンド図形のアプレット                           *
 *                            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に停止状態を設定     */
        }
    }                                           /* ストップメソッド終了      */

}                                               /* クラス設定終了         */

/**********************************************************************************
 *            ダイアモンド図形のアプレット終了              *
 **********************************************************************************/