Ex13_4



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

public class Ex13_4 extends Applet implements Runnable {
	double theta, scale;	// 回転角θ, 縮小率scale
	final int cx = 205, cy = 205;				// 螺旋中心位置(cx,cy)
	final int[] dx = {-200, 200, 200,-200};	// 四隅のx座標
	final int[] dy = {-200,-200, 200, 200};	// 四隅のy座標
	int[] x = new int[4];		// 矩形の四隅:x座標用
	int[] y = new int[4];		// 矩形の四隅:y座標用
	int tmp, i, j;
	boolean flg = true;		// 画面クリア用フラグ(true=矩形描画, false=画面クリア)
	int rr, gg, bb;			// 色設定(rr,gg,bb)用の変数宣言
	int num;				// 描画回数
	Color col;				// 色クラス宣言
	Thread thd = null;		// スレッド宣言

	public void init() {		// 初期設定
		this.setSize(410, 410);		// アプレット描画領域 410x410
		num = 36;				// 描画回数 36回
		theta = 2*Math.PI / 36;	// 回転角 2π/36 ラジアン
		scale = 9.0/10.0;		// 縮小率 9/10
		thd = new Thread(this);	// 新スレッド生成
		thd.start();				// スレッド開始
	}

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

	public void paint(Graphics g) {
		if (flg) {
			g.setColor(col);				// 色セット
			g.drawPolygon(x, y, x.length);	// 多角形描画
		} else {
			g.clearRect(0, 0, 410, 410);	// 画面クリアメソッド:(0,0)〜(410,410)内をクリア
			flg = true;
		}
	}

	public void run() {	// スレッド開始時に呼び出されるメソッド
		while (true) {
			for(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);

				for (j=0; j<4; j++) {
					x[j] = (int)(dx[j] * Math.pow(scale, i));
					y[j] = (int)(dy[j] * Math.pow(scale, i));
					tmp = cx + rotate_x(x[j], y[j], theta*i);
					y[j] = cy + rotate_y(x[j], y[j], theta*i);
					x[j] = tmp;
				}
				repaint();			// 再描画:paint()メソッドを呼び出し
				try {
					thd.sleep(100);	// スレッド一時停止:15ミリ秒
				} catch(InterruptedException e) {
				}
			}
			flg = false;
		}
	}

	public int rotate_x(int cx, int cy, double r) {
		int tx;
		tx = (int)(Math.cos(r) * cx - Math.sin(r) * cy);
		return(tx);
	}

	public int rotate_y(int cx, int cy, double r) {
		int ty;
		ty = (int)(Math.sin(r) * cx + Math.sin(r) * cy);
		return(ty);
	}
}