无限自相似性就是分形的精髓
具有无限自相似性的图形并不是曼德布洛特的独创。19世纪就有数学家提出了,但这个东西对数学家来说却是痛苦的回忆,因为它给数学家们精心构造的理论大厦的基础上重重来了一下。以至与数学家们在谈到这些图形时,总称之为"怪物","自然界中不存在的"(注)。但曼德布洛特则证明了分形在自然界中是最普遍的规律之一,并且,分形有自己严格而优美的规律,它不是怪物,只是看上去有些不合常规,其实,它很漂亮。
注:本来我想把它包括在正文里的,但由于里面涉及比较多的数学,所以还是做为注解来写。
注:学过数学分析的读者可以回想柯西对连续和可微的令人生畏的严格定义。当时我们对连续但有些点不可微的函数是以分段处理的办法解决的。但想象一个处处连续但处处不可微的函数吧(分形出来的),传统的数学方法对它就只好缴械了。
还有更多的分形"怪物"。象填满整个平面的不封闭曲线(不在曲线上的平面面积=0),每一点都是分叉点的曲线,个头巨大,质量为零的海绵,填满整个空间的平面,这些东西完全无法纳入经典数学的领域。于是,数学家们就奉行了一种鸵鸟主义,宣称这些东西自然界中不存在,只有少数纯粹数学家们为了理论的优美而去研究它们。
但是,很遗憾的是,这些东西的近亲在自然界简直无处不在。
我本来想避开分数维的概念,但看来还是不避开的好。不过,只要大家认真去看,会发现它其实没什么难懂的。
我们知道0维是点,一维是线,二维是面,三维是空间。那么,谁能告诉我1.5维是什么? 一条直线段是一维的,由四条这样的直线段组成的正方形是二维的。六个这样的正方形组成的正方体是三维的。直线的长度数值,正方形的面积数值和立方体的体积数值都和我们测量的单位有关。测量的单位也往往是我们所能分辨的最小单位。假设我们的分辨能力增加了一倍,因此我们把直线段长度单位减小到原单位的一半,直线段长度的计量值就变为原来的两倍,正方形面积就变为原来的四倍,体积则变为原来的八倍。
我们有下式:
log4/log2=2
log8/log2=3
这里的二和三不是巧合,这是另一种维数的定义:测度维的概念。回到海岸线长度的问题。当用直线段来近似曲线时,长度单位减为原来的一半往往意味着我们可以用长度为原来的二分之一的直线段来近似曲线。这时,海岸线长度增加程度近似于一个固定的倍数。对于英国海岸线来说,其值约为2.7,而log2.7/log2=1.41,1.41就是英国海岸线的维数。 1.41由于是一个分式所得出的比值,因此人们称之为分数维。还有其他一些分数维的定义方法,但得出的结果都比较近似。分数维是衡量分形的基本参数之一。以山脉为例,人们发现,自然界山脉的维数都近似于 2.2,因此计算机作图时,选择2.2的分数维就可以做出类似自然界的山脉图形来。
也许人们会感觉分形的计算很困难。但由于分形的无限自相似性,在计算机上实现分形其实很容易。我下次将讲解分形布朗曲面生成山脉的方法。更多的技巧则将在我最后完成随机数发生器后,写一篇"分形应用"。
自然界的山,其分形维数在2.2维左右,但从2.1维到2.5维画出来的都有一定的山的效果.
下面介绍分形布朗曲面画山的方法.先从分形布朗曲线说起. 分形布朗曲线需要用到高斯随机数,高斯随机数的说明可以参照我以前写的一篇"随机数在游戏设计中的应用",这里说明一下高斯随机数的生成.简单的生成方法是把随机数用2进制表示,数出二进制表示中1的数目,对于32位随机数来说,二进制表示中1的数目接近于均值为 16,方差为4的高斯分布,如果用几个32位随机数模拟,其分布将更为接近.为了使高斯随机数能尽量广泛地分布,我们可以在产生高斯随机数时,再使用线性随机数(就是最普通的随机数)进行插值.比如,我用两个 32位随机数模拟16位高斯分布随机数,两个32位随机数二进制表示中1的数目为0-64,因此我们每次用这一方法算出一个数后,都把它乘以65535/65=1008,再加上一个取值从0-1008的线性随机数,就可以得到一个相当近似的高斯随机数了,它的方差为8192.但这样的随机数产生速度太慢,可以用我以前所讲的方法,用查预制随机数表来产生高斯随机数,而方差为8192/A的高斯随机数只要把方差为8192的高斯随机数除以A 即可得到.
分形布朗曲线的物理定义是一维布朗运动的位移-时间坐标图,但它们的物理意义和我们作图无关.分形布朗曲线的作图方法是选择点A(x1,y1)为起点,点 B(x2,y2)为终点,选择分形布朗曲线的标度因子H(0 整个运算过程好像非常复杂,但我们可以看到它有极大的优化余地. 我们可以用非递归算 法来计算,每次把相同尺度的分形计算全部完成,并可以把2*2^H预先算出,这样,每次对相同尺度的分形 进行计算时,我们只需要一次运算就可以知道我们所得到的16bits高斯随机数除以一个怎样的参数后就可 以得到此次可用的随机数,而相同尺度的运算中还有更多的优化方法.在此不一一叙述。
总之,实时计算出地形参数是完全可行的
2009-05-17