from lsystem.generator import steps from lsystem.turtle import Turtle from math import pi import cairo axiom = "F" rules = {"F": "F-F+F+F-F"} #axiom = "[F]+[F]+[F]+[F]+[F]+[F]" #rules = {"F": "F[+FF][-FF]FF[+F][-F]FF"} #rules = {"F": "F[+FFF][-FFF]FF[+FF][-FF]FF[+F][-F]FF"} theta = pi / 1.5 model = steps(axiom, rules, 6) turtle = Turtle(model, theta) turtle.margin = 10 WIDTH, HEIGHT = 400, 350 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT) ctx = cairo.Context(surface) scale = turtle.get_scaling_fn((WIDTH, HEIGHT)) def draw_line(p1, p2): sp1 = scale(p1) sp2 = scale(p2) ctx.move_to(sp1[0], sp1[1]) ctx.line_to(sp2[0], sp2[1]) ctx.set_line_width(4) ctx.set_source_rgb(0, 0, 0.1) turtle.draw(draw_line) ctx.close_path() ctx.stroke() ctx.set_line_width(1) ctx.set_source_rgb(0.3, 0.3, 0.6) turtle.draw(draw_line) ctx.close_path() ctx.stroke() ctx.set_line_width(0.3) ctx.set_source_rgb(0.9, 0.9, 1) turtle.draw(draw_line) ctx.close_path() ctx.stroke() ctx.set_source_rgb(0, 0, 0) ctx.select_font_face("Comic Sans MS") ctx.set_font_size(HEIGHT * 0.03) ctx.move_to(WIDTH * 0.05, HEIGHT * 0.92) ctx.show_text("axiom: " + axiom) ctx.move_to(WIDTH * 0.05, HEIGHT * 0.98) ctx.show_text("rules: F -> " + rules["F"]) surface.write_to_png("fractal.png")