/**
* The color white.
*/
public static const WHITE:uint = 0xFFFFFFFF;
/**
* The color light gray.
*/
public static const LIGHT_GRAY:uint = 0xFFC0C0C0;
/**
* The color gray.
*/
public static const GRAY:uint = 0xFF808080;
/**
* The color dark gray.
*/
public static const DARK_GRAY:uint = 0xFF404040;
/**
* The color black.
*/
public static const BLACK:uint = 0xFF000000;
/**
* The color red.
*/
public static const RED:uint = 0xFFFF0000;
/**
* The color pink.
*/
public static const PINK:uint = 0xFFFFAFAF;
/**
* The color orange.
*/
public static const ORANGE:uint = 0xFFFFC800;
/**
* The color yellow.
*/
public static const YELLOW:uint = 0xFFFFFF00;
/**
* The color green.
*/
public static const GREEN:uint = 0xFF00FF00;
/**
* The color magenta.
*/
public static const MAGENTA:uint = 0xFFFF00FF;
/**
* The color cyan.
*/
public static const CYAN:uint = 0xFF00FFFF;
/**
* The color blue.
*/
public static const BLUE:uint = 0xFF0000FF;
2008年4月6日
[AS3,Color]常用的一些颜色的常量
2008年2月16日
[AS3,Math]立方根
/**
* 立方根
*
* @param v 一个数字。
* @return 数字的立方根。
*/
public static function cbrt(value:Number):Number {
return Math.pow(value, 1/3);
}
2008年2月14日
[AS3,I/O]URLVariables 的编码器
/**
* URLVariables 的编码器。
* 把一个对象转换为 URLVariables 的格式的字符串。
* URLVariables 的格式为"a=value1&b=value2"。
* @param o 一个对象。
* @return URLVariables 的格式的字符串。
*/
public static function encode(o:Object):String {
var varList:XMLList = describeType(o).variable;
var result:String = "";
for(var i:String in o) {
result += encodeURIComponent(i) + "=" + encodeURIComponent(o[i]) + "&";
}
for each(var v:XML in varList) {
result += encodeURIComponent(v.@name) +
"=" + encodeURIComponent(o[v.@name]) + "&";
}
return result.substring(0, result.length-1);
}
2008年2月8日
[AS3,I/O]Base85的解码器
需要 Base85CharSet,请参见[AS3,I/O]Base85的字符集。
关联项目:[AS3,I/O]Base85的编码器(Base85Encoder)。
package advancedflex.io.format {
import flash.utils.ByteArray;
import flash.utils.Endian;
import flash.utils.IDataOutput;
/**
* Base85的解码器
* 他把5个字节的文本数据4转换为个字节的2进制数据。
* @see Base85CharSet
* @see Base85Encoder
*/
public class Base85Decoder {
/**
* 解码为String
*
* @param src 密文
* @param charSet 逆字符集
* @return 原文
*
* @see Base85CharSet#RFC_1924
* @see Base85Encoder#encode
*/
public static function decode(src:String, charSet:Object = null):String {
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(src);
var mark:int = bytes.length;
decodeByteArray(src, bytes, charSet ? charSet : Base85CharSet.RFC_1924);
bytes.position = mark;
return bytes.readUTFBytes(bytes.bytesAvailable);
}
/**
* 解码为ByteArray
*
* @param data 密文
* @param output 输出流
* @param decharSet 逆字符集
*
* @see Base85CharSet#RFC_1924
* @see Base85Encoder#encodeByteArray
*/
public static function decodeByteArray(data:String, output:IDataOutput, decharSet:Object = null):void {
decharSet = decharSet ? decharSet : Base85CharSet.DECODE_RFC_1924;
var dataLength:int = data.length;
var endbytes:int = dataLength % 5;
dataLength -= endbytes;
//decode normal group of bytes
for(var i:int = 0; i < dataLength;i++) {
output.writeUnsignedInt(
decharSet[data.charAt(i)] +
decharSet[data.charAt(++i)]*85 +
decharSet[data.charAt(++i)]*(85*85) +
decharSet[data.charAt(++i)]*(85*85*85) +
decharSet[data.charAt(++i)]*(85*85*85*85)
);
}
//decode last group of bytes
var buf:int;
switch(endbytes) {
case 0:
break;
case 4:
buf = (
decharSet[data.charAt(i)] +
decharSet[data.charAt(++i)]*85 +
decharSet[data.charAt(++i)]*(85*85) +
decharSet[data.charAt(++i)]*(85*85*85)
);
if(output.endian == Endian.BIG_ENDIAN) {
output.writeByte(
(buf&0xFF0000) >> 16
);
output.writeByte(
(buf&0x00FF00) >> 8
);
output.writeByte(
(buf&0x0000FF)
);
} else {
output.writeByte(
(buf&0x0000FF)
);
output.writeByte(
(buf&0x00FF00) >> 8
);
output.writeByte(
(buf&0xFF0000) >> 16
);
}
break;
case 3:
output.writeShort(
decharSet[data.charAt(i)] +
decharSet[data.charAt(++i)]*85 +
decharSet[data.charAt(++i)]*(85*85)
);
break;
default: //2
output.writeByte(
decharSet[data.charAt(i)] +
decharSet[data.charAt(++i)]*85
);
break;
}
}
}
}
2008年2月7日
[AS3,I/O]Base85的编码器
需要 Base85CharSet,请参见[AS3,I/O]Base85的字符集
package advancedflex.io.format {
import flash.utils.ByteArray;
import flash.utils.IDataInput;
/**
* Base85的编码器
* 他把4个字节的2进制数据转换为5个字节的文本数据。数据的增加度为25%。
*
* @see Base85CharSet
* @see Base85Decoder
*/
public class Base85Encoder {
/**
* 用String来编码
*
* @param src 原文
* @param charSet Base85字符集,默认为 Base85CharSet.RFC_1924
* @return 密文(原文编码后的数据)
*
* @see Base85CharSet#RFC_1924
*/
public static function encode(src:String, charSet:Array = null):String {
// Convert string to ByteArray
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(src);
bytes.position = 0;
return encodeByteArray(bytes, charSet ? charSet : Base85CharSet.RFC_1924);
}
/**
* 用ByteArray来编码
* @param data 原文的输入流
* @param charSet Base85字符集,默认为 Base85CharSet.RFC_1924
* @return 密文(原文编码后的数据)
*
* @see Base85CharSet#RFC_1924
*/
public static function encodeByteArray(data:IDataInput, charSet:Array = null):String {
charSet = charSet ? charSet : Base85CharSet.RFC_1924;
// Initialise output
var output:String = ""; //output
var srcLength:int = data.bytesAvailable; //length of normal bytes
var endbytes:int = srcLength % 4; //length of extra bytes.
var buf:uint; //encode buffer
//set this var to correct value.(normal = all - extra)
srcLength -= endbytes;
//encode normal group of bytes
for(var i:int = 0; i < srcLength; i+=4) {
buf = data.readUnsignedInt();
output += charSet[buf % 85];
buf /= 85;
output += charSet[buf % 85];
buf /= 85;
output += charSet[buf % 85];
buf /= 85;
output += charSet[buf % 85];
buf /= 85;
output += charSet[buf % 85];
}
//encode last group of bytes
buf = 0;
for(var j:int = 0; j < endbytes; j++) {
buf = (buf << 8) | data.readByte();
}
switch(endbytes) {
case 0: //no extra byte
break;
case 3: //has 3 extra bytes
output += charSet[buf % 85];
buf /= 85;
case 2: //has 2 extra bytes
output += charSet[buf % 85];
buf /= 85;
default: //has 1 extra byte
output += charSet[buf % 85];
buf /= 85;
output += charSet[buf % 85];
}
return output;
}
}
}
2008年2月6日
[AS3,I/O]Base85的字符集
package advancedflex.io.format {
/**
* Base85的字符集(Character Set)
*
* @see http://rfc.net/rfc1924.html RFC-1924
* @see Base85Decoder
* @see Base85Encoder
*/
public final class Base85CharSet {
/**
* 在RFC-1924里定义的一般的字符集(根据编码算字符)
*/
//0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~
public static const RFC_1924:Array =
[
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d",
"e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z", "!", "#", "$", "%", "&", "(", ")", "*",
"+", "-", ";", "<", "=", ">", "?", "@", "^", "_",
"`", "{", "|", "}", "~",
];
/**
* 在RFC-1924里定义的一般的逆字符集(根据字符算编码)
*/
public static const DECODE_RFC_1924:Object =
{
"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9,
"A":10, "B":11, "C":12, "D":13, "E":14, "F":15, "G":16, "H":17, "I":18, "J":19,
"K":20, "L":21, "M":22, "N":23, "O":24, "P":25, "Q":26, "R":27, "S":28, "T":29,
"U":30, "V":31, "W":32, "X":33, "Y":34, "Z":35, "a":36, "b":37, "c":38, "d":39,
"e":40, "f":41, "g":42, "h":43, "i":44, "j":45, "k":46, "l":47, "m":48, "n":49,
"o":50, "p":51, "q":52, "r":53, "s":54, "t":55, "u":56, "v":57, "w":58, "x":59,
"y":60, "z":61, "!":62, "#":63, "$":64, "%":65, "&":66, "(":67, ")":68, "*":69,
"+":70, "-":71, ";":72, "<":73, "=":74, ">":75, "?":76, "@":77, "^":78, "_":79,
"`":80, "{":81, "|":82, "}":83, "~":84
};
/**
* 在ascii85里定义的一般的字符集(根据编码算字符)
*/
//!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv
public static const ASCII85:Array =
[
"!", "\"", "#", "$", "%", "&", "'", "(", ")", "*",
"+", ",", "-", ".", "/", "0", "1", "2", "3", "4",
"5", "6", "7", "8", "9", ":", ";", "<", "=", ">",
"?", "@", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z", "[", "]",
"^", "_", "`", "a", "b", "c", "d", "e", "f", "g",
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
"r", "s", "t", "u", "v",
];
/**
* 在ascii85里定义的一般的字符集(根据编码算字符)
*/
public static const DECODE_ASCII85:Object =
{
"!":0, "\"":1, "#":2, "$":3, "%":4, "&":5, "'":6, "(":7, ")":8, "*":9,
"+":10, ",":11, "-":12, ".":13, "/":14, "0":15, "1":16, "2":17, "3":18, "4":19,
"5":20, "6":21, "7":22, "8":23, "9":24, ":":25, ";":26, "<":27, "=":28, ">":29,
"?":30, "@":31, "A":32, "B":33, "C":34, "D":35, "E":36, "F":37, "G":38, "H":39,
"I":40, "J":41, "K":42, "L":43, "M":44, "N":45, "O":46, "P":47, "Q":48, "R":49,
"S":50, "T":51, "U":52, "V":53, "W":54, "X":55, "Y":56, "Z":57, "[":58, "]":59,
"^":60, "_":61, "`":62, "a":63, "b":64, "c":65, "d":66, "e":67, "f":68, "g":69,
"h":70, "i":71, "j":72, "k":73, "l":74, "m":75, "n":76, "o":77, "p":78, "q":79,
"r":80, "s":81, "t":82, "u":83, "v":84
}
}
}
2008年2月5日
[AS3,Event]实现 IEventDispatcher 接口的类模板
package {
import flash.events.IEventDispatcher;
import flash.events.Event;
import flash.events.EventDispatcher;
/**
* 抽象的 EventDispatcher。
* 实现 IEventDispatcher 接口的模板。
*/
public class AbstractEventDispatcher implements IEventDispatcher {
protected var _listener:EventDispatcher;
public function AbstractEventDispatcher() {
_listener = new EventDispatcher(this);
}
public function hasEventListener(type:String):Boolean {
return _listener.hasEventListener(type);
}
public function willTrigger(type:String):Boolean {
return _listener.willTrigger(type);
}
public function addEventListener(
type:String, listener:Function, useCapture:Boolean=false,
priority:int=0.0, useWeakReference:Boolean=false):void
{
_listener.addEventListener(
type, listener, useCapture,
priority, useWeakReference);
}
public function removeEventListener(
type:String, listener:Function, useCapture:Boolean=false):void
{
_listener.removeEventListener(type, listener, useCapture);
}
public function dispatchEvent(event:Event):Boolean {
return _listener.dispatchEvent(event);
}
}
}
2008年2月4日
[AS3,Display]全屏模式
package advancedflex.core {
import flash.display.DisplayObject;
import flash.display.Stage;
import flash.display.StageDisplayState;
import flash.geom.Rectangle;
/**
* 全屏模式
*/
public class FullScreen {
/**
* 进入全屏模式。
*
* @param display 任意一个加入了 displayList 的 DisplayObject。
*/
public static function go(display:DisplayObject):void {
var stage:Stage = display.stage;
stage["fullScreenSourceRect"] = new Rectangle(0, 0, stage.width, stage.height);
stage.displayState = StageDisplayState.FULL_SCREEN;
}
/**
* 退出全屏模式。
*
* @param display 任意一个加入了 displayList 的 DisplayObject。
*/
public static function back(display:DisplayObject):void {
display.stage.displayState = StageDisplayState.NORMAL;
}
}
}
2008年2月3日
[AS3,Math]微分
/**
* 微分。
*
* @param f 被微分的函数
* @param x x。
* @param delta dx的大小。
* @return f(x)的斜率。
*/
public static function diff(f:Function, x:Number, delta:Number = 1e-8):Number {
return (f(x+delta) - f(x)) / delta;
}
2008年2月2日
[AS3]把32位整数转换为8为整数
/**
* 把32位整数转换为8为整数。
*
* @param n 32位整数
* @return 8为整数
*/
public function toByte(n:int):int {
if(n > 0) {
return n & 0x8000007F;
} else {
return -(-n & 0x8000007F);
}
}
2008年2月1日
[AS3]把32位整数转换为16为整数
/**
* 把32位整数转换为16为整数。
*
* @param n 32位整数
* @return 16为整数
*/
public function toShort(n:int):int {
if(n > 0) {
return n & 0x80007FFF;
} else {
return -(-n & 0x80007FFF);
}
}
2008年1月31日
[AS3]拟柱体数值积分
/**
* 在[a, b]间的拟柱体数值积分。
* @param f 积分函数
* @param a 左界限
* @param b 右界限
* @return [a, b]间的定积分
*/
public static function cylinderInte(f:Function, a:Number, b:Number):Number {
var h:Number = b-a;
return (h/6)*(f(a) + 4*f( (a+b) / 2 ) + f(b));
}
2008年1月30日
[AS3]辛普森数值积分
/**
* 在[a, b]间的辛普森数值积分
* @param f 积分函数
* @param a 左界限
* @param b 右界限
* @param n 分段数
* @return [a, b]间的定积分
*/
public static function simpsonInte(f:Function, a:Number, b:Number, n:int = 1024):Number {
n*=2;//2n => n
var h:Number = (b-a) / (n);
var x1:Number = 0;
var x2:Number = 0;
n--;//2n-1 => n
for(var i:int = 1; i i++*/) {
x1 += f(a + i*h);
i++;//i+1 => i
x2 += f(a + i*h);
}
return (h/3)*(f(a) + f(b) + 4*x1 + 2*x2);
}
2008年1月29日
[AS3]梯形数值积分
/**
* 在[a, b]间的梯形数值积分
* @param f 被积分函数
* @param a 左界限
* @param b 右界限
* @param n 分段数
* @return [a, b]间的定积分
*/
public static function trapezoidalInte(f:Function, a:Number, b:Number,n:int = 1024):Number {
var h:Number = (b-a) / n;
var result:Number = 0;
n--;//n-1 => n
for(var i:int = 1; i<n; i++) {
result += f(a + i*h);
}
return (h/2)*(f(a) + f(b) + 2*result);
}
2008年1月28日
[AS3]忽略符号的四舍五入
/**
* 忽略符号的四舍五入。
*
* AMath.rint(1.2) //-> 1
* AMath.rint(-1.2)//-> -1
* AMath.rint(1.7) //-> 2
* AMath.rint(-1.7)//-> -2
* @param v a Number
* @return Rounded Nuumber.
*/
public static function rint(v:Number):int {
if(v > 0) {
return int(v + 0.5);
}
if(v < 0) {
return -int(-v + 0.5);
}else{
return 0;
}
}
2008年1月27日
[AS3]截取 ByteArray 中某一范围的元素
/**
* 截取原始 ByteArray 中某一范围的元素构成的新 ByteArray。
* 返回的 ByteArray 包括 start 元素以及从其开始到 end 元素(但不包括该元素)的所有元素。
*
* @param bytes 原始 ByteArray
* @param result 返回指针,如果为 null,将会创建新的 ByteArray。
* @param start 开始下标,负数表示从后面开始数。
* @param end 结束下标,负数表示从后面开始数。
* @return result
*/
public static function slice(
bytes:ByteArray, result:IDataOutput = null,
start:int = 0, end:int = -1):IDataOutput
{
if(!bytes) {
throw new ArgumentError("Param:must not be null.");
}
var totalLength:int = bytes.length;
if(!result) result = new ByteArray();
if(start<0) start = totalLength + start;
if(end<0) end = totalLength + end;
var length:int = end - start + 1;
result.writeBytes(bytes, start, length);
return result;
}
2008年1月26日
[AS3]颜色反转滤镜
package advancedflex.graphics.images.filters {
import flash.filters.BitmapFilter;
import flash.filters.ColorMatrixFilter;
/**
* 颜色反转工厂。
* 它是AFGL(Advanced Flex Graphics Library)的一部分。
*/
public class ReversesFilterFactory implements IBitmapFilterFactory {
/* The Reverses Matrix */
private static const $MATRIX:Array = [
-1, 0, 0, 0, 255,
0,-1, 0, 0, 255,
0, 0,-1, 0, 255,
0, 0, 0, 1, 0,
];
/**
* 创建滤镜。
* @return 滤镜。
*/
public function create():BitmapFilter {
return new ColorMatrixFilter($MATRIX);
}
/**
* 释放滤镜工厂占用的大内存,但实际上什么也不做。
* 调用后在调用其他方法时也不会发成错误。
*/
public function dispose():void {
//Do Nothing.
}
/**
* 返回 ReversesFilterFactory 对象,
* 它是与原始 ReversesFilterFactory 对象完全相同的副本。
* @return ReversesFilterFactory 对象。
*/
public function clone():IBitmapFilterFactory {
return new ReversesFilterFactory();
}
}
}
2008年1月25日
[AS3]图像滤镜效果的接口
这个类为今后将会发布的图像滤镜效果的接口。
package advancedflex.graphics.images.filters {
import flash.filters.BitmapFilter;
/**
* IBitmapFilterFactory 类是所有图像滤镜效果工厂的接口。
* 他可以创建各种 BitmapFilter。
* 它是AFGL(Advanced Flex Graphics Library)的一部分。
*/
public interface IBitmapFilterFactory {
/**
* 创建滤镜。
* @return 滤镜。
*/
function create():BitmapFilter;
/**
* 返回 IBitmapFilterFactory 对象,
* 它是与原始 IBitmapFilterFactory 对象完全相同的副本。
* @return IBitmapFilterFactory 对象。
*/
function clone():IBitmapFilterFactory;
/**
* 释放滤镜工厂占用的大内存(如果有的话)。
* 对 BitmapFilterFactory 调用 dispose() 方法时,
* 对此 BitmapFilterFactory 实例的方法或属性的所有后续调用都将失败,并引发异常。
*/
function dispose():void;
}
}
2008年1月24日
[AS3]生成呈高斯分布的伪随机数(2)
/**
* 用极坐标法(polar method)生成一个呈高斯分布的伪随机数。
*
* 这使用了 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的极坐标法,
* 该方法在 Donald E. Knuth 的 The Art of Computer Programming,
* Volume 3:Seminumerical Algorithms 的第 3.4.1 节,小节 C,算法 P 中进行了描述。
* 注意,它只需调用一次 Math.log 和调用一次 Math.sqrt 就可以生成两个独立的值
*
* @param mu 平均值μ
* @param sigma 标准差σ^2
*
* @return 伪随机数。
*/
public static function getGaussian2(mu:Number = 0, sigma:Number = 1):Number {
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
var v1:Number, v2:Number, s:Number;
do {
v1 = 2 * Math.random() - 1; // between -1.0 and 1.0
v2 = 2 * Math.random() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
var multiplier:Number = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1*multiplier*sigma + mu;
}
}
private static var nextNextGaussian:Number;
private static var haveNextNextGaussian:Boolean = false;