なんかカッコいい奴
■課題
なんかカッコいい立体の実装。
■アルゴリズム
・回転
三角関数を用いて移動する4点を計算し、左右の回転を表現する。
また、x座標が固定された2点を上下に移動させ、奥行きに対する回転を表現する。
・描画
各頂点3つを結び、立体の面を描画する。
■プログラムの説明
配列x,yには移動する頂点の座標が格納されている。変数mb,mcは上下に移動する2点のy座標に用いる。補正a,b,cに用いる連続する任意の値にはSystem.currentTimeMillis()から日時の値を参照した。
面の描画には配列fx,fy,gyに代入した値を用いて、fillPolygonで塗りつぶす処理を行っている。fillPolygonを用いているため、ImageファイルからBufferedImageを作成し面テクスチャを実装する事が出来るが、今回は立体感の表現を優先し透過度を設定した色を使用した。
threadにより三角関数の角度degが加算され、頂点の座標が連続して移動する。
■実行結果
<図1.実行画面>
実行結果は課題を満たしている。
日付の値を割る数が大きいほど、奥行きの回転は遅くなる。
■考察
すごかった。
ソースは下記を参照。
package mathe;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
/* <applet code="Main.class" width=800 height=800> */
public class Mathe extends Applet implements Runnable{
Graphics db;
Image buf;
int frame_x=450, frame_y=450; //描画サイズ
int deg;
int x[] = new int [4];
int y[] = new int [4];
Thread t1;
public void init() {
buf = createImage( frame_x , frame_y );
deg = 0;
t1 = new Thread(this);
t1.start();
setBackground(Color.white); // アプレットの背景色を白に設定.
}
public void update(Graphics g){
paint(g);
}
public void paint (Graphics g){
db = buf.getGraphics();
db.setColor(Color.gray);
db.fillRect(0 , 0 , frame_x , frame_y);
db.setColor(Color.black);
db.fillRect(10 , 10 , frame_x-20 , frame_y-20);
db.setColor(Color.white);
//アンチエイリアス処理
Graphics2D g2 = (Graphics2D)db;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING ,
RenderingHints.VALUE_ANTIALIAS_ON );
double date = System.currentTimeMillis()/15.0;
double a = Math.sin(Math.PI/180*date);
double b = Math.sin(Math.PI/180*date+Math.PI/2)*150;
double c = Math.sin(Math.PI/180*date-Math.PI/2)*150;
for(int i = 0; i < 4; i++){
double sin = Math.sin(Math.PI/180*(deg+90*i))*150*a;
double cos = Math.cos(Math.PI/180*(deg+90*i))*150;
x[i]=(int)cos+200;
y[i]=(int)sin+200;
}
int mb = (int)b+200;
int mc = (int)c+200;
for(int i = 0; i < 4; i++){
int fx[] = {x[i],x[(i+1)%4],200};
int fy[] = {y[i],y[(i+1)%4],mb};
int gy[] = {y[i],y[(i+1)%4],mc};
int cr = (300*(i+1))%255;
int cg = (600*(i+1))%255;
int cb = (190*(i+1))%255;
db.setColor(new Color(cr,cg,cb,100));
db.fillPolygon(fx,fy, 3);
cr = (cr+15)%255;
cg = (cg+15)%255;
cb = (cb+15)%255;
db.setColor(new Color(cr,cg,cb,100));
db.fillPolygon(fx,gy, 3);
}
db.fillRect(200-5,mb-5,10,10);
db.fillRect(200-5,mc-5,10,10);
for(int i = 0; i < 4; i++){
db.fillRect(x[i]-5,y[i]-5,10,10);
db.drawLine(x[i],y[i],200,mc);
db.drawLine(x[i],y[i],200,mb);
db.drawLine(x[i],y[i],x[(i+1)%4],y[(i+1)%4]);
}
g.drawImage(buf,0,0,this);
}
public void run() {
try{
while(true){
deg+=1;
if(deg<120)deg+=1;
if(deg<240)deg+=1;
if(deg<270)deg+=1;
if(deg<300)deg+=1;
if(deg<330)deg+=1;
if(deg>360)deg=0;
repaint();
Thread.sleep(20);
}
}catch(Exception e){
System.out.println( e );
}
}
}