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