分形几何是对大自然中 微观与宏观 和谐统一之美的发现,分形几何最大的特点:
整体与局部的相似性: 一个完整的图形是由诸多相似的微图形组成,而整体图形又是微图形的放大。
局部是整体的缩影,整体是局部的放大。
具有自我叠加性: 整体图形是由卜伍困微图形不断重复叠加构成,且具有无限叠加能力。
什么是分形算法?
所谓 分形算法 就是使用计算机程序模拟出大自然界的分形几何图案,是 分形几何数学 与 计算机科学 相融合的艺术。
由于分形图形相似性的特点,分形算法多采用递归实现。
2. 分形算法
2.1 科赫雪花
科橘基赫雪花是由瑞典数学家科赫在 1904 年提出的一种不规则几何图形,也称为雪花曲线。
分形图形的特点是 整体几何图形 是由一个 微图形结构 自我复制、反复叠加形成,且最终形成的整体图案和微图形结构一样。在编写分形算法时,需要先理解微图案的生成过程。
科赫雪花的微图案生成过程:
先画一条直线。科赫雪花本质就由一条直线演化而成。
三等分画好的直线。
取中间线段,然后用夹角为 60° 的两条等长线段替代。
可在每一条线段上都采用如上方式进行迭代 *** 作,便会构造出多层次的科赫雪花。
科赫微图形算法实现:
使用 Python 自带小海龟模块绘制,科赫雪花递归算法的出口的是画直线。
importturtle'''
size:直线的长度
level: 科赫雪花的层次
'''defkoch(size, level):ifn ==1: turtle.fd(size)else:foriin[0,60, -120,60]: turtle.left(i)# 旋转后,再绘制koch(size //3, level -1)
参数说明:
size: 要绘制的直线长度。
level: 科赫雪花的层次。
0 阶和 1 阶 科赫雪花递归流程:
importturtleturtle.speed(100)defke_line(line_, n):ifn ==0: turtle.fd(line_)else: line_len = line_ //3foriin[0,60, -120,60]: turtle.left(i) ke_line(line_len, n -1)# 原始直线长度line =300# 移动小海龟到画布左下角turtle.penup()turtle.goto(-150, -150)turtle.pendown()# 1 阶科赫雪花di_gui_deep =1ke_line(line, di_gui_deep)turtle.done()
2 阶科赫雪花:
可以多画几个科赫雪花,布满整个圆周。
importturtleturtle.speed(100)defke_line(line_, n):ifn ==0: turtle.fd(line_)else: line_len = line_ //3foriin[0,60, -120,60]: turtle.left(i) ke_line(line_len, n -1)# 原始线长度line =300# 移动小海龟画布左下角turtle.penup()turtle.goto(-150, -150)turtle.pendown()# 几阶科赫雪花di_gui_deep =int(input("请输入科赫雪花的阶数:"))whileTrue:# 当多型念少科赫雪花围绕成一个圆周时,就构成一个完整的雪花造型count =int(input("需要几个科赫雪花:"))if360% count !=0:print("请输入 360 的倍数")else:breakforiinrange(count): ke_line(line, di_gui_deep) turtle.left(360// count)turtle.done()
4 个 3 阶科赫雪花: 每画完一个后旋转 90 度,然后再绘制另一个。
6 个 3 阶科赫雪花: 每画完一个后,旋转 60 度再画另一个。
科赫雪花的绘制并不难,本质就是画直线、旋转、再画直线……
2.2 康托三分集
由德国数学家 格奥尔格·康托尔 在1883年引入,是位于一条线段上的一些点的集合。最常见的构造是 康托尔三分点集 ,由去掉一条线段的中间三分之一得出。
构造过程:
绘制一条给定长度的直线段,将它三等分,去掉中间一段,留下两段。
再将剩下的两段再分别三等分,同样各去掉中间一段,剩下更短的四段……
将这样的 *** 作一直继续下去,直至无穷,由于在不断分割舍弃过程中,所形成的线段数目越来越多,长度越来越小,在极限的情况下,得到一个离散的点集,称为康托尔点集。
import random
import turtle
def random_color():
rgbl=[255,0,0]
random.shuffle(rgbl)
return tuple(rgbl)
def koch(size,n):
if n==0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
cc = random_color()
悄枝历 turtle.pencolor(cc[0], cc[1], cc[2])
启搜 turtle.left(angle)
koch(size/3,n-1)
def main():
turtle.colormode(255)
turtle.setup(600,600)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level=4 #4阶科赫雪花,阶搭洞数
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
turtle.done()
main()
效果如图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)