<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    繪制L-System的分形圖?

    相關文檔: L-System分形

    _images/fractal_lsystem03.png
    # -*- coding: utf-8 -*-
    #L-System(Lindenmayer system)是一種用字符串替代產生分形圖形的算法
    from math import sin, cos, pi
    import matplotlib.pyplot as pl
    from matplotlib import collections
    
    class L_System(object):
        def __init__(self, rule):
            info = rule['S']
            for i in range(rule['iter']):
                ninfo = []
                for c in info:
                    if c in rule:
                        ninfo.append(rule[c])
                    else:
                        ninfo.append(c)
                info = "".join(ninfo)
            self.rule = rule
            self.info = info
    
        def get_lines(self):
            d = self.rule['direct']
            a = self.rule['angle']
            p = (0.0, 0.0)
            l = 1.0
            lines = []
            stack = []
            for c in self.info:
                if c in "Ff":
                    r = d * pi / 180
                    t = p[0] + l*cos(r), p[1] + l*sin(r)
                    lines.append(((p[0], p[1]), (t[0], t[1])))
                    p = t
                elif c == "+":
                    d += a
                elif c == "-":
                    d -= a
                elif c == "[":
                    stack.append((p,d))
                elif c == "]":
                    p, d = stack[-1]
                    del stack[-1]
            return lines
    
    rules = [
        {
            "F":"F+F--F+F", "S":"F",
            "direct":180,
            "angle":60,
            "iter":5,
            "title":"Koch"
        },
        {
            "X":"X+YF+", "Y":"-FX-Y", "S":"FX",
            "direct":0,
            "angle":90,
            "iter":13,
            "title":"Dragon"
        },
        {
            "f":"F-f-F", "F":"f+F+f", "S":"f",
            "direct":0,
            "angle":60,
            "iter":7,
            "title":"Triangle"
        },
        {
            "X":"F-[[X]+X]+F[+FX]-X", "F":"FF", "S":"X",
            "direct":-45,
            "angle":25,
            "iter":6,
            "title":"Plant"
        },
        {
            "S":"X", "X":"-YF+XFX+FY-", "Y":"+XF-YFY-FX+",
            "direct":0,
            "angle":90,
            "iter":6,
            "title":"Hilbert"
        },
        {
            "S":"L--F--L--F", "L":"+R-F-R+", "R":"-L+F+L-",
            "direct":0,
            "angle":45,
            "iter":10,
            "title":"Sierpinski"
        },
        
    ]
    
    def draw(ax, rule, iter=None):
        if iter!=None:
            rule["iter"] = iter
        lines = L_System(rule).get_lines()
        linecollections = collections.LineCollection(lines)
        ax.add_collection(linecollections, autolim=True)
        ax.axis("equal")
        ax.set_axis_off()
        ax.set_xlim(ax.dataLim.xmin, ax.dataLim.xmax)
        ax.invert_yaxis()
        
    fig = pl.figure(figsize=(7,4.5))
    fig.patch.set_facecolor("w")
    
    for i in xrange(6):
        ax = fig.add_subplot(231+i)
        draw(ax, rules[i])
    
    fig.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)
    pl.show()
    

    上一篇文章

    迭代函數系統的分形

    97av