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) {
}
}
}
}