/* 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