python:IFS(迭代函数系统)
Iterated Function System
IFS采用自仿射变换(不等比例)
确定性:仿射变换的规则(6个系数)是确定的
随机性:每个仿射变幻会依据它的概率被应用
IFS最关键的是6个仿射变换系数(a,b,c,d,e,f)和一个概率P,称为IFS码
#迭代函数系统IFS 自仿射变换-不等比例
#仿射变换是一种二维图形的线形变换,变换后必须是满足“平直性”和“平行性”
#包括一系列原子变换:平移缩放翻转旋转和剪切
#仿射变换系数(a,b,c,d,e,f)和概率P
#螺旋
import matplotlib.pyplot as plt
import numpy as np
luo_xun=[(),
(),
()]
fengye=[(0,0,0,0.5,0,0,0.05),
(0.12,-0.82,0.42,0.42,0,0.2,0.4),
(0.12,0.82,-0.42,0.42,0,0.2,0.4),
(0.1,0,0,0.1,0,0.2,0.15)]
def IFS(IFS_code,n):
#设置初始点位置
x=0
y=0
#点序列集,初始为空列表
dots=[]
#获取IFS_code中每个仿射变换的概率,最后一个IFS_code元素是概率
P=[c[-1] for c in IFS_code]
#绘制IFS图形
for dot in range(n):
r=np.random.rand()#生成(0,1)之间的一个随机浮点数
#依据随机数r,选择仿射变换
p0=0
for i,p in enumerate(P):
p1=p0+p
if r>p0 and r<=p1:
k=i
break
else:
p0=p1
#获取6个仿射变换系数
a=IFS_code[k][0]
b=IFS_code[k][1]
c=IFS_code[k][2]
d=IFS_code[k][3]
e=IFS_code[k][4]
f=IFS_code[k][5]
#计算仿射变换后的坐标值
u=a*x+b*y+e
y=c*x+d*y+f
x=u
#仿射变换后的点加入点序列集dots
dots.append((x,y))
#清除当前的axes
plt.cla()
#设置x,y轴的单位长度相等
plt.axis('equal')
#隐藏坐标轴
plt.axis('off')
#绘制点集
X=[d[0] for d in dots]
Y=[d[1] for d in dots]
plt.scatter(X,Y,color=p_color,s=3,alpha=1)
#暂停0.1秒
plt.pause(0.1)
#开始主程序
if __name__ == '__main__':
#设置背景色和画笔色
bg_color=(30/255,31/255,26/255)
p_color=(240/255,102/255,56/255)
#设置默认的窗口颜色
plt.figure(facecolor=bg_color)
#打开交互模式
plt.ion()
#绘制IFS图形
IFS(fengye,5000)
#关闭交互模式
plt.ioff()
#plt.imshow()
#保存图像到文件
plt.savefig('C:\\Users\\14486\\Desktop\\分形学习\\IFS.png',facecolor=bg_color)
枫叶
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步