custom postion drawing
This commit is contained in:
@ -1,25 +1,9 @@
|
|||||||
import drawer
|
|
||||||
import turtle
|
|
||||||
import lSystems
|
|
||||||
import inputHelper
|
import inputHelper
|
||||||
|
import turtle
|
||||||
|
import time
|
||||||
|
|
||||||
turtle.tracer(0, 0)
|
turtle.tracer(0, 0)
|
||||||
turtleObject = turtle.Turtle()
|
turtleObject = turtle.Turtle()
|
||||||
turtleObject.hideturtle()
|
turtleObject.hideturtle()
|
||||||
for i, lSystem in enumerate(lSystems.LSystems):
|
inputHelper.takeInput(turtleObject)
|
||||||
print(f"{i}: {lSystem.name}")
|
turtleObject.screen.mainloop()
|
||||||
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()
|
|
||||||
|
|||||||
@ -12,9 +12,9 @@ class Drawer():
|
|||||||
self.angel = angel
|
self.angel = angel
|
||||||
self.forwardDistance = forwardDistance
|
self.forwardDistance = forwardDistance
|
||||||
self.turtle = turtle
|
self.turtle = turtle
|
||||||
self.turtle.pendown()
|
|
||||||
self.turtle.setposition(startPosition)
|
self.turtle.setposition(startPosition)
|
||||||
self.turtle.setheading(startRotation)
|
self.turtle.setheading(startRotation)
|
||||||
|
self.turtle.pendown()
|
||||||
|
|
||||||
def storeEdges(self):
|
def storeEdges(self):
|
||||||
pass
|
pass
|
||||||
@ -65,3 +65,19 @@ class DrawerSimulation(Drawer):
|
|||||||
self.edges.min[i] = koord
|
self.edges.min[i] = koord
|
||||||
elif koord > self.edges.max[i]:
|
elif koord > self.edges.max[i]:
|
||||||
self.edges.max[i] = koord
|
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)
|
||||||
|
|||||||
@ -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
|
|
||||||
@ -1,3 +1,7 @@
|
|||||||
|
import drawer
|
||||||
|
import turtle
|
||||||
|
import lSystems
|
||||||
|
|
||||||
def inputNum(inputType, description, rangeErrorMsg, minRange, maxRange, defaultValue = None):
|
def inputNum(inputType, description, rangeErrorMsg, minRange, maxRange, defaultValue = None):
|
||||||
n: int
|
n: int
|
||||||
inputError = True
|
inputError = True
|
||||||
@ -15,3 +19,33 @@ def inputNum(inputType, description, rangeErrorMsg, minRange, maxRange, defaultV
|
|||||||
print(rangeErrorMsg)
|
print(rangeErrorMsg)
|
||||||
|
|
||||||
return n
|
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)))
|
||||||
|
|||||||
@ -9,9 +9,9 @@ class LSytem:
|
|||||||
angel: float
|
angel: float
|
||||||
|
|
||||||
LSystems = [
|
LSystems = [
|
||||||
LSytem("AB a", "F", {"F": "F[+F]F[-F]F"}, 25.7),
|
LSytem("toter Busch", "F", {"F": "F[+F]F[-F]F"}, 25.7),
|
||||||
LSytem("AB b", "F", {"F": "F[+F]F[-F][F]"}, 20.0),
|
LSytem("Gretenbaum", "F", {"F": "F[+F]F[-F][F]"}, 20.0),
|
||||||
LSytem("AB c", "F", {"F": "FF-[-F+F+F]+[+F-F-F]"}, 22.5),
|
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 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 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),
|
LSytem("AB f", "X", {"X": "F-[[X]+X]+F[+FX]-X", "F": "FF"}, 22.5),
|
||||||
|
|||||||
Reference in New Issue
Block a user