国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

關(guān)于J2ME中定點(diǎn)庫(kù)MathFP使用入門

2019-11-18 12:45:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  眾所周知,CLDC1.0是不支持小數(shù)運(yùn)算的,而CLDC1.1才支持浮點(diǎn)運(yùn)算。但是目前市面上的手機(jī),絕大部分是采用CLDC1.0這種configuration.那我們需要進(jìn)行小數(shù)運(yùn)算怎么辦呢?比如說(shuō)要繪制任意角度的飛機(jī)運(yùn)行軌跡。你當(dāng)然可以自己寫一個(gè)類,用整數(shù)來(lái)模擬定點(diǎn)小數(shù)運(yùn)算(模擬浮點(diǎn)小數(shù)運(yùn)算非常困難),不過(guò)你不必重新發(fā)明輪子,網(wǎng)上有很多用整數(shù)運(yùn)算來(lái)模擬小數(shù)運(yùn)算的代碼庫(kù),而MathFP就是其中非常優(yōu)秀的一個(gè),它健壯,穩(wěn)定,高速,是在J2ME環(huán)境中進(jìn)行小數(shù)運(yùn)算的不二之選,而且最要害的是,它的體積很小。MathFP的下載地址是: http://home.rochester.rr.com/ohommes/MathFP.我下載的版本是基于CLDC的,下載的MathFP版本號(hào)是1.1.2.下載回來(lái)的全部東西就是一個(gè)MathFP.class(該類所在的包名是net.jscience.util),你可以把該類置于你的classpath中進(jìn)行開(kāi)發(fā),發(fā)布軟件的時(shí)候把該class加入到j(luò)ar文件中。或者你也可以把該class反編譯,得到源碼,直接放入你的工程的src目錄中,我這里采用的是后一種做法。記得同時(shí)把MathFP的API文檔下載回來(lái)。
  
  因?yàn)镸athFP是用整數(shù)來(lái)模擬定點(diǎn)小數(shù)的,所以小數(shù)的內(nèi)部表現(xiàn)形式還是一個(gè)整數(shù),但是你一定要記得把表示小數(shù)的整數(shù)和真正的整數(shù)區(qū)別開(kāi)來(lái),否則就會(huì)造成很多難于調(diào)試的bug(一個(gè)小技巧就是表示小數(shù)的整形變量名以FP為后綴).你只需要把握一個(gè)原則,就是首先把要參與小數(shù)運(yùn)算的整數(shù)都轉(zhuǎn)換成小數(shù),然后進(jìn)行小數(shù)運(yùn)算,運(yùn)算完了以后,再把結(jié)果轉(zhuǎn)換成成整數(shù)使用。
  
  下面的這個(gè)例子,就是用來(lái)演示MathFP的基本使用方法的。假定屏幕左下角有一個(gè)點(diǎn),每隔100毫秒,就沿60度的角度向東北方向運(yùn)動(dòng)5個(gè)像素,繪制出此點(diǎn)的運(yùn)動(dòng)軌跡。這個(gè)例子涉及到小數(shù)和三角運(yùn)算,因?yàn)樵擖c(diǎn)x坐標(biāo)的增量是cos60(度),y坐標(biāo)上的增量是-sin60(度)。我們來(lái)看代碼怎么寫
  
  import javax.microedition.lcdui.Canvas;
  import javax.microedition.lcdui.Graphics;
  
  import net.jscience.util.MathFP;
  
  /**
  * 小數(shù)運(yùn)算演示Canvas
  * @author Jagie
  *
  */
  public class FloatCanvas extends Canvas implements Runnable {
  //用于統(tǒng)計(jì)屏幕刷新次數(shù)
  int paintCount;
  //屏幕寬度,高度。定點(diǎn)數(shù)
  int w_FP, h_FP;
  //當(dāng)前點(diǎn)坐標(biāo),前一點(diǎn)坐標(biāo),定點(diǎn)數(shù)
  int curX_FP, curY_FP, lastX_FP, lastY_FP;
  //速率
  public static final int RATE = 5;
  
  public FloatCanvas() {
  w_FP = MathFP.toFP(this.getWidth());
  h_FP = MathFP.toFP(this.getHeight());
  //開(kāi)始點(diǎn)處于屏幕的左下角
  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, w_FP, h_FP);
  }else{
  //畫線
  g.setColor(0x00ff00);
  //把定點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)
  g.drawLine(MathFP.toInt(lastX_FP), MathFP.toInt(lastY_FP), MathFP
  .toInt(curX_FP), MathFP.toInt(curY_FP));
  }
  
  paintCount++;
  
  }
  
  public void run() {
  //當(dāng)前點(diǎn)沒(méi)有超出屏幕時(shí)循環(huán)
  while (curX_FP <= w_FP && curY_FP <= h_FP && MathFP.toInt(curX_FP) >= 0
  && MathFP.toInt(curY_FP) >= 0) {
  //60度角度轉(zhuǎn)換成弧度
  int radians = MathFP.div(MathFP.mul(MathFP.toFP(60), MathFP.PI),
  MathFP.toFP(180));
  //x方向增量
  int deltaX = MathFP.mul(MathFP.toFP(RATE), MathFP.cos(radians));
  //y方向增量
  int deltaY = MathFP.mul(MathFP.toFP(RATE), MathFP.sin(radians));
  //新坐標(biāo),定點(diǎn)數(shù)
  curX_FP = lastX_FP + deltaX;
  curY_FP = lastY_FP - deltaY;
  System.out.println(curX_FP + "," + curY_FP);
  repaint();
  try {
  Thread.sleep(100);
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  //新坐標(biāo)成為舊坐標(biāo)
  lastX_FP = curX_FP;
  lastY_FP = curY_FP;
  }
  }
  
  }
  
  該Canvas在設(shè)備上繪制效果如下圖:
  
關(guān)于J2ME中定點(diǎn)庫(kù)MathFP使用入門

  大家可以看到,曲線正沿60度角的方向朝東北方向不停的增長(zhǎng).
  
  有了這個(gè)定點(diǎn)庫(kù),我們就能在游戲中使用小數(shù)運(yùn)算了,所以一些簡(jiǎn)單的游戲物理算法也可以使用了。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 同仁县| 赤峰市| 云阳县| 右玉县| 呼和浩特市| 乃东县| 宣城市| 抚宁县| 阿拉善右旗| 普安县| 兴和县| 共和县| 广水市| 太康县| 嵊州市| 安泽县| 宁夏| 定陶县| 靖宇县| 改则县| 葫芦岛市| 蓬溪县| 桦川县| 青川县| 内黄县| 湘乡市| 长丰县| 麻阳| 绥中县| 延川县| 阳曲县| 武强县| 博白县| 外汇| 新兴县| 吉林省| 永济市| 姜堰市| 秭归县| 偃师市| 通化县|