选择显示字体大小

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 &#123;     //用于统计屏幕刷新次数     int paintcount;     //屏幕宽度,高度。定点数     int w_fp, h_fp;     //当前点坐标,前一点坐标,定点数     int curx_fp, cury_fp, 	lastx_fp, lasty_fp;     //速率     public static final int rate = 5;     public floatcanvas() 	&#123;         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();     &#125;     protected void paint(graphics g) 	&#123;         //第一次只是清屏         if (paintcount == 0) 		&#123;             g.setcolor(0);             g.fillrect(0, 0, w_fp, h_fp);         &#125;		else		&#123;             //画线             g.setcolor(0x00ff00);             //把定点数转换成整数             g.drawline(mathfp.toint(lastx_fp),			mathfp.toint(lasty_fp), mathfp    .toint(curx_fp), mathfp.toint(cury_fp));         &#125;                          paintcount++;              &#125;     public void run() 	&#123;         //当前点没有超出屏幕时循环         while (curx_fp <= w_fp &&		cury_fp <= h_fp 		&& mathfp.toint(curx_fp) >= 0                 && mathfp.toint(cury_fp) 				>= 0) &#123;             //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 &#123;                 thread.sleep(100);             &#125; catch (interruptedexception e) &#123;                 // todo auto-generated catch block                 e.printstacktrace();             &#125;             //新坐标成为旧坐标             lastx_fp = curx_fp;             lasty_fp = cury_fp;         &#125;     &#125; &#125;


该canvas在设备上绘制效果如下图:



大家可以看到,曲线正沿60度角的方向朝东北方向不停的增长。有了这个定点库,我们就能在游戏中使用小数运算了,所以一些简单的游戏物理算法也可以使用了。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons