< 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 クラスを使うためには
} // ダミーでこのメソッドを書いておかないと
} // コンパイルでエラーとなった
}