(๑•͈ᴗ•͈)❀送花给你

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)
    

枫叶

posted @   胸前小红花  阅读(518)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示