
from math import sin, cos, piimport matplotlib.pyplot as plfrom matplotlib import collectionsclass 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 linesrules = [ { "F": "F+F--F+F", "S": "F", "direct": 180, "angle": 60, "iter": 8, "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": 8, "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("papayawhip")for i in range(6): ax = fig.add_subplot(231 + i) draw(ax, rules[i])help(ax.add_collection)fig.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace=0, hspace=0)pl.show()

import numpy as npimport pylab as plfrom matplotlib import cmdef iter_point(c): z = c for i in range(1, 100): # 最多迭代100次 if abs(z) > 2: break # 半径大于2则认为逃逸 z = z * z + c return i # 返回迭代次数def draw_mandelbrot(cx, cy, d): """ 绘制点(cx, cy)附近正负d的范围的Mandelbrot """ x0, x1, y0, y1 = cx - d, cx + d, cy - d, cy + d y, x = np.ogrid[y0:y1:200j, x0:x1:200j] c = x + y * 1j mandelbrot = np.frompyfunc(iter_point, 1, 1)(c).astype(np.float) pl.imshow(mandelbrot, cmap=cm.jet, extent=[x0, x1, y0, y1]) pl.gca().set_axis_off()x, y = 0.27322626, 0.595153338pl.subplot(231)draw_mandelbrot(-0.5, 0, 1.5)for i in range(2, 7): pl.subplot(230 + i) draw_mandelbrot(x, y, 0.2 ** (i - 1)) pl.subplots_adjust(0.02, 0, 0.98, 1, 0.02, 0)pl.show()