在J2ME/MIDP中实现图像旋转摘要图形图像的旋转在移动应用程序开发,特别是游戏开发过程中有着现实的需求
但J2ME对此提供的支持却十分有限,如MIDP2
0仅支持图像成90度整数倍的旋转
针对这种情况,本文提出了一种实现图像任意角度旋转的方案并提供了算法实现
然后对算法的应用问题进行了探讨,分析了算法的局限性
最后介绍了在j2me中实现旋转的另外两种参考性方案
2D旋转的数据基础考虑笛卡儿直角坐标系中单个点旋转的情况
如图二示,这里点P(x,y)到原点O绕O点逆时针旋转角度θ后到点P′(x′,y′)
由三角函数的几何意义,有x=r*cosα,y=r*sinα和x′=r*cos(α+θ),y′=r*sin(α+θ),推出:x′=x*cosθ–y*sinθy′=y*cosθ+x*sinθ当把旋转点一般化为Q(x0,y0),得到:x′=x0+(x-x0)cosθ-(y-y0)sinθy′=y0+(y-y0)cosθ+(x-x0)sinθ在开发时,我们使用设备坐标系,它以屏幕的左上角为坐标原点,y轴方向向下
此时,我们不妨视θ为饶旋转点顺时针旋转的角度,这样,上面的公式依然成立
图二2D点的旋转一般图像的旋转算法1、算法思想为实现整个图像的旋转,我们首先获取源图像每个点的像素值
然后根据旋转点和角度的大小计算出新图像的大小
再逐点计算源图像中每个点经旋转后在新图像中对应点的坐标,并把相应的像素值赋给它
在图三中,阴影部分为源图像,O为旋转点,P、Q分别为旋转前后图像左上角的点,cx,cy为O相对于源图像左上角P点的坐标值
这里我们以O为圆心,以O距图像4个顶点的距离的最大值作为半径dr画圆,这样图像无论以任何角度旋转都不会超出这个圆的范围
于是,我们就以该圆为画布绘制旋转所得新图像
由于实际中图像是用矩形表示的,于是我们生成和圆的外切正方形(图中虚线部分)等大小的新图像