interface WireFrame {
public void Draw(Graphics g);
public void Rotate();
}
この WireFrame を実現し,回転体を描くクラス FreeSoR を 示そう(ファイル名 FreeSoR.java).
import java.awt.*;
import java.io.*;
import java.lang.*;
import java.applet.*;
public class FreeSoR
implements WireFrame {
private int xx[] =
{70,40,30,20,20,30,20,30,70,70};
private int yy[] =
{-100,20,30,40,60,70,80,90,94,100};
private double x[][]=new double[10][10];
private double y[][]=new double[10][10];
private double z[][]=new double[10][10];
private double alpha=Math.PI/15;
private double beta=Math.PI/15;
private double gamma=Math.PI/15;
private double delta=Math.PI/5;
private Dimension s; private int n;
FreeSoR(Dimension s,int n) {
this.s = s; this.n = n;
for( int i=0; i<10; i++ ) {
x[0][i] = xx[i]; y[0][i] = yy[i];
z[0][i] = 0;
}
double x1, z1;
for( int i=0; i<9; i++ )
for( int j=0; j<10; j++ ) {
x1 = x[i][j]; z1 = z[i][j];
x[i+1][j]=x1*Math.cos(delta)+
z1*Math.sin(delta);
y[i+1][j]=y[i][j];
z[i+1][j]=-x1*Math.sin(delta)+
z1*Math.cos(delta);
}
}
public void Draw(Graphics g) {
g.setColor(Color.black);
int h = n / 3; int v = n % 3;
int x1, y1, x2, y2;
int wu = s.width/3;
int hu = s.height/4;
for( int i=0; i<10; i++)
for( int j=0; j<10; j++) {
x1=(int)(x[i][j]/3)+(h+1)*wu;
y1=(int)(y[i][j]/3)+(v+1)*hu;
x2=(int)(x[(i+1)%10][j]/3)+
(h+1)*wu;
y2=(int)(y[(i+1)%10][j]/3)+
(v+1)*hu;
g.drawLine(x1,y1,x2,y2);
}
for( int i=0; i<10; i++)
for( int j=0; j<9; j++) {
x1=(int)(x[i][j]/3)+(h+1)*wu;
y1=(int)(y[i][j]/3)+(v+1)*hu;
x2=(int)(x[i][(j+1)%10]/3)+
(h+1)*wu;
y2=(int)(y[i][(j+1)%10]/3)+
(v+1)*hu;
g.drawLine(x1,y1,x2,y2);
}
}
public void Rotate() {
double x1,x2,x3,y1,y2,y3,z1,z2;
for( int i=0; i<10; i++ )
for( int j=0; j<10; j++ ) {
x1=x[i][j];y1=y[i][j];
z1=z[i][j];x2=x1;
y2=y1*Math.cos(alpha)-
z1*Math.sin(alpha);
z2=y1*Math.sin(alpha)+
z1*Math.cos(alpha);
x3=x2*Math.cos(beta)+
z2*Math.sin(beta);
y3 = y2;
x[i][j]=x3*Math.cos(gamma)-
y3*Math.sin(gamma);
y[i][j]=x3*Math.sin(gamma)+
y3*Math.cos(gamma);
z[i][j]=-x2*Math.sin(beta)+
z2*Math.cos(beta);
}
}
}
このクラス FreeSoR のインスタンスを生成し,メソッド Rotate を 呼出すことにより回転体を回転するスレッドを生成しょう import java.awt.*;
import java.applet.*;
public class Sample extends Applet
implements Runnable {
private FreeSoR l;
public void init() {
l = new FreeSoR(size(),0);
Thread t = new Thread(this);
t.start();
}
public void paint(Graphics g) {
l.Draw(g);
}
public void run() {
while(true) { l.Rotate(); repaint(); }
}
}
このアプレットを実行するためには,以下の HTML ファイルを必要とする(ファイル名 Sample.html).
<applet code="Sample.class" width=400
height=400></applet>