diff --git a/lindenmayer/__main__.py b/lindenmayer/__main__.py index eaf9e07..2e9b0e7 100644 --- a/lindenmayer/__main__.py +++ b/lindenmayer/__main__.py @@ -1,25 +1,9 @@ -import drawer -import turtle -import lSystems import inputHelper +import turtle +import time + turtle.tracer(0, 0) turtleObject = turtle.Turtle() turtleObject.hideturtle() -for i, lSystem in enumerate(lSystems.LSystems): - print(f"{i}: {lSystem.name}") -lSystemIndex = inputHelper.inputNum(int, "Bitte ein Lindenmayer-System auswählen und die entsprechende Nummer eingeben: ", "Es gibt kein L-System mit dieser Nummer.", 0, len(lSystems.LSystems) - 1) -lSystem = lSystems.LSystems[lSystemIndex] -simulatedDraw = drawer.DrawerSimulation(lSystem.productionRules, lSystem.angel, 1, turtle.Vec2D(0, 0), 90.0, turtleObject) -simulatedDraw.draw(lSystem.startWord, 5) -maxVec = simulatedDraw.edges.maxVec() -minVec = simulatedDraw.edges.minVec() -distance = maxVec - minVec -xScale = turtleObject.screen.window_width() / distance[0] -yScale = turtleObject.screen.window_height() / distance[1] -scale = yScale if xScale > yScale else xScale -pos = (-minVec - distance * (1/2)) * scale -print(pos) -print(distance) -actualDrawer = drawer.Drawer(lSystem.productionRules, lSystem.angel, scale, pos, 90.0, turtleObject) -actualDrawer.draw(lSystem.startWord, 5) -turtleObject.screen.exitonclick() +inputHelper.takeInput(turtleObject) +turtleObject.screen.mainloop() diff --git a/lindenmayer/drawer.py b/lindenmayer/drawer.py index c01befd..16250c6 100644 --- a/lindenmayer/drawer.py +++ b/lindenmayer/drawer.py @@ -12,9 +12,9 @@ class Drawer(): self.angel = angel self.forwardDistance = forwardDistance self.turtle = turtle - self.turtle.pendown() self.turtle.setposition(startPosition) self.turtle.setheading(startRotation) + self.turtle.pendown() def storeEdges(self): pass @@ -65,3 +65,19 @@ class DrawerSimulation(Drawer): self.edges.min[i] = koord elif koord > self.edges.max[i]: self.edges.max[i] = koord + +def draw(turtleObject, lSystem, recursionDepth, middel, rotation, size): + print(size) + simulatedDraw = DrawerSimulation(lSystem.productionRules, lSystem.angel, 1, turtle.Vec2D(0, 0), rotation, turtleObject) + simulatedDraw.draw(lSystem.startWord, recursionDepth) + maxVec = simulatedDraw.edges.maxVec() + minVec = simulatedDraw.edges.minVec() + distance = maxVec - minVec + print(distance) + xScale = size[0] / distance[0] + yScale = size[1] / distance[1] + scale = yScale if xScale > yScale else xScale + pos = middel + (-minVec - distance * (1/2)) * scale + print(pos) + actualDrawer = Drawer(lSystem.productionRules, lSystem.angel, scale, pos, rotation, turtleObject) + actualDrawer.draw(lSystem.startWord, recursionDepth) diff --git a/lindenmayer/input.py b/lindenmayer/input.py deleted file mode 100644 index 4a6af52..0000000 --- a/lindenmayer/input.py +++ /dev/null @@ -1,13 +0,0 @@ -def inputInt(description, indexErrorMsg): - lSystemIndex: int - while inputError: - try: - lSystemIndex = int(input(description)) - except ValueError: - print("Fehler: keine gültige Zahl") - continue - inputError = lSystemIndex < 0 or lSystemIndex >= len(lSystems.LSystems) - if inputError: - print(indexErrorMsg) - - return lSystemIndex diff --git a/lindenmayer/inputHelper.py b/lindenmayer/inputHelper.py index 5ba8cf2..58525af 100644 --- a/lindenmayer/inputHelper.py +++ b/lindenmayer/inputHelper.py @@ -1,3 +1,7 @@ +import drawer +import turtle +import lSystems + def inputNum(inputType, description, rangeErrorMsg, minRange, maxRange, defaultValue = None): n: int inputError = True @@ -15,3 +19,33 @@ def inputNum(inputType, description, rangeErrorMsg, minRange, maxRange, defaultV print(rangeErrorMsg) return n + +def takeInput(turtleObject): + for i, lSystem in enumerate(lSystems.LSystems): + print(f"{i}: {lSystem.name}") + lSystemIndex = inputNum(int, "Bitte ein Lindenmayer-System auswählen und die entsprechende Nummer eingeben: ", "Es gibt kein L-System mit dieser Nummer.", 0, len(lSystems.LSystems) - 1) + lSystem = lSystems.LSystems[lSystemIndex] + recursionDepth = inputNum(int, "Rekursiontiefe des Lindenmayer-Systems eingeben [1-20] (Standartwert: 5): ", "Rekursionstiefe nicht im vorgegebenen Bereich.", 1, 20, 5) + rotation = inputNum(float, "Bitte die Rotation in Grad gegen den Uhrzeigersinn angeben, wobei 0° rechts ist (Standartwert: 90°): ", "nur Gradzahlen von 0 bis 360 werden akzeptiert.", 0, 360, 90) + inputError = True + while inputError: + match input("Möchtest du das das Lindenmayer-System das ganze Fenster ausfüllt? [J/n]: ").lower(): + case "j"|"": + inputError = False + drawer.draw(turtleObject, lSystem, recursionDepth, turtle.Vec2D(0, 0), rotation, turtleObject.screen._window_size()) + takeInput(turtleObject) + case "n": + inputError = False + pos = [] + def afterClick(vec): + pos.append(vec) + if len(pos) == 2: + turtleObject.screen.onclick(None) + size = pos[1] - pos[0] + middel = pos[0] + (1/2) * size + print(middel) + size = turtle.Vec2D(abs(size[0]), abs(size[1])) + drawer.draw(turtleObject, lSystem, recursionDepth, middel, rotation, size) + takeInput(turtleObject) + + turtleObject.screen.onclick(lambda x, y: afterClick(turtle.Vec2D(x, y))) diff --git a/lindenmayer/lSystems.py b/lindenmayer/lSystems.py index 0153ed4..4a10726 100644 --- a/lindenmayer/lSystems.py +++ b/lindenmayer/lSystems.py @@ -9,9 +9,9 @@ class LSytem: angel: float LSystems = [ - LSytem("AB a", "F", {"F": "F[+F]F[-F]F"}, 25.7), - LSytem("AB b", "F", {"F": "F[+F]F[-F][F]"}, 20.0), - LSytem("AB c", "F", {"F": "FF-[-F+F+F]+[+F-F-F]"}, 22.5), + LSytem("toter Busch", "F", {"F": "F[+F]F[-F]F"}, 25.7), + LSytem("Gretenbaum", "F", {"F": "F[+F]F[-F][F]"}, 20.0), + LSytem("Laubbaum", "F", {"F": "FF-[-F+F+F]+[+F-F-F]"}, 22.5), LSytem("AB d", "X", {"X": "F[+X]F[-X]+X", "F": "FF"}, 20.0), LSytem("AB e", "X", {"X": "F[+X][-X]FX", "F": "FF"}, 25.7), LSytem("AB f", "X", {"X": "F-[[X]+X]+F[+FX]-X", "F": "FF"}, 22.5),