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






< iアプリ 版 Java でのソースプログラム内容 >

/*
  3次元グラフィックス表示プログラム A (iアプリ用バージョン)
  (とりあえず、図形をひとつだけ表示してみたもの)
*/
import com.nttdocomo.ui.*;

public class Graphics3D_A extends IApplication {
  private static Main main;
  int icnt;                   // ループカウンタなど用のワーク変数
  int x3d, y3d, z;              // 3次元座標軸上でのx、y、zの値
  int x2d, y2d;                // 2次元座標軸上でのx、yの値
  int max[] = new int[120];       // 最大値格納用配列
  int min[] = new int[120];       // 最小値格納用配列
  Thread Th;                // スレッド
  int wait_time = 5;            // 待ち時間(msec 単位。初期値として、ここで設定しておく)
  Graphics g;               // グラフィックス表示用オブジェクト

  public void init() {
    Th = null;              // スレッドの初期化(停止させておく)
                       // 最大値/最小値配列の初期化を、ここで行おうとすると
                       // 何故か、初期化できなかった → start() に移動
  }

  public void start() {
                       // 最大値/最小値配列の初期化
    for ( icnt=0; icnt<120; icnt++ ) {
      max[icnt] = 0;
      min[icnt] = 120;
    }
    main = new Main();
    Display.setCurrent(main);
    Th = new Thread(main);
    Th.start();
  }

                       // Canvasクラスを継承したMain() コンストラクタ
  public class Main extends Canvas implements Runnable {
    public Main() {
    }

    public void run() {        // 3次元図形を表示
      g = getGraphics();
      g.setColor(Graphics.getColorOfName(Graphics.BLACK));
      g.drawString("3D Graphics A",20,20);
                      // 3次元図形表示処理
      for ( y3d=0; y3d<50; y3d++ ) {
        for ( x3d=0; x3d<70; x3d++ ) {
                      // Z値算出処理(任意の関数 z=f(x3d, y3d) に置き換え可能)
          if (((x3d >= 10) && (x3d <= 60)) && ((y3d >= 10) && (y3d <= 40))) {
            z = ((x3d - 35) * (x3d - 35)) / 25 + ((y3d - 25) * (y3d - 25)) / 15;
          } else {
            z = 41;
          }
                      // 3次元→2次元座標変換処理
          x2d = 69 - (x3d - y3d);
          y2d = z + 115 - ((x3d / 4) + (y3d / 2) + 50);

                      // 陰線処理(最大値/最小値判定による)
          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 < 120)) {
                      // 直線を用いて点を描画する
              g.drawLine(x2d, y2d, x2d+1, y2d);
              if (wait_time != 0) {
                try { // 描画後、ちょっと待たせる
                  Thread.sleep(wait_time);
                }
                catch (Exception e) { ; }
              }
            }
          }
        }
      }
    }

    public void paint(Graphics g) {  // Canvas クラスを使うためには
    }                    // ダミーでこのメソッドを書いておかないと
  }                      // コンパイルでエラーとなった
}