[原]关于股子系统的优化

2008-6-25 0:18:58 原创 抢沙发(0)

参考:
DiceClass
原作者:
hexagonstar : http://www.hexagonstar.com/
详情:
http://bbs.actionscript3.cn/thread-2044-1-1.html
程序结构:
Dice+ArrayUtil+NumberUtil,全静态类
个人评论:
NumberUtil内数值方面的是最值得借鉴的部分。

由于目前本人Dice 需要应用于DND System中,所以改变了下结构和随机算法(目的在于工厂化生产Dice,以及Dice随机分布算法抽出方便以后采用不同的随机分布算法。)
 

  1. //系统结构伪码  
  2. Dice implements IDice;  
  3. RandomSystem implements IRandomSystem  
  4. Random48 extends RandomSystem;  
  5.  
  6. interface IRandomSystem {  
  7.     function random(min:Number, max:Number):Number;  
  8.     function randomByRound(min:Number, max:Number,round:int):Array;  
  9. }  
  10.  
  11. interface IDice  {  
  12.     function get sided():int;  
  13.     function roll(round:int, randomSystem:IRandomSystem):DiceArrayList;  
  14.     function toString():String   
  15. }  
  16.  
  17. class DiceArrayList extends com.xintend.as3.dnd.core.ArrayCollection {         
  18.     public function DiceArrayList(data:Array ) {              
  19.     }  
  20.           
  21.     public function get average():int {     }  
  22.     public function get max():int {     }  
  23.     public function get min():int {     }  
  24.     public function get sum():int {     }  
  25.           
  26.     protected function verifyInt():void {}  
  27. }  
  28.          

(测试类):
 

  1. package {  
  2.       
  3.     import com.xintend.as3.dnd.base.dice.Dice;  
  4.     import com.xintend.as3.dnd.util.Random48;  
  5.     import com.xintend.as3.dnd.util.RandomSystem;  
  6.     import flash.display.Sprite;  
  7.       
  8.     public class Main extends Sprite    {  
  9.         public function Main(){           
  10.             var d1:Dice = new Dice(4);  
  11.             trace(d1.roll(100,new Random48()))  
  12.             trace(d1.roll(100,new RandomSystem()))  
  13.         }  
  14.     }  

测试图(结构在output窗口):


再次感谢hexagonstar.com开源的DiceClass中的48位线性同余算法

[转]计算机中随机数的产生

2008-6-24 1:49:48 算法 抢沙发(0)

一.计算机中随机数的产生
现在,在计算机,用来产生随机数的算法是"线性同余"法。所谓线性同余,其实就是下面两个式子。假设I就是一个随机数的序列,Ij+1与Ij的关系如下:
Ij+1 =Ij * a+c  (mod m)
或是Ij+1 =Ij *a    (mod m),
其中,不妨取a=16807,m=2147483647,以为一常数。写个简单的程序就是:
long r;

void scand( long v)//初始化随机种子数
{
r = v;
}

long rand()//产生随机数
{
r = (r*a + c)%m;//a,c,m为常数
return r;
}
再看一下稍复杂一点的:(Random () 的 Borland 的实现)
long long RandSeed = #### ;
unsigned long Random(long max)
{
long long x ;
double i ;
unsigned long final ;
x = 0xffffffff;
x += 1 ;
RandSeed *= ((long long)134775813);
RandSeed += 1 ;
RandSeed = RandSeed % x ;
i = ((double)RandSeed) / (double)0xffffffff ;
final = (long) (max * i) ;
return (unsigned long)final;
}
二.计算机产生的随机数不是真的随机数
[引:]我们建立了真正调用伪随机数生成器的 random()。但什么是伪随机数生成器?假定需要生成介于 1 和 10 之间的随机数,每一个数出现的几率都是一样的。理想情况下,应生成 0 到 1 之间的一个值,不考虑以前值,这个范围中的每一个值出现的几率都是一样的,然后再将该值乘以 10。请注意,在 0 和 1 之间有无穷多个值,而计算机不能提供这样的精度。
为了编写代码来实现类似于前面提到的算法,常见情况下,伪随机数生成器生成 0 到 N 之间的一个整数,返回的整数再除以 N。得出的数字总是处于 0 和 1 之间。对生成器随后的调用采用第一次运行产生的整数,并将它传给一个函数,以生成 0 到 N 之间的一个新整数,然后再将新整数除以 N 返回。这意味着,由任何伪随机数生成器返回的数目会受到 0 到 N 之间整数数目的限制。
在大多数的常见随机数发生器中,N 是 232? (大约等于 40 亿),对于 32 位数字来说,这是最大的值。换句话说,我们经常碰到的这类生成器能够至多生成 40 亿个可能值。而这 40 亿个数根本不算大,只是指尖这么大。
伪随机数生成器将作为"种子"的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一直滚下去。伪随机数生成器的结果仅仅是不可预测。由伪随机数生成器返回的每一个值完全由它返回的前一个值所决定(最终,该种子决定了一切)。如果知道用于计算任何一个值的那个整数,那么就可以算出从这个生成器返回的下一个值。
结果,伪随机数生成器是一个生成完全可预料的数列(称为流)的确定性程序。一个编写得很好的的 PRNG 可以创建一个序列,而这个序列的属性与许多真正随机数的序列的属性是一样的。例如:
PRNG 可以以相同几率在一个范围内生成任何数字。
PRNG 可以生成带任何统计分布的流。
由 PRNG 生成的数字流不具备可辨别的模式。
PRNG 所不能做的是不可预测。如果知道种子和算法,就可以很容易地推算出这个序列。

计算机产生的随机数一般都只是一个周期很长的数列,不是真的随机数。也就是说,随机数一般是伪随机数,每个随机数都是由随机种子开始的一个已定的数列(周期很长)。一般地,为了随机数更真一点,随机种子在系统中通常是参照系统时钟生成的。
看看下面这个例子,从中,读者应能有所体会。
main()
{
  int i;
  scand(time(NULL)); /*可向计算机读取其时钟值,并把值自动设为随机数种子*/
  for(i=0;i<10;i++){
    printf("%10d",1+(rand()%6));/*这里1是移动值,他等于所需的连续整数*/
 }              /*数值范围的第一个数;b是比例因子;他*/
 return(0);            /*等于所需的连续整数值的范围宽度;*/
}
从数学上讲,为了得到一个周期性更长的随机序列,我们可以使用如下方法:(这是我在一个书上看到的,详细的情况大家可以查一查,我自己也记不清了,呵呵)
float rand(long* idum)
{
    int j;    long k;    static long iy=0;    static long iv[NTAB];
    float temp;    
    if(*idum<=0||!iy)
    {
        if(-(*idum)<1)            *idum=1;
        else            *idum=-(*idum);
        for(j=NTAB+7;j>=0;j--){
            k=(*idum)/IQ;
            *idum=IA*(*idum-k*IQ)-k*IR;
            if(*idum<0)
                *idum+=IM;
            if(j<NTAB)
                iv[j]=*idum;
        }    iy=iv[0];    }    
    k=(*idum)/IQ;
    *idum=IA*(*idum-k*IQ)-k*IR;
    if(*idum<0)        *idum+=IM;
     j=iy/NDIV;
    iy=iv[j];
    iv[j]=*idum;    
    if((temp=float(AM*iy))>RNMX)        return float(RNMX);
    else         return temp;
}

[注:]有文讲 ,根据Randomize的工作原理,利用函数Timer得到从午夜开始到现在经过的秒数,然后再根据要得到的随机数值大小对该数值进行""衰减"处理,这样得到的数值则可称得上是真正意义的随机数值,我认为,这也是人为的方法,仍有它的确定性和周期性,仍称不上是真正的随机数,单纯改变伪随机数的生成逻辑计算方法并不能达到目的,最有效的办法只能是改变rand_seed,就是种子。而且,改变后的rand_seed不应该是人为的。(注:目前,在 Intel 的PIII处理器中内置了一个与CPU温度相关的随机数生成器,算是一个比较有效的种子生成器。)更好的办法是根据"随机事件"生成随机数,如键盘和鼠标输入值、中断、磁盘读取等等。然而,许多服务器没有键盘和鼠标,许多"黑盒"产品也不带有硬盘,因此很难找到好的随机数源,当然,通讯密钥也就一样不安全。而如网络状态等也不能很好地保证随机数的"随机性"。电器噪声和声音频率也许是很好的随机数源,但大多数人恐怕并不愿意在计算机中增加这种设备,而且也可能出现设备失灵和外部操纵(影响)等问题。对于要处理大量连接的网关服务器,是必须要考虑的问题。如果可以通过,精确检测机器cpu的通电电流强度,来作为随机数种子,或是其他一些没有人为因素的干扰的,且瞬间变化快的方法获得种子,必将能产生符和要求的随机数。

三.几种随机数的获取办法
1.产生一个范围内的随机数
一般地,我们可用j=1+(int)(n*rand()/(RAND_MAX+1.0))来生成一个0到n之间的随机数。
若用int x = rand() % 100;来生成 0 到 100 之间的随机数这种方法是不可取的,比较好的做法是: j=(int)(100.0*rand()/(RAND_MAX+1.0)) ,当然,我们也可是使用random(100)。下面的例子都是用了random(n).
2、筛选型随机数 如希望取0-99的随机数,但不能是6。
解决方法:
x = random(100);
while (x==6) {
x = random(100);
}
又如希望取0-99的随机数,但不要5的倍数 解决方法:
x = random(100);
while ((x % 5)==0) {
x = random(100);
}
3、从连续的一段范围内取随机数。
如从40--50的范围内取随机数。 解决方法: x=random(11)+40
4、从一组乱数中取随机数。 如:从 67, 87, 34, 78, 12, 5, 9, 108, 999, 378十个数中随机取数。 解决方法:可以用数组将些十个数存贮,然后把0--9中取出的随机数作为序号,实现随机取数。
a = new Array(67, 87, 34, 78, 12, 5, 9, 108, 999, 378);
j = random(10);
x = a[j];
四.产生具有一定分布的随机数
关于这点,有一篇文章写得很好,请看:
非均匀分布随机数的产生及其在计算机模拟研究中的应用
作者:胡性本 刘向明 方积乾
单位:胡性本(湖北职工医学院 荆州434000); 刘向明(湖北职工医学院 荆州434000 现为华中理工大学生物工程系博士研究生); 方积乾(湖北职工医学院 荆州434000 中山医科大学)
关键词:非均匀分布随机数;计算机模拟;程序设计
摘 要:非均匀分布随机数在进行计算机模拟研究中有重要作用,但计算机高级语言通常都只提供产生均匀分布随机数的函数,给研究工作带来困难。该文提出的方法,较好地解决了这一问题,有很强的适用性。

中图分类号:O 242.1
文章编号:1004-4337(2000)01-0059-02▲
1 问题的提出
常用的计算机高级程序设计语言,大多提供了产生在[0,1]区间内连续均匀分布的独立随机数r的函数。若将产生的随机数作简单的变换X=a+(b-a)r,就能得到在区间[a,b]上均匀分布的随机数X。如果与取整或舍入函数结合运用,还可得到离散均匀分布的随机数,给计算机模拟提供了方便。但在很多情况下进行计算机模拟需要用到按某些特定规律分布的非均匀随机数。例如,在离子通道门控模型的模拟研究中,就经常要用到服从指数分布、对数分布、正态分布、普畦松分布等非均匀分布的随机数。这时可以在源程序中编写一个函数或过程来产生。我们在近年来所进行的计算机模拟研究工作[1,2]中,大量使用了非均们分布的随机数,获得成功。由于离散随机数可以由连续随机数通过取整或舍入等途径转换而得,本文只侧重介绍非均匀分布连续随机数的产生原理和应用实例,并给出了用类PASCAL语言[3]编写的相应的函数和过程。掌握了任何一种计算机高级语言编程技术和数据结构知识的人,都能很方便地转换成能上机运行的程序,有很大的灵活性与很强的实用性。
2 产生原理
假定连续随机变量X是连续随机变量R的函数
x= (r)                  (1)
由概率统计知识可知,X与R在对应点的分布函数的数值应当相等,即产生R的反变换
F(x)=F(r)                 (2)
其中,r为(1)式的解,即r= -1(x)=Ψ(x)
  在特殊情况下,若R是在[0,1]区间内的均匀分布的连续随机变量,那么R<r的概率P(R<r)=r。此时,(2)式可以简化为
F(x)=F(r)=r                (3)
其反函数
x=F-1(r)                  (4)
具有分布函数F,现予以证明:因为分布函数是单调递增函数,其反函数存在。由概率知识可知,对任意实数X,有
  P(X<x)=P(F-1(R)<x)=P(R<F(x))
  因为R是在[0,1]区间上的均匀分布的连续随机变量,故P(R<F(x))=F(x),即F-1(r)具有分布函数F。
  (4)式表明,要产生一个服从某种分布的随机数,可以先求出其分布函数的反函数的解析式,再将一个在[0,1]区间内的均匀随机数的值代入其中计算就可以了。
3 应用实例
例1 产生密度函数满足指数分布

的随机数,其中α>0。
因为  ,故分布函数为:

由(4)式可得
             (5)
当r为[0,1]区间内的均匀随机数时,1-r也是[0,1]区间内的均匀随机数,故(5)式还可以简化为:
                (6)
假定计算机高级语言已提供了产生在[0,1]区间内均匀分布的随机数的函数RND(0),则根据(6)式可以写出产生服从指数分布的随机数的类PASCAL语言的函数如下:
  FUNC get_exp_random(alpha:real):real;
  {产生服从指数分布的随机数,值参alpha为比例参数}
  get_exp_random=-ln(RND(0))/alpha;
ENDF; {get_exp_random}
  例2 产生服从正态分布的随机数
  正态分布X~N(a,σ)都可以由标准的正态分布X′~N(0,1)经过变换X=a+σX′得到,在此只讨论服从标准正态分布的随机数的产生方法。标准正态分布的密度函数为:
               (7)
但其分布函数不能用有限的解析形式来表示,给转换带来困难,但可以用以下的变换来产生随机数。
  假定r1与r2是[0,1]区间的两个独立的均匀分布随机数,现将其作如下的变换,令
             (8)
再将其反变换为:
              (9)
(9)式中的C为常数。由此可导出其密度函数为:
           (10)
比较(10)式与(7)式,可知X1与X2是两个相互独立的服从正态分布的随机变量,因而(8)式是与(4)相当的据以产生随机数的表达式。由此可以写出产生服从标准正态分布随机数的类PASCAL语言的过程如下:
  PROC gauss(VAR x1,x2:real);
  {产生服从正态分布的随机数对,用变量参数x1与x2传递随机数}
  pi:=3.14159265;  {赋π值}
  r1:=RND(0);  r2:=RND(0);
  s:=SQRT(-2*ln(r1));  {中间变量赋值}
  x1:=s*cos(2*pi*r2);
  x2:=s*sin(2*pi*r2);
  {正态分布随机数赋给变量参数}
ENDP; {gauss}
  此过程每调用一次能产生两个相互正交的标准正态分布随机数。

最近正在进行AS3 DND-core System

2008-6-22 14:28:34 开发者 抢沙发(0)

3.5版本的玩家手册

玩DND(Dungeons & Dragons)类型虽然很早开始玩了,博得之门,无冬之夜,前年 DDO,以及现在在玩的无冬之夜2,但坚持时间的时间不多。

虽然手上握有N多DND的手册,但系统的都没怎么看过,就玩家手册倒是翻腾了N次了。

4月曾经在工作之余回到艾伯伦碎片论坛,没想到那边竟然成为了DDO的专属论坛了........

由于自己一直有想做一个DND的游戏,但都和玩游戏的时间一样,每天都只有半小时玩游戏,哈哈,和大学奢靡的生活已经完全不一样了。

以前写的棋牌类游戏,射击类游戏,格斗游戏,都是休闲性质的小游戏,但是由于那时候是在学生时代,活动和无奈的期段太的多了,所以部分游戏没有很好的完成,少数完成的游戏都是从简从速的完成的,一点都没有给自己带来什么成就感。

最郁闷的是当时创作电脑竟然三大件一个一个的都离奇死亡,现代M+升技MB+WD就这样一个一个的离我而去,好在自己备份的老硬盘没有放弃我...........

哎,数据,21世纪除人才外,最重要的是数据啊............没了也就无从谈资了.......仅此篇以怀悼(怀念哀悼)离我而去的那三大件..............

 

ok,说了那么多废话,该说说AS3 DND-core System吧。

写它的目的在于联系设计模式,将自己的代码和思考能力提高下,但最大的目的在于自己想真的做出个像样的游戏来。

计划:

3个月内完成和测试DND三大件之一:玩家

目前AS3 DND-core System 按照已有的玩家手册3.0内容建立系统,预计花费1个月的时间建立基本玩家数据核心。设计的中心思想和PureMVC中心思想类似,即,尽量让代码和内部机制不依靠当前环境机制,只有当需要环境支持的部分才采用当前环境机制。目的是为了以后更好的平台转移,毕竟AS3只是我最熟悉的语言(当初为了快速实现游戏的目的而接触的),所以就用该语言勾画自己的游戏核心。

当前目标是实现一个基本玩家在DND规则系统下能够完善的建立一个玩家的在已设游戏环境中的机制和机制链。

顺便值得提一下的是,DND3.5版本内容有部分也已经在阅读中,虽然和3.0相对改进不大。目前玩的无冬之夜2就是基于该版本的。

置于DND的3大件,中其余2件:城主和图鉴,将可能依次在玩家核心测试通过后建立。相对来说图鉴倒是可以建立在玩家基础核心上的。。。。。

概括:
DND目前我应该还是入门级的玩家,面对如此数十年的游戏规则巨作,能献上自己一份薄礼,也算是无虚度此生了。所以此后的一些时间将更广泛的接触DND社区,让自己更熟悉这片浩瀚的天空~

 

[转]Python资源

2008-6-18 0:54:13 开发者 抢沙发(0)

Python基本安装:

* http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站;
* http://www.activestate.com/ 集成多个有用插件的强大非官方版本,特别是针对Windows环境有不少改进;

Python文档:

* http://www.python.org/doc/current/lib/lib.html Python库参考手册。
* http://www.byteofpython.info/ 可以代替Tutorial使用,有中文译版的入门书籍。
* http://diveintopython.org/ 一本比较全面易懂的入门书,中文版翻译最近进步为很及时的5.4了。
* http://www.python.org/peps/pep-0008.html 建议采用的Python编码风格。
* http://doc.zoomquiet.org/ 包括Python内容的一个挺全面的文档集。

常用插件:

* http://www.pfdubois.com/numpy/ Python的数学运算库,有时候一些别的库也会调用里面的一些功能,比如数组什么的;
* http://www.pythonware.com/products/pil/ Python下著名的图像处理库Pil;
* http://simpy.sourceforge.net/ 利用Python进行仿真、模拟的解决方案;
* Matplotlib 据说是一个用来绘制二维图形的Python模块,它克隆了许多Matlab中的函数, 用以帮助Python用户轻松获得高质量(达到出版水平)的二维图形;
* http://www.amk.ca/python/code/crypto python的加解密扩展模块;
* http://cjkpython.i18n.org/ 提供与python有关的CJK语言支持功能:转码、显示之类。
* Psyco、Pyrex:两个用于提高Python代码运行效率的解决方案;
* Pyflakes、PyChecker、PyLint:都是用来做Python代码语法检查的工具。
* http://wxpython.sourceforge.net/ 基于wxWindows的易用且强大的图形界面开发包wxPython;
* http://www.pygame.org/ 用Python帮助开发游戏的库,也可以用这个来播放视频或者音频什么的,大概依靠的是SDL;
* http://starship.python.net/crew/theller/py2exe/ win下将Python程序编译为可执行程序的工具,是一个让程序脱离Python运行环境的办法,也可以生成Windows服务或者COM组件。其他能完成Python脚本到可执行文件这个工作的还有Gordon McMillan's Installer、Linux专用的freeze以及py2app、setuptools等。不过此类工具难免与一些模块有一些兼容性的问题,需要现用现测一下。
* 嵌入式数据库:BerkeleyDB的Python版,当然还有其他的好多。
* PEAK提供一些关于超轻量线程框架等基础性重要类库实现。

部分常用工具:

* http://www.scons.org/ Java有Ant这个巨火的构建工具,Python的特性允许我们构建更新类型的构建工具,就是scons了。
* Python Sidebar for Mozilla FireFox的一个插件,提供一个用来查看Python文档、函数库的侧边栏。
* IPython 很好用的Python Shell。wxPython发行版还自带了PyCrust、PyShell、PyAlaCarte和PyAlaMode等几个工具,分别是图形界面Shell和代码编辑器等,分别具有不同特点可以根据自己的需要选用。
* Easy Install 快速安装Python模块的易用性解决方案。

推荐资源:

* Parnassus山的拱顶 巨大的Python代码库,包罗万象。既可以从上面下载代码参考学习,同时也是与Python有关程序的大列表。
* Python号星际旅行船 著名Python社区,代码、文档、高人这里都有。
* faqts.com的Python程序设计知识数据库 Python程序设计知识库,都是与Python有关的程序设计问题及解决方法。
* 啄木鸟 Pythonic 开源社区 著名的(也可以说是最好的)国内Python开源社区。

代码示例:

* http://newedit.tigris.org/technical.htm Limodou的NewEdit编辑器的技术手册,讨论了一些关于插件接口实现、i18实现、wxPython使用有关的问题,值得参考。

其他东西:

* http://www.forum.nokia.com/main/0,,034-821,00.html Nokia居然发布了在Series 60系统上运行Python程序(图形界面用wxPython)的库,还有一个Wiki页是关于这个的:http://www.postneo.com/postwiki/moin.cgi/PythonForSeries60 。Python4Symbian这个页面是记录的我的使用经验。
* pyre:使用Python完成高性能计算需求的包,真的可以做到么?还没研究。
* Parallel Python:纯Python的并行计算解决方案。相关中文参考页面
* Pexpect:用Python作为外壳控制其他命令行程序的工具(比如Linux下标准的ftp、telnet程序什么的),还没有测试可用程度如何。
* pyjamas:Google GWT的Python克隆,还处在早期版本阶段。
* Durus:Python的对象数据库。

有意思的东西:

* Howie:用Python实现的MSN对话机器人。
* Cankiri:用一个Python脚本实现的屏幕录像机。

参考资料

* ZDNET文章:学习Python语言必备的资源
* Pythonic Web 应用平台对比
* 在wxPython下进行图像处理的经验 (其实,仅使用wxPython也可以完成很多比较基础的图像处理工作,具体可以参照《wxPython in Action》一书的第12节)
* 通过win32扩展接口使用Python获得系统进程列表的方法
* 如何获得Python脚本所在的目录位置
* Python的缩进问题
* py2exe使用中遇到的问题
* idle的中文支持问题
* 序列化存储 Python 对象

Python IDE

我的IDE选择经验

* http://www.xored.com Trustudio 一个基于Eclipse的、同时支持Python和PHP的插件,曾经是我最喜欢的Python IDE环境,功能相当全了,不过有些细节不完善以致不大好用。
* http://pydev.sourceforge.net/ 另一个基于Eclipse的,非常棒的Python环境,改进速度非常快,现在是我最喜欢的IDE。
* http://www-900.ibm.com/developerWorks/cn/opensource/os-ecant/index.shtml 用 Eclipse 和 Ant 进行 Python 开发
* http://www.die-offenbachs.de/detlev/eric3.html ERIC3 基于QT实现的不错的PYTHON IDE,支持调试,支持自动补全,甚至也支持重构,曾经在Debian下用它,但图形界面开发主要辅助qt,我倾向wxpython,所以最后还是放弃了这个。
* http://www.scintilla.org/ 同时支持Win和Linux的源代码编辑器,似乎支持Python文件的编辑。
* http://boa-constructor.sourceforge.net/ 著名的基于WxPython的GUI快速生成用的Python IDE,但是开发进度实在太差了……
* http://pype.sourceforge.net/ 成熟的Python代码编辑器,号称功能介于EMACS和IDLE之间的编辑器。
* http://www.stani.be/python/spe SPE:号称是一个Full Featured编辑器,集成WxGlade支持GUI设计。

[原]反色和补色

2008-6-14 15:18:37 常识 抢沙发(0)

名字看上去貌似和求色彩的补一样

网络上的数学方法分别是:(原文http://hi.baidu.com/graydeer/blog/item/300a94513367502443a75b33.html)
反色:
CNew = 255 - COld
补色:
CNew = Max(R,G,B) + Min(R,G,B) - COld


其实如果对“反”和“补”的关键敏感的计算机同学来说很容易联想到某方法:
反色:
CNew = ~ COld   
补色:
CNew = ~COld +1   

看上是不是很简单阿? 哈哈,但下面的补色算法却是不正确的,知道为什么么?

那就是在计算机中的色彩数值都当无符号数处理了。。。。。。。。 可惜啊,所以只能当第一种方式处理了......

啊?你和我说ByteArray? 哈哈....偶就快倒下了。。。。。。。。 

 

 

以下为actionscript3 测试代码:
 

  1. var a:Shape = new Shape();  
  2. a.graphics.beginFill(0x183700)  
  3. a.graphics.drawRect(0, 0, 50, 50);  
  4. a.graphics.endFill();  
  5.               
  6. var b:Shape = new Shape();  
  7. b.graphics.beginFill(~0x183700)  
  8. b.graphics.drawRect(0, 0, 50, 50);  
  9. b.graphics.endFill();  
  10. b.x = 100;  
  11.               
  12. var c:Shape = new Shape();  
  13. c.graphics.beginFill(~0x183700+1)  
  14. c.graphics.drawRect(0, 0, 50, 50);  
  15. c.graphics.endFill();  
  16. c.x = 200;  
  17.               
  18. addChild(a);  
  19. addChild(b);  
  20. addChild(c) 

 

[原]一个比较好记的色彩三要素

2008-6-14 15:03:08 常识 抢沙发(0)

A:“色彩三要素是什么?”
B:“Hi SB......................”
A:“嗯?”
B:“Hi SB......................”
A:“!!!”
.........
B从地上爬起来,说:“我没说错哇.........”
A:“是什么?”
B:“Hi SB”
..................................
A:“囧RZ~~~~~~~~~~~~~~(爬过)”

 

HSB-色相(Hue)、饱和度(Saturation)、亮度(Brightness)。

[原]horidream的水纹效果心得确实很不错

2008-6-13 21:28:53 算法 抢沙发(0)

效果请点击本文章察看内部

原作者:http://www.horidream.com/blog/?p=35#respond

实现代码:

  1. package {  
  2.     import flash.display.Bitmap;  
  3.     import flash.display.BitmapData;  
  4.     import flash.display.BitmapDataChannel;  
  5.     import flash.display.Sprite;  
  6.     import flash.events.TimerEvent;  
  7.     import flash.filters.DisplacementMapFilter;  
  8.     import flash.geom.Point;  
  9.     import flash.utils.Timer;  
  10.       
  11.     /**  
  12.     * ...  
  13.     * @author telds[kingfo]  
  14.     */ 
  15.     public class BitmapWater extends Sprite {  
  16.           
  17.           
  18.         public function BitmapWater() {  
  19.              var renderTimer:Timer;  
  20.                
  21.              var img:Bitmap = new IMG() as Bitmap;  
  22.              var imgH:Number = img.height;  
  23.              var imgW:Number = img.width;  
  24.              var bmd:BitmapData = new BitmapData(imgW, imgW, false, 0);  
  25.                            
  26.               
  27.                
  28.              var baseX:Number = 50;  
  29.              var baseY:Number = 50;  
  30.              var numOctaves:uint = 3;  
  31.              var randomSeed:int = Math.floor(Math.random() * 100000);  
  32.              var stitch:Boolean = true;  
  33.              var fractalNoise:Boolean = true;   
  34.              var channelOptions:uint = BitmapDataChannel.RED;  
  35.              var grayScale:Boolean = false;
  36. //Each of numOctaves 
  37.              var offsets:Array = [new Point()/*one of numOctaves*/];  
  38.               
  39.              addChild(img);  
  40.               
  41.             renderTimer = new Timer(20,0);  
  42.             renderTimer.addEventListener(TimerEvent.TIMER, function Todo(event:TimerEvent):void {  
  43.                 bmd.perlinNoise(baseX, baseY, numOctaves, randomSeed, stitch, fractalNoise, channelOptions, grayScale, offsets);  
  44.                   
  45.                 offsets[0].x = offsets[0].x + 20;  
  46.                 offsets[0].y = offsets[0].y - 20;  
  47.                 img.filters = [new DisplacementMapFilter(bmd, new Point(0, 0), channelOptions, channelOptions, 10, 10)];  
  48.             })  
  49.             renderTimer.start();  
  50.         }  
  51.           
  52.           
  53.           
  54.         [Embed(source = '../bin/123.jpg')]private var IMG:Class;  
  55.           
  56.     }  
  57.