PHP

雪花分形

这是寒假最后一篇文章了。分形,在使用繁体字的地方叫碎形,是完全由数学家创造的图形,现在常用于装饰图案,体现了数学的美。1973年,曼德勃罗(B.B.Mandelbrot)在法兰西学院讲课时,首次提出了分维和分形几何的设想。分形(Fractal)一词,是曼德勃罗创造出来的,其原意具有不规则、支离破碎等意义,分形几何学是一门以非规则几何形态为研究对象的几何学。

雪花分形就是下边的图形。

雪花分形
雪花分形

看起来很不错吧,我是用C++写的,然后又改写成php。这个图形很有名,在初中数学书中就出现过。

常说自然界是三维的,加上时间是四维的,在数学里是可以无限维的。介绍一下分维的概念,我们首先画一个线段、正方形和立方体,它们的边长都是1。用1/2的长度去度量图形,而将原图等分为若干个相似的图形。其线段、正方形、立方体分别被等分为2^1、2^2和2^3个相似的子图形,其中的指数1、2、3,我们称为1维2维3维。一般说来,如果某图形是由把原图缩小为1/r的相似的k个图形所组成,有:

r^d=k,则d是维数,取对数,用换底公式得d=(ln k)/(ln r)。

雪花分形,也就是著名的Koch图,用计算机绘制它当然想到了递归的方法,递归一定要有一个退出递归的条件。也就是要制定一个维数d,转化一下,就是制定一个最小的长度r,当到达这个长度时就开始绘制。下边是示意图,每次三等分线段,突起一个新的正三角形。

fractal
fractal-Koch

下边是php的代码,其中nMax就是一个绘制的长度。利用一些数学推导,求出各个点,然后递归函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?
//定义函数,Koch绘图算法
function Draw($x1,$y1,$x2,$y2,$color,$img,$nMax)
{
if(($x1-$x2)*($x1-$x2)+($y1-$y2)*($y1-$y2)&lt;$nMax){
imageline($img,$x1,$y1,$x2,$y2,$color);
}
else{
$x3=$x1+($x2-$x1)/3;
$y3=$y1+($y2-$y1)/3;
$x5=$x2-($x2-$x1)/3;
$y5=$y2-($y2-$y1)/3;
$D=sqrt(($x5-$x3)*($x5-$x3)+($y5-$y3)*($y5-$y3));
$alpha=0.0;
if($x5-$x3==0)$alpha=3.1415926/2;
else {
$x=(float)($y5-$y3)/(float)($x5-$x3);
$alpha=atan($x);
}
if($x5-$x3&lt;0)
$alpha=$alpha+3.1415926;
$x4=$x3+cos($alpha+3.1415926/3)*$D;
$y4=$y3+sin($alpha+3.1415926/3)*$D;
Draw($x1,$y1,$x3,$y3,$color,$img,$nMax);
Draw($x5,$y5,$x2,$y2,$color,$img,$nMax);
Draw($x3,$y3,$x4,$y4,$color,$img,$nMax);
Draw($x4,$y4,$x5,$y5,$color,$img,$nMax);
}
}
//GD绘图
$im = ImageCreate(300, 300);
$color = ImageColorAllocate($im, 0,0,0);
$color_draw = imagecolorallocate($im, 255, 198, 128);
//
Draw(50,200,250,200,$color_draw,$im,$nMax);
Draw(150,27,50,200,$color_draw,$im,$nMax);
Draw(250,200,150,27,$color_draw,$im,$nMax);
//
Header("Content-type: image/png");
ImagePNG($im); //输出图像
ImageDestroy($im); //销毁内存里的图像,释放内存空间
?>

雪花的主框架可以改变,这里用的是正三角形,分别绘制了三边,如果正六边形的框架也是很好看的。快去试试吧。这里有我做的php和html5雪花分形的测试地址,可以试试传递不同参数时绘制图形的不同。

php版本   html5版本

 

8 thoughts on “雪花分形”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据