首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 定點數學庫 MathFP 入門:CLDC 1.0 無浮點環境下的三角函數運算

     編輯:J2ME

CLDC 1.0 不支援浮點運算,MathFP 以整數模擬定點小數,提供健壯、高速、體積小的數學庫,是 J2ME 遊戲物理/軌跡計算的最佳選擇。

基本原則

  1. 參與運算的整數先轉定點數:MathFP.toFP(int)
  2. 使用 MathFP 方法運算:add/mul/div/cos/sin/PI 等
  3. 結果轉回整數使用:MathFP.toInt(int)
  4. 變數命名建議以 FP 結尾區分 (如 x_FP)

範例:60 度角每 100ms 移動 5 像素繪製軌跡

public class FloatCanvas extends Canvas implements Runnable {
    int paintCount;
    int w_FP, h_FP;           // 螢幕尺寸定點數
    int curX_FP, curY_FP;     // 當前座標定點數
    int lastX_FP, lastY_FP;   // 上一座標定點數
    static final int RATE = 5;

    public FloatCanvas() {
        w_FP = MathFP.toFP(getWidth());
        h_FP = MathFP.toFP(getHeight());
        lastX_FP = MathFP.toFP(0);
        lastY_FP = h_FP; // 左下角起始
        new Thread(this).start();
    }

    protected void paint(Graphics g) {
        if (paintCount == 0) { g.setColor(0); g.fillRect(0,0,getWidth(),getHeight()); }
        else {
            g.setColor(0x00ff00);
            g.drawLine(MathFP.toInt(lastX_FP), MathFP.toInt(lastY_FP),
                       MathFP.toInt(curX_FP), MathFP.toInt(curY_FP));
        }
        paintCount++;
    }

    public void run() {
        while (curX_FP <= w_FP && curY_FP <= h_FP 
               && MathFP.toInt(curX_FP) >= 0 && MathFP.toInt(curY_FP) >= 0) {
            // 60度 -> 弧度
            int radians = MathFP.div(MathFP.mul(MathFP.toFP(60), MathFP.PI), MathFP.toFP(180));
            // 增量
            int deltaX = MathFP.mul(MathFP.toFP(RATE), MathFP.cos(radians));
            int deltaY = MathFP.mul(MathFP.toFP(RATE), MathFP.sin(radians));
            // 新座標
            curX_FP = lastX_FP + deltaX;
            curY_FP = lastY_FP - deltaY; // Y軸向下
            repaint();
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            lastX_FP = curX_FP; lastY_FP = curY_FP;
        }
    }
}

曲線沿 60 度方向延伸,驗證三角函數運算正確。有了 MathFP,簡單遊戲物理 (拋物線、碰撞反射) 皆可實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved