/*
3次元グラフィックス表示プログラム A'
(とりあえず、図形をひとつだけ表示してみたもの)
((paint()メソッド内で図形表示を行う)
(「30」さんの挑戦への回答:これで勘弁してくださいm(__)m)
*/
import java.applet.*;
import java.awt.*;
public class Graphics3D_A extends Applet implements Runnable {
int icnt; // ループカウンタなど用のワーク変数
int x3d, y3d, z; // 3次元座標軸上でのx、y、zの値
int x2d, y2d; // 2次元座標軸上でのx、yの値
int max[] = new int[400]; // 最大値格納用配列
int min[] = new int[400]; // 最小値格納用配列
Thread Th; // スレッド
boolean d_flag; // 表示判定用フラグ
int wait_time; // 待ち時間
public void init() {
Th = null;
d_flag = false; // フラグの初期化
// 待ち時間の取り出し
wait_time = Integer.parseInt(getParameter("WAIT_TIME"));
}
public void start() { // スレッドを作成・開始
if (Th == null){
Th = new Thread(this);
Th.start();
}
}
public void run() { // 3次元図形を表示
d_flag = true;
repaint();
}
public void paint(Graphics g) {
if ( d_flag ) {
// 最大値/最小値配列の初期化
for ( icnt=0; icnt<400; icnt++ ) {
max[icnt] = 0;
min[icnt] = 400;
}
g.drawString("3次元グラフィックス表示プログラム A'",100,30);
g.drawString("(paint()メソッド内で図形表示を行う)",100,45);
// 3次元図形表示処理
for ( y3d=0; y3d<128; y3d +=2 ) {
for ( x3d=0; x3d<160; x3d +=2 ) {
// Z値算出処理(任意の関数 z=f(x3d,
y3d) に置き換え可能)
if (((x3d >= 20) && (x3d <= 140)) &&
((y3d >= 20) && (y3d <= 108))) {
z = ((x3d - 80) * (x3d - 80)) / 60 + ((y3d - 64)
* (y3d - 64)) / 40;
} else {
z = 110;
}
// 3次元→2次元座標変換処理
x2d = 200 - (x3d - y3d);
y2d = z + 290 - ((x3d / 4) + (y3d / 2) + 100);
// 陰線処理(最大値/最小値判定による)
if ((y2d >= max[x2d]) || (y2d <= min[x2d])) {
if (y2d >= max[x2d]) {
max[x2d] = y2d;
}
if (y2d <= min[x2d]) {
min[x2d] = y2d;
}
if ((y2d >= 0) && (y2d < 500)) {
// 直線を用いて点を描画する
g.drawLine(x2d, y2d, x2d+1, y2d);
// 描画後、ちょっと待たせる
for (icnt=0; icnt<wait_time; icnt++) ;
}
}
}
}
}
}
}