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>