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

python:分形与数据可视化:L系统_随机

import random

import matplotlib.pyplot as plt
import math

class my_turtle:
    def __init__(self,A):
        self.x=A[0]
        self.y=A[1]
        self.d=A[2]#方向

    def get_point(self):
        return (self.x,self.y,self.d)

    def restore(self,p):
        self.x=p[0]
        self.y=p[1]
        self.d=p[2]

    #向前一步,画线
    def forward(self,L):
        #计算下一点的坐标
        x1=self.x+L*math.cos(self.d*math.pi/180)
        y1=self.y+L*math.sin(self.d*math.pi/180)
        #两点之间画线
        X=[self.x,x1]
        Y=[self.y,y1]
        plt.plot(X,Y,c=p_color,alpha=1)#绘制线段
        #设置当前状态为下一点的状态
        self.x=x1
        self.y=y1

    #向前一步,不画线
    def go(self,L):
        x1=self.x+L*math.cos(self.d*math.pi/180)
        y1=self.y+L*math.sin(self.d*math.pi/180)

        self.x=x1
        self.y=y1

    #向左转angle度
    def left(self,angle):
        self.d=self.d+angle

    def right(self,angle):
        self.d=self.d-angle

 

def L_system_Random(LS, A, L, n):
    angle = LS['angle']  # 获得图形结构的角度增量
    axiom = LS['axiom']  # 获取图形结构的公理
    P = LS['P']  # 获取图形结构的规则
    # 字符串重写
    i = 0
    new_str = axiom  # 初始字符串为公理
    # 重复迭代替换
    while i < n:
        s = []
        for alpha in new_str:
            k = 0
            p=random.random()#生成0-1之间的一个随机数
            if p<=0.3:
                rule=P[0]
            elif p>0.3 and p<=0.7:
                rule=P[1]
            else:
                rule=P[2]

            origin,desti=rule.split('->')
            if alpha==origin:
                if desti:
                    s.append(desti)
                k=1
            if k==0:
                s.append(alpha)
        new_str=''.join(s)
        print(new_str)
        i+=1

    #实例化生成一个my_turtle对象
    t1=my_turtle(A)

    #解释字符串绘图
    stack=[] #采用列表实现栈
    #遍历字符串
    for alpha in new_str:
        if alpha not in plot_V:
            continue
        if alpha=='F':
            t1.forward(L)
        elif alpha=='f':
            t1.go(L)
        elif alpha=='+':
            t1.left(angle)
        elif alpha=='-':
            t1.right(angle)
        elif alpha=='[':
            C=t1.get_point()
            stack.append(C)
        elif alpha==']':
            A=stack[-1]
            del stack[-1]
            t1.restore(A)


plot_V={'F':'向前移动一步,画条线',
        'f':'向前移动一步,不画线',
        '+':'逆时针旋转',
        '-':'顺时针旋转',
        '[':'push',
        ']':'pop'
        }
tree_random={
    'angle':25,
    'axiom':'F',
    'P':['F->F[+F]F[-F]F',
        'F->F[+F]F[-F[+F]]',
         'F->FF+[+F+F]-[+F]'
         ]
}
if __name__=='__main__':
    b_color='white'
    p_color='black'
    #设置窗口的默认颜色
    plt.rcParams['figure.facecolor']=b_color
    #设置起始点
    A=(0,0,90)
    #设置步长
    L=30
    #设置迭代次数
    n=4
    for i in range(10):
        L_system_Random(tree_random,A,L,n)
        plt.axis('equal')
        # 隐藏坐标轴
        plt.axis('off')
        plt.savefig('C:\\Users\\14486\\Desktop\\'+str(i)+'.png', facecolor=b_color)
        plt.clf()
posted @ 2021-11-11 21:47  胸前小红花  阅读(69)  评论(0)    收藏  举报