import turtle import time # Configuration FONT = ("Arial", 48, "bold") LETTER_SPACING = 65 ANIMATION_DELAY = 0.5 # seconds between drawing each letter FRACTAL_ITER = 2 # reduced iterations for faster drawing FRACTAL_SCALE = 10 # scaling factor for fractal drawing # L-system definitions for each letter (axiom, rules, angle) # 8 distinct fractals for 8 letters in "ArduGeek" L_SYSTEMS = [ ("F", {"F": "F+F--F+F"}, 60), # Koch curve ("FX", {"X": "X+YF+", "Y": "-FX-Y"}, 90), # Dragon curve ("F-G-G", {"F": "F-G+F+G-F", "G": "GG"}, 120), # Sierpinski triangle ("X", {"X": "F-[[X]+X]+F[+FX]-X", "F": "FF"}, 25),# Fractal plant ("A", {"A": "B-A-B", "B": "A+B+A"}, 60), # Arrowhead curve ("X", {"X": "X+YF++YF-FX--FXFX-YF+", "Y": "-FX+YFYF++YF+FX--FX-Y"}, 90), # Gosper curve ("F+F+F+F", {"F": "F+F-F-F+F"}, 90), # Smaller square Koch variant ("F", {"F": "F+F-F"}, 120) # Terdragon curve for an intricate, compact design ] # Setup screen and turtles def setup(): screen = turtle.Screen() screen.title("ArduGeek with Persistent Fractals") screen.bgcolor("white") pen = turtle.Turtle() pen.hideturtle() pen.penup() pen.speed(1) pen.color("darkblue") fractal_t = turtle.Turtle() fractal_t.hideturtle() fractal_t.penup() fractal_t.speed(0) fractal_t.color("gray") return screen, pen, fractal_t # Generate L-system string def generate_lsystem(axiom, rules, iterations): s = axiom for _ in range(iterations): s = ''.join(rules.get(ch, ch) for ch in s) return s # Draw L-system with given turtle def draw_lsystem(t, instructions, angle, scale): for cmd in instructions: if cmd in ('F', 'G'): t.forward(scale) elif cmd == '+': t.right(angle) elif cmd == '-': t.left(angle) elif cmd == '[': stack.append((t.position(), t.heading())) elif cmd == ']': pos, head = stack.pop() t.penup() t.goto(pos) t.setheading(head) t.pendown() # Main animation: draw each fractal once, then write letters on top def animate_text_with_fractals(screen, pen, fractal_t, text): # center the text on screen total_width = len(text) * FONT[1] * 0.6 + (len(text)-1) * LETTER_SPACING start_x = -total_width / 2 baseline_y = 0 pen.goto(start_x, baseline_y) # draw persistent fractals behind each letter for i, letter in enumerate(text): axiom, rules, angle = L_SYSTEMS[i] inst = generate_lsystem(axiom, rules, FRACTAL_ITER) fractal_t.penup() # align each fractal under its letter fractal_t.goto(start_x + i*(FONT[1]*0.6 + LETTER_SPACING), baseline_y - FONT[1]*0.6) fractal_t.setheading(90) # align fern and others upright fractal_t.pendown() global stack stack = [] draw_lsystem(fractal_t, inst, angle, FRACTAL_SCALE) fractal_t.penup() # write all letters on top, one by one pen.goto(start_x, baseline_y) for letter in text: pen.write(letter, font=FONT, align="left") pen.forward(FONT[1]*0.6 + LETTER_SPACING) time.sleep(ANIMATION_DELAY) if __name__ == '__main__': screen, pen, fractal_t = setup() input() animate_text_with_fractals(screen, pen, fractal_t, "ArduGeek") pen.penup() screen.mainloop()