Created
December 14, 2019 10:34
-
-
Save albusdemens/2ee1649aa990734db9ed8ff1f4c79c4e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from tkinter import * | |
| from turtle import * | |
| import turtle | |
| SYSTEM_RULES = {} # generator system rules for l-system | |
| def derivation(axiom, steps): | |
| derived = [axiom] # seed | |
| for _ in range(steps): | |
| next_seq = derived[-1] | |
| next_axiom = [rule(char) for char in next_seq] | |
| derived.append(''.join(next_axiom)) | |
| return derived | |
| def rule(sequence): | |
| if sequence in SYSTEM_RULES: | |
| return SYSTEM_RULES[sequence] | |
| return sequence | |
| def draw_l_system(turtle, SYSTEM_RULES, seg_length, angle): | |
| stack = [] | |
| for command in SYSTEM_RULES: | |
| turtle.pd() | |
| if command in ["F", "G", "R", "L"]: | |
| turtle.forward(seg_length) | |
| elif command == "f": | |
| turtle.pu() # pen up - not drawing | |
| turtle.forward(seg_length) | |
| elif command == "+": | |
| turtle.right(angle) | |
| elif command == "-": | |
| turtle.left(angle) | |
| elif command == "[": | |
| stack.append((turtle.position(), turtle.heading())) | |
| elif command == "]": | |
| turtle.pu() # pen up - not drawing | |
| position, heading = stack.pop() | |
| turtle.goto(position) | |
| turtle.setheading(heading) | |
| def set_turtle(alpha_zero): | |
| r_turtle = turtle.Turtle() # recursive turtle | |
| r_turtle.screen.title("L-System Derivation") | |
| r_turtle.speed(0) # adjust as needed (0 = fastest) | |
| r_turtle.setheading(alpha_zero) # initial heading | |
| return r_turtle | |
| def main(): | |
| rule_num = 1 | |
| while True: | |
| rule = input("Enter rule[%d]:rewrite term (0 when done): " % rule_num) | |
| if rule == '0': | |
| break | |
| key, value = rule.split("->") | |
| SYSTEM_RULES[key] = value | |
| rule_num += 1 | |
| axiom = input("Enter axiom (w): ") | |
| iterations = int(input("Enter number of iterations (n): ")) | |
| model = derivation(axiom, iterations) # axiom (initial string), nth iterations | |
| segment_length = int(input("Enter step size (segment length): ")) | |
| alpha_zero = float(input("Enter initial heading (alpha-0): ")) | |
| angle = float(input("Enter angle increment (i): ")) | |
| # Set turtle parameters and draw L-System | |
| r_turtle = set_turtle(alpha_zero) # create turtle object | |
| turtle_screen = turtle.Screen() # create graphics window | |
| turtle_screen.screensize(1500, 1500) | |
| draw_l_system(r_turtle, model[-1], segment_length, angle) # draw model | |
| #turtle_screen.exitonclick() | |
| ts = turtle.getscreen() | |
| ts.getcanvas().postscript(file="tree.eps") | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment