ブラウザの[戻る]を押してね!



< 本アプレットのJavaソースプログラム >

/*
  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++)  ;
            }
          }
        }
      }
    }
  }
}