/* 3次元グラフィックス表示プログラム A(Palm 用バージョン) (とりあえず、図形をひとつだけ表示してみたもの) */ import spotless.*; public class Graphics3D_A extends Spotlet { int icnt; // ループカウンタなど用のワーク変数 int x3d, y3d, z; // 3次元座標軸上でのx、y、zの値 int x2d, y2d; // 2次元座標軸上でのx、yの値 int max[] = new int[200]; // 最大値格納用配列 int min[] = new int[200]; // 最小値格納用配列 int wait_time = 5; // 待ち時間(初期値として設定しておく) Graphics g; // グラフィックス表示用クラス // Spotletの登録 public static void main( String args[] ) { (new Graphics3D_A()).register(); } // Graphics3D_A のコンストラクタ public Graphics3D_A() { // 最大値/最小値配列の初期化 for ( icnt=0; icnt<200; icnt++ ) { max[icnt] = 0; min[icnt] = 200; } // Graphicオブジェクトの取得 g = Graphics.getGraphics(); g.clearScreen(); // 画面の消去 g.drawString("3D Graphics Display A",30,0); // 3次元図形表示処理 for ( y3d=0; y3d<64; y3d++ ) { for ( x3d=0; x3d<80; x3d++ ) { // Z値算出処理(任意の関数 z=f(x3d, y3d) に置き換え可能) if (((x3d >= 10) && (x3d <= 70)) && ((y3d >= 10) && (y3d <= 54))) { z = ((x3d - 40) * (x3d - 40)) / 30 + ((y3d - 32) * (y3d - 32)) / 20; } else { z = 55; } // 3次元→2次元座標変換処理 x2d = 85 - (x3d - y3d); y2d = z + 140 - ((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 < 160)) { // 直線を用いて点を描画する g.drawLine(x2d, y2d, x2d+1, y2d, g.PLAIN); if (wait_time != 0) { // 描画後、ちょっと待たせる for (icnt=0; icnt < wait_time; icnt++) { ; } } } } } } } }