Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 417|回复: 0

[J2ME学习]j2me图片任意角度翻转算法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 04:01:38 | 显示全部楼层 |阅读模式
    代码如下:
    1. package com.xx;
    2. import javax.microedition.lcdui.Graphics;
    3.   /*
    4.   * 图片任意角度翻转算法
    5.   * 同时实现了Nokia特有API
    6.   * author. BB
    7.   * Sprite.java
    8.   *
    9.   *
    10.   */
    11. public class Sprite {
    12.    /** SIN TABLE **/
    13.    public final static int SIN_TABLE[] ={
    14.     0, 4, 8, 13, 17, 22, 26, 31, 35, 39,
    15.     44, 48, 53, 57, 61, 65, 70, 74, 78, 83,
    16.     87, 91, 95, 99, 103, 107, 111, 115, 119, 123,
    17.     127, 131, 135, 138, 142, 146, 149, 153, 156, 160,
    18.     163, 167, 170, 173, 177, 180, 183, 186, 189, 192,
    19.     195, 198, 200, 203, 206, 208, 211, 213, 216, 218,
    20.     220, 223, 225, 227, 229, 231, 232, 234, 236, 238,
    21.     239, 241, 242, 243, 245, 246, 247, 248, 249, 250,
    22.     251, 251, 252, 253, 253, 254, 254, 254, 254, 254,
    23.     255, 254, 254, 254, 254, 254, 253, 253, 252, 251,
    24.     251, 250, 249, 248, 247, 246, 245, 243, 242, 241,
    25.     239, 238, 236, 234, 232, 231, 229, 227, 225, 223,
    26.     220, 218, 216, 213, 211, 208, 206, 203, 200, 198,
    27.     195, 192, 189, 186, 183, 180, 177, 173, 170, 167,
    28.     163, 160, 156, 153, 149, 146, 142, 138, 135, 131,
    29.     127, 123, 119, 115, 111, 107, 103, 99, 95, 91,
    30.     87, 83, 78, 74, 70, 65, 61, 57, 53, 48,
    31.     44, 39, 35, 31, 26, 22, 17, 13, 8, 4,
    32.     0, -4, -8, -13, -17, -22, -26, -31, -35, -39,
    33.     -44, -48, -53, -57, -61, -65, -70, -74, -78, -83,
    34.     -87, -91, -95, -99, -103, -107, -111, -115, -119, -123,
    35.     -127, -131, -135, -138, -142, -146, -149, -153, -156, -160,
    36.     -163, -167, -170, -173, -177, -180, -183, -186, -189, -192,
    37.     -195, -198, -200, -203, -206, -208, -211, -213, -216, -218,
    38.     -220, -223, -225, -227, -229, -231, -232, -234, -236, -238,
    39.     -239, -241, -242, -243, -245, -246, -247, -248, -249, -250,
    40.     -251, -251, -252, -253, -253, -254, -254, -254, -254, -254,
    41.     -255, -254, -254, -254, -254, -254, -253, -253, -252, -251,
    42.     -251, -250, -249, -248, -247, -246, -245, -243, -242, -241,
    43.     -239, -238, -236, -234, -232, -231, -229, -227, -225, -223,
    44.     -220, -218, -216, -213, -211, -208, -206, -203, -200, -198,
    45.     -195, -192, -189, -186, -183, -180, -177, -173, -170, -167,
    46.     -163, -160, -156, -153, -149, -146, -142, -138, -135, -131,
    47.     -127, -123, -119, -115, -111, -107, -103, -99, -95, -91,
    48.     -87, -83, -78, -74, -70, -65, -61, -57, -53, -48,
    49.     -44, -39, -35, -31, -26, -22, -17, -13, -8, -4
    50. };
    51. /** 透明 **/
    52. public static int TRANSPARENT = 0;
    53. /** 不透明 **/
    54. public static int OPAQUE = 15;
    55. /**
    56. * 像素值
    57. * 包含动画帧,主下标标识动画帧数,副下标的值代表像素值
    58. */
    59. public short pixels[][];
    60.   /*
    61.   * 精灵的宽度
    62.   * 该版本默认精灵各个帧的宽度一样大小
    63.   */
    64. public short width;
    65. /*
    66. * 精灵的高度
    67. * 该版本默认精灵各个帧的高度一样大小
    68. */
    69. public short height;
    70. /*
    71. * 动画帧数
    72. */
    73. public byte numOfFrame;
    74. /*
    75. * 当前动画帧数
    76. */
    77. public int curFrame;
    78. /*
    79. * 构造函数
    80. * 确保传入的各个值为合理的值
    81. * 使用的话请自己做判断
    82. * @param _pixels 动画的像素值
    83. * @param _width 宽度
    84. * @param _height 高度
    85. */
    86. public Sprite(short[][] _pixels, short _width, short _height){
    87.   pixels = _pixels;
    88.   width = _width;
    89.   height = _height;
    90.   numOfFrame = (byte)_pixels.length;
    91.   curFrame = 0;
    92. }
    93. /*
    94. * 构造函数
    95. */
    96. public Sprite(){
    97. }
    98. /*
    99. * 投影
    100. * @param cData
    101. * @param l
    102. * @param i1
    103. * @param j1
    104. * @param k1
    105. * @return
    106. */
    107. private final short project(short cData[], int l, int i1, int j1, int k1) {
    108.   int j3 = (j1 & 0xffff) >> 8;
    109.   int k3 = (k1 & 0xffff) >> 8;
    110.   int l3 = (256 - j3) * (256 - k3);
    111.   int i4 = j3 * (256 - k3);
    112.   int j4 = (256 - j3) * k3;
    113.   int k4 = j3 * k3;
    114.   int l2 = j1 >> 16;
    115.   int i3 = k1 >> 16;
    116.   l2 %= l;
    117.   i3 %= i1;
    118.   i3 *= l;
    119.   short word0 = cData[l2 + i3];
    120.   short word2 = cData[(l2 + (i3 + l)) % (cData.length - 1)];
    121.   l2 = ++l2 % l;
    122.   short word1 = cData[l2 + i3];
    123.   short word3 = cData[(l2 + (i3 + l)) % (cData.length - 1)];
    124.   int l1 = word0 >> 12 & 0xf;
    125.   int i2 = word1 >> 12 & 0xf;
    126.   int j2 = word2 >> 12 & 0xf;
    127.   int k2 = word3 >> 12 & 0xf;
    128.   int k5 = l1 * l3 + i2 * i4 + j2 * j4 + k2 * k4 >> 16;
    129.   l1 = word0 >> 8 & 0xf;
    130.   i2 = word1 >> 8 & 0xf;
    131.   j2 = word2 >> 8 & 0xf;
    132.   k2 = word3 >> 8 & 0xf;
    133.   int l4 = l1 * l3 + i2 * i4 + j2 * j4 + k2 * k4 >> 16;
    134.   l1 = word0 >> 4 & 0xf;
    135.   i2 = word1 >> 4 & 0xf;
    136.   j2 = word2 >> 4 & 0xf;
    137.   k2 = word3 >> 4 & 0xf;
    138.   int i5 = l1 * l3 + i2 * i4 + j2 * j4 + k2 * k4 >> 16;
    139.   l1 = word0 & 0xf;
    140.   i2 = word1 & 0xf;
    141.   j2 = word2 & 0xf;
    142.   k2 = word3 & 0xf;
    143.   int j5 = l1 * l3 + i2 * i4 + j2 * j4 + k2 * k4 >> 16;
    144.   return (short) ((k5 << 12) + (l4 << 8) + (i5 << 4) + j5);
    145. }
    146. /*
    147. * 翻转
    148. * @param count 在360度内翻转的个数
    149. * @return 返回一个翻转后的精灵
    150. */
    151. public Sprite rotate(int count) {
    152.   Sprite sprite = new Sprite();
    153.   short radius = 30;
    154.   if (width == 40 && height == 40)
    155.     radius = 57;
    156.   else if (width == 8 && height == 8)
    157.     radius = 12;
    158.   else if (width == 6 && height == 12)
    159.     radius = 14;
    160.   else if (width == 24 && height == 24)
    161.     radius = 34;
    162.   else if (width == 26 && height == 26)
    163.     radius = 27;
    164.   else if (width == 8 && height == 15)
    165.     radius = 17;
    166.   else if (width == 10 && height == 16)
    167.     radius = 19;
    168.   else if (width == 11 && height == 15)
    169.     radius = 19;
    170.   else
    171.     System.out.println("Wrong size: " + width + " " + width + " "+ count);
    172.   sprite.width = radius;
    173.   sprite.height = radius;
    174.   sprite.numOfFrame = (byte)count;
    175.   sprite.pixels = new short[count][];
    176.   for (int j1 = 0; j1 < count; j1++) {
    177.     sprite.pixels[j1] = new short[sprite.width * sprite.height];
    178.     int k1 = j1 * (360 / count);
    179.     short l1 = width;
    180.     short i2 = height;
    181.     width = sprite.width;
    182.     height = sprite.height;
    183.     int j2 = width / 2;
    184.     int k2 = l1 / 2;
    185.     int l2 = i2 / 2;
    186.     int i3 = SIN_TABLE[k1 % 360] << 8;
    187.     int j3 = SIN_TABLE[(k1 + 90) % 360] << 8;
    188.     int k4 = 0;
    189.     int i4 = -j2 * j3;
    190.     int j4 = -j2 * i3;
    191.     for (int l4 = 0; l4 < sprite.pixels[j1].length; l4++)
    192.        sprite.pixels[j1][l4] = (short) (TRANSPARENT << 12);
    193.     for (int i5 = 0; i5 < height; i5++) {
    194.          int k3 = -j2 * j3;
    195.          int l3 = -j2 * i3;
    196.          for (int j5 = 0; j5 < width; j5++) {
    197.             //x
    198.             int k5 = (k3 - j4 >> 16) + k2;
    199.              //y
    200.             int l5 = (i4 + l3 >> 16) + l2;
    201.             if (k5 >= 0 && l5 >= 0 && l5 < i2 && k5 < l1)
    202.                  sprite.pixels[j1][k4] = project(pixels[0], l1, i2,
    203.                   (k3 - j4) + (k2 << 16), i4 + l3 + (l2 << 16));
    204.                  k3 += j3;
    205.                  l3 += i3;
    206.                  k4++;
    207.              }
    208.              i4 += j3;
    209.              j4 += i3;
    210.              k4 -= width;
    211.              k4 += sprite.width;
    212.           }
    213.           height = i2;
    214.           width = l1;
    215.      }
    216.         return sprite;
    217.     }
    218. /*
    219. * 绘制精灵
    220. * 在这里实现了Nokia的特有API
    221. * 大家可以扩展该方法
    222. * @param g
    223. * @param x
    224. * @param y
    225. * @param manipulate
    226. */
    227. public void draw(Graphics g, int x, int y, int manipulate) {
    228.   drawPixels(g, true, 0, width, x, y, width,
    229.   height, manipulate, 4444);
    230. }
    231. public void drawPixels(Graphics g, boolean transparency,
    232.    int offset, int scanlength, int x, int y, int width, int height,
    233.    int manipulation, int format) {
    234.      int l1 = map2Manipulation(manipulation);
    235.      int j1;
    236.      int k1;
    237.      if ((l1 & 4) != 0) {
    238.        j1 = height;
    239.        k1 = width;
    240.      } else {
    241.        j1 = width;
    242.        k1 = height;
    243.     }
    244.    short newPixels[] = new short [j1 * k1];
    245.     if(manipulation == 0){
    246.       newPixels = pixels[curFrame];
    247.     }
    248.     else
    249.     for (int i2 = 0; i2 < k1; i2++) {
    250.       for (int j2 = 0; j2 < j1; j2++) {
    251.         int j = j2;
    252.         int k = i2;
    253.         if ((l1 & 1) != 0)
    254.           j = j1 - 1 - j;
    255.         if ((l1 & 2) != 0)
    256.           k = k1 - 1 - k;
    257.         if ((l1 & 4) != 0) {
    258.            int k2 = j;
    259.            j = k;
    260.            k = k2;
    261.          }
    262.       newPixels[j1 * i2 + j2] = pixels[curFrame][width * k + j];
    263.     }
    264. }
    265. int off = offset;
    266.   int vw = x + j1;
    267.   int vh = y + k1;
    268.   for(int idy = y; idy < vh; idy++){
    269.     int voff = off;
    270.     for(int idx = x; idx < vw; idx++){
    271.       short pixel = newPixels[voff++];
    272.       int k3 = idx;
    273.       for(; idx < vw - 1 && newPixels[voff] == pixel; voff++)
    274.         idx++;
    275.       if((pixel >> 12 & 0xff) != 0)
    276.       {
    277.          int l3 = 0xf0 & pixel << 4;
    278.          l3 |= 0xf000 & pixel << 8;
    279.          l3 |= 0xf00000 & pixel << 12;
    280.          g.setColor(l3);
    281.          g.drawLine(k3, idy, idx, idy);
    282.       }
    283.   }
    284.   off += j1;
    285. }
    286. }
    287. private static int map2Manipulation(int i) throws IllegalArgumentException {
    288.    int j = 0;
    289.    if ((i & 0x2000) != 0)
    290.     j ^= 1;
    291.    if ((i & 0x4000) != 0)
    292.     j ^= 2;
    293.    switch (i & 0xffff9fff) {
    294.     case 90: // "Z"
    295.       j ^= 6;
    296.       break;
    297.     case 180:
    298.       j ^= 3;
    299.       break;
    300.     case 270:
    301.       j ^= 5;
    302.       break;
    303.     default:
    304.        throw new IllegalArgumentException();
    305.     case 0: // ""
    306.       break;
    307.    }
    308.    return j;
    309. }
    310. }
    复制代码



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/11/040138406.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 13:34 , Processed in 0.296040 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表