当前页面位置: » 丰搜网 » 文档中心 » 详细内容
j2me中定点库mathfp使用入门
你当然可以自己写一个类,用整数来模拟定点小数运算(模拟浮点小数运算非常困难),不过你不必重新发明轮子,网上有很多用整数运算来模拟小数运算的代码库,而mathfp就是其中非常优秀的一个,它健壮,稳定,高速,是在j2me环境中进行小数运算的不二之选,而且最关键的是,它的体积很小。mathfp的下载地址是:http://home.rochester.rr.com/ohom
mes/mathfp。
我下载的版本是基于cldc的,下载的mathfp版本号是1.1.2.下载回来的全部东西就是一个mathfp.class(该类所在的包名.net.jscience.util),你可以把该类置于你的classpath中进行开发,发布软件的时候把该class加入到jar文件中。
或者你也可以把该class反编译,得到源码,直接放入你的工程的src目录中,我这里采用的是后一种做法。记得同时把mathfp的api文档下载回来。因为mathfp是用整数来模拟定点小数的,所以小数的内部表现形式还是一个整数,但是你一定要记得把表示小数的整数和真正的整数区别开来,否则就会造成很多难于调试的bug(一个小技巧就是表示小数的整形变量名以fp为后缀)。你只需要掌握一个原则,就是首先把要参与小数运算的整数都转换成小数,然后进行小数运算,运算完了以后,再把结果转换成成整数使用。
下面的这个例子,就是用来演示mathfp的基本使用方法的。假定屏幕左下角有一个点,每隔100毫秒,就沿60度的角度向东北方向运动5个像素,绘制出此点的运动轨迹。这个例子涉及到小数和三角运算,因为该点x坐标的增量是cos60(度),y坐标上的增量是-sin60(度)。我们来看代码怎么写:
import javax.microedition.lcdui.canvas; import javax.microedition.lcdui.graphics; import.net.jscience.util.mathfp; /** * 小数运算演示canvas * @author jagie * */ public class floatcanvas extends canvas implements runnable { //用于统计屏幕刷新次数 int paintcount; //屏幕宽度,高度。定点数 int w_fp, h_fp; //当前点坐标,前一点坐标,定点数 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()); //开始点处于屏幕的左下角 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); //把定点数转换成整数 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)); //x方向增量 int deltax = mathfp.mul(mathfp.tofp(rate), mathfp.cos(radians)); //y方向增量 int deltay = mathfp.mul(mathfp.tofp(rate), mathfp.sin(radians)); //新坐标,定点数 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(); } //新坐标成为旧坐标 lastx_fp = curx_fp; lasty_fp = cury_fp; } } } |
该canvas在设备上绘制效果如下图:
大家可以看到,曲线正沿60度角的方向朝东北方向不停的增长。有了这个定点库,我们就能在
游戏中使用小数运算了,所以一些简单的
游戏物理算法也可以使用了。