Ex13_3



/*-------------------------------------------
 Ex13_3.java
 スレッド処理によるアニメーション3(対数螺旋)
 --------------------------------------------*/
import java.applet.*;
import java.awt.*;

public class Ex13_3 extends Applet implements Runnable {
	double theta, a, b;	// 回転角θ, 定数a, b 用変数宣言
	int cx, cy, x1, y1, x2, y2, wid, hei;	// 座標(x1,y1), (x2,y2), 螺旋中心位置(cx,cy), 幅wid, 高さhei
	int rr, gg, bb;			// 色設定(rr,gg,bb)用の変数宣言
	int num;				// 描画回数
	Color col;				// 色クラス宣言
	Thread thd = null;		// スレッド宣言

	public void init() {		// 初期設定
		this.setSize(500, 500);		// アプレット描画領域 500x500
		cx = 200; cy = 120;		// 中心位置(cx,cy) = (200,120)
		num = 330;				// 描画回数 330回
		theta = 2*Math.PI / 60;	// 回転角 2π/60 ラジアン
		a = 1.2; b = 0.15;		// 対数らせん定数
		rr = 255; gg = 0; bb = 0;	// 初期色(rr,gg,bb)
		col = new Color(rr,gg,bb);
		thd = new Thread(this);	// 新スレッド生成
		thd.start();				// スレッド開始
	}

	public void update(Graphics g) {	// 上書きして描画したい場合に使うメソッド
		paint(g);
	}

	public void paint(Graphics g) {
		g.setColor(col);			// 色セット
		g.drawOval(x1, y1, wid, hei);	// 楕円描画
	}

	public void run() {	// スレッド開始時に呼び出されるメソッド
		for(int i=0; i<num; i++) {		// num回ループ
			rr = (rr + 10*i) % 255;		// 赤色光:10*iずつ増光 & 0-255内におさめるための剰余計算
			gg = (gg + 20*i) % 255;		// 緑色光:20*iずつ増光 & 0-255内におさめるための剰余計算
			bb = (bb + 30*i) % 255;		// 青色光:30*iずつ増光 & 0-255内におさめるための剰余計算
			col = new Color(rr,gg,bb);

			x1 = cx + (int)(a * Math.exp(b * theta * i) * Math.cos(theta * i));
			y1 = cy + (int)(a * Math.exp(b * theta * i) * Math.sin(theta * i));
			wid = (int)(a * Math.exp(b * theta * i));
			hei = (int)(a * Math.exp(b * theta * i));

			repaint();			// 再描画:paint()メソッドを呼び出し

			try {
				thd.sleep(15);	// スレッド一時停止:15ミリ秒
			} catch(InterruptedException e) {
			}
		}
	}

}