Esempio n. 1
0
class LSDrawer:


    def __init__(self, draw_rules: Dict[str, str], _turtle: Turtle = None, start_pos = (-100, -100), speed = 10) -> None:
        self.t = Turtle() if not _turtle else _turtle

        self.draw_rules = draw_rules

        self.t.speed(speed)
        self.t.up()
        self.t.setposition(start_pos)
        self.t.down()
        self.t.resizemode('auto')
        self.t._tracer(0)

        
    
    def draw(self, lsystem: str) -> None:
        self.stack = []
        for c in lsystem:
            if c in self.draw_rules:
                try:
                    eval(f'self.t.{self.draw_rules[c]}')
                except:
                    print(f'Cant to do {self.draw_rules[c]}')
            elif c == '[':
                pos = self.t.pos()
                ang = self.t.heading()
                self.stack.append((pos, ang))

            elif c == ']':
                pos, ang = self.stack.pop()
                
                self.t.up()
                self.t.setpos(pos)
                self.t.setheading(ang)
                self.t.down()

            else:
                pass
        self.t._update()


    @staticmethod
    def create_L_system(ls: str, n: int, ls_rules: Dict[str, str]) -> str:
        
        for i in range(n):
            rez = ''
            for c in ls:
                if c not in ls_rules:
                    rez += c
                else:
                    rez += ls_rules[c]
            ls = rez
        return rez