守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1719|回复: 4

[算法/性能优化] 分享一个工具类

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52623
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-8 10:10:54 | 显示全部楼层 |阅读模式
    1. package cn.util
    2. {
    3.         import flash.utils.ByteArray;

    4.         /**
    5.          *  此类搜集了一些算法源码
    6.          * @author 破晓
    7.          *
    8.          */        
    9.         public class Utils
    10.         {
    11.                 public function Utils()
    12.                 {
    13.                 }
    14.                
    15.                 /**
    16.                  * 编码转换
    17.                  * @param str
    18.                  * @param fromChar
    19.                  * @param toChar
    20.                  * @return
    21.                  *
    22.                  */               
    23.                 public static function stringTransform(str:String, fromChar:String, toChar:String):String
    24.                 {
    25.                         var byte:ByteArray = new ByteArray();
    26.                         byte.writeMultiByte(str, fromChar);
    27.                         byte.position = 0;
    28.                         
    29.                         return byte.readMultiByte(byte.length, toChar);
    30.                 }
    31.                
    32.                 /**
    33.                  *  编码转换
    34.                  * @param str
    35.                  * @param toChar
    36.                  * @return
    37.                  *
    38.                  */               
    39.                 public static function stringEncode(str:String, toChar:String):ByteArray
    40.                 {
    41.                         var byte:ByteArray = new ByteArray();
    42.                         byte.writeMultiByte(str, toChar);
    43.                         byte.position = 0;
    44.                         
    45.                         return byte;
    46.                 }
    47.                
    48.                 /**
    49.                  * 编码转换  
    50.                  * @param strSource
    51.                  * @param fromChar
    52.                  * @param toChar
    53.                  * @return
    54.                  *
    55.                  */               
    56.                 public static function stringSourceEncode(strSource:ByteArray, fromChar:String, toChar:String):ByteArray
    57.                 {
    58.                         var str:String = strSource.readMultiByte(strSource.bytesAvailable, fromChar);
    59.                         var byte:ByteArray = new ByteArray();
    60.                         byte.writeMultiByte(str, toChar);
    61.                         byte.position = 0;
    62.                         
    63.                         return byte;
    64.                 }
    65.                
    66.                 //****************************************************************
    67.                 //                                            随机数生成算法
    68.                 //****************************************************************
    69.                
    70.                 /**随机数种子*/
    71.                 private static const MAXRATIO:Number=1/(uint.MAX_VALUE+1);
    72.                 private static var _seed:uint;
    73.                 /**
    74.                  *  产生随机数
    75.                  * @return 随机数
    76.                  *
    77.                  */               
    78.                 public static function rand():Number
    79.                 {
    80.                         _seed^=(_seed<<21);
    81.                         _seed^=(_seed>>>35);
    82.                         _seed^=(_seed<<4);
    83.                         
    84.                         return _seed*MAXRATIO;
    85.                 }

    86.                 //****************************************************************
    87.                 //                                               位运算技巧
    88.                 //****************************************************************
    89.                
    90.                 /**
    91.                  *  将 base 乘以 2 的 pow 次方
    92.                  * @param base
    93.                  * @param pow
    94.                  * @return 将 base 乘以 2 的 pow 次方的结果
    95.                  *
    96.                  */               
    97.                 public static function getPow2(base:int, pow:int):int
    98.                 {
    99.                          if(pow > 0)
    100.                                 return base << pow;
    101.                         else
    102.                                 return base >> pow;
    103.                 }
    104.                
    105.                 /**
    106.                  * 将数字转换为整数
    107.                  * @param num
    108.                  * @return 整数
    109.                  *
    110.                  */               
    111.                 public static function numberToInteger(num:Number):int
    112.                 {
    113.                         return num >> 0;
    114.                 }
    115.                
    116.                 public static const RGB_TYPE:int = 24;
    117.                 public static const ARGB_TYPE:int = 32;
    118.                 /**
    119.                  * 提取颜色组成成分
    120.                  * @param color
    121.                  * @param type
    122.                  * @return {r, g, b} 或 {a, r, g, b}
    123.                  *
    124.                  */               
    125.                 public static function getColorInfo(color:uint, type:int=RGB_TYPE):Object
    126.                 {
    127.                         var obj:Object = {};
    128.                         if(type == RGB_TYPE)
    129.                         {
    130.                                 obj.r = color >> 16;
    131.                                 obj.g = color >> 8 & 0xFF;
    132.                                 obj.b = color & 0xFF;
    133.                         }
    134.                         else if(type == ARGB_TYPE)
    135.                         {
    136.                                 obj.a = color >>> 24;
    137.                                 obj.r = color >>> 16 & 0xFF;
    138.                                 obj.g = color >>> 8 & 0xFF;
    139.                                 obj.b = color & 0xFF;
    140.                         }
    141.                         
    142.                         return obj;
    143.                 }
    144.                
    145.                 /**
    146.                  * 合成颜色
    147.                  * @param r
    148.                  * @param g
    149.                  * @param b
    150.                  * @param a
    151.                  * @param type
    152.                  * @return  颜色
    153.                  *
    154.                  */               
    155.                 public static function buildColor(r:uint, g:uint, b:uint, a:uint=0, type:int=RGB_TYPE):uint
    156.                 {
    157.                         if(type == RGB_TYPE)
    158.                                 return r << 16 | g << 8 | b;
    159.                         else
    160.                                 return a << 24 | r << 16 | g << 8 | b;
    161.                 }
    162.                
    163.                 /**
    164.                  * 交换两个整数的值
    165.                  * @param a
    166.                  * @param b
    167.                  * @return {a, b}
    168.                  *
    169.                  */               
    170.                 public static function exchange(a:int, b:int):Object
    171.                 {
    172.                         a ^= b;
    173.                         b ^= a;
    174.                         a ^= b;
    175.                         
    176.                         return {a:a, b:b};
    177.                 }
    178.                
    179.                 /**
    180.                  * 自增(i++)
    181.                  * @param value
    182.                  * @return
    183.                  *
    184.                  */               
    185.                 public static function increment(value:int):int
    186.                 {
    187.                         return -~value;
    188.                 }
    189.                
    190.                 /**
    191.                  *  自减(i--)
    192.                  * @param value
    193.                  * @return
    194.                  *
    195.                  */               
    196.                 public static function decrement(value:int):int
    197.                 {
    198.                         return ~-value;
    199.                 }
    200.                
    201.                 /**
    202.                  * 返回相反数
    203.                  * @param value
    204.                  * @return 相反数
    205.                  *
    206.                  */               
    207.                 public static function flipping(value:int):int
    208.                 {
    209.                         return ~value + 1;  // 或 (value ^ -1) + 1
    210.                 }
    211.                
    212.                 /**
    213.                  * 判断是否为奇数
    214.                  * @param value
    215.                  * @return
    216.                  *
    217.                  */               
    218.                 public static function isEven(value:int):Boolean
    219.                 {
    220.                         return Boolean(value & 1);   
    221.                 }
    222.                
    223.                 /**
    224.                  * 返回绝对值
    225.                  * @param value
    226.                  * @return 绝对值
    227.                  *
    228.                  */               
    229.                 public static function abs(value:int):int
    230.                 {
    231.                         return (value ^ (value >> 31)) - (value >> 31);
    232.                 }
    233.                
    234.                 /**
    235.                  * 判断两个整数符号是否相同
    236.                  * @param a
    237.                  * @param b
    238.                  * @return
    239.                  *
    240.                  */               
    241.                 public static function comparingSign(a:int, b:int):Boolean
    242.                 {
    243.                         return a ^ b >= 0;
    244.                 }
    245.         }
    246. }
    复制代码


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52623
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-8 10:11:16 | 显示全部楼层
    1. /**
    2.                  * 判断无限循环小数
    3.                  * @param a 分子
    4.                  * @param b 分母
    5.                  *
    6.                  */               
    7.                 public static function check(a:Number, b:Number):void
    8.                 {
    9.                         while(a % 1 > 0 || b % 1 > 0)
    10.                         {
    11.                                 a *= 10;
    12.                                 b *= 10;
    13.                         }
    14.                         var y:int; // 余数
    15.                         y = a % b;
    16.                         
    17.                         var arr:Array = [];
    18.                         var count:int;
    19.                         while(true)
    20.                         {
    21.                                 if(y == 0)
    22.                                 {
    23.                                         trace("可以除尽,有限小数");
    24.                                         break;
    25.                                 }
    26.                                 if(arr.indexOf(y) >= 0)
    27.                                         break;
    28.                                 else
    29.                                         arr.push(y);
    30.                                 while(y < b) y *= 10;
    31.                                 y = y % b;
    32.                                 if(count++ > 1000) break;
    33.                         }
    34.                         
    35.                         trace(count, a/b, arr);
    36.                 }
    复制代码
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52623
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-8 10:11:33 | 显示全部楼层
    1. /**
    2.                  *  验证某个实例或类名是否从属于某个类
    3.                  * @param value  可以为类名或实例
    4.                  * @param clazz 类名
    5.                  * @return
    6.                  *
    7.                  */               
    8.                 public static function isBelongClass(value:*,clazz:Class):Boolean
    9.                 {
    10.                         value = getDefinitionByName(getQualifiedClassName(value));
    11.                         while(value != clazz)
    12.                         {
    13.                                 var className:String = getQualifiedSuperclassName(value);
    14.                                 if(className == "Object")
    15.                                 {
    16.                                         return false;
    17.                                 }
    18.                                 value = getDefinitionByName(className);
    19.                         }
    20.                         return true;
    21.                 }
    复制代码
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52623
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-8 10:11:49 | 显示全部楼层
    1. /**
    2.                  *  返回多边形面积
    3.                  * @param poly
    4.                  * @return
    5.                  *
    6.                  */               
    7.                 public static function getArea(poly:Array):Number {
    8.                         var n:int = poly.length;
    9.                         var surface:Number = 0;
    10.                         for (var i:int=0; i<n; i++) {
    11.                                 var j:int = (i+1) % n;
    12.                                 surface += Point(poly[i]).x * Point(poly[j]).y;
    13.                                 surface -= Point(poly[i]).y * Point(poly[j]).x;
    14.                         }
    15.                         surface=surface/2;
    16.                         return surface;
    17.                 }
    18.                
    19.                 public static function getArea2(poly:Array):Number {
    20.                         var area:Number = 0;
    21.                         if ( poly.length > 2) {
    22.                                 var sum:Number = 0;
    23.                                 var len:Number = poly.length - 1;
    24.                                 for (var i:int=0; i<len; i++) {
    25.                                         sum += (Point(poly[i]).x + Point(poly[i+1]).x) * (Point(poly[i+1]).y - Point(poly[i]).y);
    26.                                 }
    27.                                 sum += (Point(poly[i]).x + Point(poly[0]).x) * (Point(poly[0]).y - Point(poly[i]).y);
    28.                                 
    29.                                 area = - sum / 2;
    30.                         }
    31.                         return area;
    32.                 }
    复制代码
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52623
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-1-8 10:12:46 | 显示全部楼层
    1. /**
    2.      * 计算线段方位角
    3.      * @param p1
    4.      * @param p2
    5.      * @return
    6.      *
    7.      */               
    8.     public static function getAngle(p1:Point, p2:Point):Number
    9.     {
    10.       var tx:Number = p2.x - p1.x;
    11.       var ty:Number = p2.y - p1.y;
    12.       var k:Number = ty / tx;
    13.       var angle:Number = Math.atan(k);
    14.       if(tx < 0)
    15.         angle += Math.PI;
    16.       else if(ty < 0)
    17.         angle += (Math.PI + Math.PI);
    18.       if(angle < 0)
    19.         angle = Math.PI + Math.PI - angle;
    20.       return angle;
    21.     }
    复制代码
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2024-3-29 23:46 , Processed in 0.062947 second(s), 30 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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