====== Christmas Art ======
**Ziel:**
* Mit TigerJython & TurtleGraphics weihnachtliche Kunst erstellen. (*)
* Dabei die Grundlagen der Programmierung auffrischen.
(*) Falls man lieber mit richtigem Python arbeiten möchte, kann man deren [[https://docs.python.org/3/library/turtle.html|Turtle-Module]] verwenden.
{{ :gf_informatik:snow.png?600 |}}
==== Theorie ====
[[gf_informatik:programmieren_i_sca|TurtleGraphics Dossier (1M)]]
++++Zusammenstellung wichtigste Befehle|
from gturtle import *
Options.setPlaygroundSize(800,600) # Fenstergroesse veraendern
t = Turtle() # Turtle erstellen
# Hintergrundfarbe setzen
t.setFillColor("black")
t.fill(0,0)
# Farbe und Dicke des Stifts setzen
t.setPenColor("white")
t.setPenWidth(2)
# Turtle verstecken, damit nicht warten muss
t.hideTurtle()
# Basic Move
t.home() # in Mitte des Screens setzen, nach oben ausrichten
t.setPos(200,50) # an Position mit x=200 und y=50 setzen
t.forward(150) # vorwaerts laufen (Anzahl Pixel angeben)
t.back(10) # rueckwaerts laufen
t.left(45) # nach links drehen (Winkel angeben)
t.right(45) # nach rechts drehen
++++
==== Schneeflocke ====
1. Wähle ein **Schneeflockenmuster** aus. Recherchiere im Internet, erfinde ein eigenes oder wähle eines der folgenden: {{ :gf_informatik:snowflakes.jpg?400 |}} Falls du keine Lust auf Schneeflocken hast, kannst du auch einen einfachen Tannenbaum oder ein anderes weihnachtliches Bild zeichnen.\\ \\
1. **Zeichne** nun eine Schneeflocke ins Zentrum des Bildschirms. Tipps:
1. Beginne mit `t.home()`, damit Turtle richtig ausgerichtet ist.
1. Verwende **Schleifen** (while oder for) anstelle von Copy-Paste.
1. Verwende **Variablen** für Werte, die mehrfach benötigt werden.
1. Siehe **Theorie** oben.\\ \\
1. Packe deinen Code vom letzten Punkt nun in eine **Funktion**. Dies erlaubt die, ganz viele Schneeflocken an verschiedenen Orten zu zeichnen:
def schneeflocke(x,y): # soll eine Schneeflocke, startend am Punkt (x,y) zeichnen
t.home() # damit Turtle gerade nach oben schaut
t.setPos(x,y) # setze Turtle an gewuenschte Startposition
... # hier dein Code vom letzten Punkt
1. Nun kannst du ganz **viele Schneeflocken** zeichnen:
schneeflocke(-200,-130)
schneeflocke(0,0)
schneeflocke(50,70)
Alternativ kannst du auch mit `random` **Zufallspositionen** generieren:
import random
x = random.randint(-400,400)
...
1. **Optional:**
1. Gib den Schneeflocken **verschiedene Farben**.
1. Implementiere **verschiedene Formen**, z.B. mehrere verschiedene Schneeflocken.
1. *Anspruchsvoll:* Generiere die Positionen der Schneeflocken **zufällig** und stelle sicher, dass es **keine Überlappungen** gibt.
++++Code sca|
from gturtle import *
import random
colors = ["white","red","green","blue"]
WIDTH = 1200
HEIGHT = 800
Options.setPlaygroundSize(WIDTH,HEIGHT)
t = Turtle()
t.setFillColor("black")
t.fill(0,0)
t.setPenColor("white")
t.setPenWidth(1)
t.hideTurtle()
### dimensions
scale = 0.5
d = int(50 * scale)
d1 = int(15 * scale)
ang1 = 45
d2 = int(20 * scale)
d3 = int(15 * scale)
ang3 = 55
def schneeflocke(x=0,y=0,color="white"):
t.setPenColor(color)
for i in range(6):
t.home()
t.setPos(x,y)
t.left(60*i+30)
t.forward(d)
t.back(d1)
t.left(ang1)
t.forward(d1)
t.back(d1)
t.right(2*ang1)
t.forward(d1)
t.back(d1)
t.left(ang1)
t.back(d2)
t.left(ang3)
t.forward(d3)
t.back(d3)
t.right(2*ang3)
t.forward(d3)
t.back(d3)
t.left(ang3)
def get_nonoverlapping_positions(n=10,d_min=2,width=800,height=600):
positions = []
for i in range(n):
while True:
x = random.randint(-width//2,width//2)
y = random.randint(-height//2,height//2)
# list empty
if len(positions) == 0:
positions.append((x,y))
break
# check if point is far enough from other points
too_close = False
for (px,py) in positions:
d = ((px-x)**2 + (py-y)**2)**0.5
if d < d_min:
too_close = True
break
if not too_close:
positions.append((x,y))
break
return positions
positions = get_nonoverlapping_positions(n=120,d_min=70,width=WIDTH,height=HEIGHT)
for x,y in positions:
schneeflocke(x,y,random.choice(colors))
#t.savePlayground("/Users/anschae/schneeflocken.png","png")
++++