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

python:分形与可视化-L文法系统

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(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
            for rule in P:
                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'
        }
#科赫曲线图形结构
koch={'angle':60,
      'axiom':'F',
      'P':['F->F+F--F+F']
      }
#科赫雪花结构
koch_snow={'angle':60,
           'axiom':'F--F--F',
           'P':['F->F+F--F+F']
           }
#分形龙图形结构
dragon={'angle':45,
        'axiom':'FX',
        'P':['F->',
             'Y->+FX--FY+',
             'X->-FX++FY-'
             ]
        }
tree1={'angle':25,
        'axiom':'F',
        'P':['F->F[-F]F[+F]F']
        }

tree2={'angle':25,
        'axiom':'F',
        'P':['F->F[+F]F[-F]F']
        }
tree3={'angle':22.5,
        'axiom':'X',
        'P':['X->F-[[X]+X]+F[+FX]-X']
        }
tree4={'angle':22.5,
        'axiom':'F',
        'P':['F->FF-[XY]+[XY]',
             'X->+FY',
             'Y->-FX']
        }
tree5={'angle':22,
        'axiom':'F',
        'P':['F->F[-FR-FR-FR]F[+FR+FR+FR]F[FR]',
             'R->RF[+R][++R][+++R][-R][--R][---R]R']
        }
tree6={'angle':15,
        'axiom':'F',
        'P':['F->+F[+F]--F[---F]+F']
        }
tree7={'angle':25,
        'axiom':'X',
        'P':['X->F+[[X]-X]-F[-FX]+X',
             'F->FF'
             ]
        }

if __name__=='__main__':
    b_color='white'
    p_color='black'
    #设置窗口的默认颜色
    plt.rcParams['figure.facecolor']=b_color
    #设置起始点
    A=(0,0,0)
    #设置步长
    L=30
    #设置迭代次数
    n=10
    #调用函数生成字符串并绘制图形
    L_system(dragon,A,L,n)
    #设置xy轴的单位长度相等
    plt.axis('equal')
    #隐藏坐标轴
    plt.axis('off')
    plt.savefig('C:\\Users\\14486\\Desktop\\1.png',facecolor=b_color)
    plt.show()

科赫曲线迭代5次后的图像

科赫雪花结构迭代5次后的图像

分形龙图结构迭代10次后的图像

tree1迭代5次后的图像

tree2迭代5次后的图像

tree3迭代5次后的图像

tree4迭代5次后的图像

tree5迭代3次后的图像

tree6迭代3次后的图像

tree7迭代3次后的图像

posted @ 2021-10-31 20:02  胸前小红花  阅读(131)  评论(0)    收藏  举报