lehrkraefte:blc:informatik:glf22:python:graphics

Simple Grafik mit graphics.py

Installieren Sie zuerst das nötige Paket, siehe unten.

Dokumentation als Webseite oder als pdf.

Aufgaben

Testen und Verstehen Sie folgenden Code:

from graphics import *
 
win = GraphWin("Hello", 600, 600)
 
for i in range(100,600,100):
    r = Rectangle(Point(i,200), Point(i+50,250))
    r.setFill("red")
    r.draw(win)
 
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Verändern Sie das Programm so, dass folgendes Bild entsteht:

Lösungsvorschlag

Lösungsvorschlag

from graphics import *
 
win = GraphWin("Hello", 600, 600)
 
for i in range(100,600,100):
    r = Rectangle(Point(200,i), Point(250,i+50))
    r.setFill("green")
    r.draw(win)
 
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Erweitern Sie das Programm so, dass folgendes Bild entsteht:

Lösungsvorschlag

Lösungsvorschlag

from graphics import *
 
win = GraphWin("Hello", 600, 600)
 
for i in range(100,600,100):
    for j in range(100,600,100):
        r = Rectangle(Point(j,i), Point(j+50,i+50))
        r.setFill("blue")
        r.draw(win)
 
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Zusatzaufgabe

Zusatzaufgabe

Erzeugen Sie folgendes Bild:

Hinweis: Testen Sie, ob die Summe der Koordinaten durch eine bestimme Zahl (hier im Beispiel 42) teilbar ist:

if (i+j)%42==0:
  # Tu was
else:
  # Tu was anderes

Testen und Verstehen Sie folgendes Programm:

from graphics import *
from math import cos,sin,pi
 
win = GraphWin("Hello", 600, 600)
win.setCoords(-2,-2,2,2)  # Koordinatensystem setzen
 
 
for i in range(5):
    grad = 360/5*i
    bogenmass = grad/180*pi
    x = cos(bogenmass)
    y = sin(bogenmass)
    c = Circle(Point(x,y),0.05)
    c.setFill("red")
    c.draw(win)
 
 
Circle(Point(0,0),1).draw(win)   # Einheitskreis
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Ändern Sie das Programm so ab, dass 10 Punkte auf dem Einheitskreis eingezeichnet werden.

Damit wir Punkte auf dem Einheitskreis mit Linien verbinden können, ist es praktisch Punkte auf dem Einheitskreis einfach berechnen zu können. Dazu definieren wir eine Funktion palpha, die einen Winkel in Grad als Argument entgegennimmt und den Punkt $P_\alpha$ als Point-Objekt zurückgibt:

def palpha(grad):
    bogenmass = grad/180*pi
    x = cos(bogenmass)
    y = sin(bogenmass)
    return Point(x,y)  # Resultat zurückgeben

Bauen Sie die Funktion palpha im Code ein und verwenden Sie diese direkt im Circle-Befehl (ersetzen Sie damit Point(x,y)). Testen Sie Ihr Programm.

Lösungsvorschlag

Lösungsvorschlag

from graphics import *
from math import cos,sin,pi
 
win = GraphWin("Hello", 600, 600)
win.setCoords(-2,-2,2,2)  # Koordinatensystem setzen
 
def palpha(grad):
    bogenmass = grad/180*pi
    x = cos(bogenmass)
    y = sin(bogenmass)
    return Point(x,y)  # Resultat zurückgeben
 
 
for i in range(5):
    c = Circle(palpha(360/5*i),0.05)
    c.setFill("red")
    c.draw(win)
 
 
Circle(Point(0,0),1).draw(win)   # Einheitskreis
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Testen und verstehen Sie folgendes Programm:

from graphics import *
from math import cos,sin,pi
 
win = GraphWin("Hello", 600, 600)
win.setCoords(-2,-2,2,2)  # Koordinatensystem setzen
 
def palpha(grad):
    bogenmass = grad/180*pi
    x = cos(bogenmass)
    y = sin(bogenmass)
    return Point(x,y)  # Resultat zurückgeben
 
Line(palpha(0), palpha(120)).draw(win)
Line(palpha(120), palpha(240)).draw(win)
Line(palpha(240), palpha(360)).draw(win)
 
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Ändern Sie das Programm so, dass der Befehl Line nur noch einmal vorkommt. Verwenden Sie dazu eine Wiederholung.

Lösungsvorschlag

Lösungsvorschlag

Hier sind nur die geänderten Zeilen, der Rest vom Programm bleibt sich gleich.

for i in range(0,360,120):
    Line(palpha(i), palpha(i+120)).draw(win)

Zeichnen Sie ein Fünfeck.

Definieren Sie am Anfang des Programms eine Variable n, die angibt, wie viele Ecken die Form haben soll. Testen Sie Ihr Programm, indem Sie für n die Werte 3,4 und 7 testen.

Lösungsvorschlag

Lösungsvorschlag

Nur die relevanten Zeilen sind hier aufgeführt:

n = 7
schritt = 360/n
for i in range(n):
    Line(palpha(i*schritt), palpha((i+1)*schritt)).draw(win)

Zeichnen Sie einen 5-Zack Stern: .

Verallgemeinern Sie Ihr Programm so, dass zwei Variablen n (Anzahl Zacken) und m (Wie viele Punkte eine Linie überspringt) definiert werden können. Hier das Beispiel für $n=11$ und $m=4$:

Lösungsvorschlag

Lösungsvorschlag

from graphics import *
from math import cos,sin,pi
 
win = GraphWin("Hello", 600, 600)
win.setCoords(-2,-2,2,2)  # Koordinatensystem setzen
 
def palpha(grad):
    bogenmass = grad/180*pi
    x = cos(bogenmass)
    y = sin(bogenmass)
    return Point(x,y)  # Resultat zurückgeben
 
n = 11
m = 4
schritt = 360/n
for i in range(n):
    Line(palpha(i*schritt), palpha((i+m)*schritt)).draw(win)
 
 
win.getMouse() # Pause to view result
win.close()    # Close window when done

Programmieren Sie ein Programm, das folgende Bilder erzeugt:

Lösungsvorschlag

Lösungsvorschlag

from graphics import *
from math import cos,sin,pi
 
win = GraphWin("Hello", 600, 600)
 
 
def huellkurve():
    win.setCoords(-0.1,-0.1,1.1,1.1)  # Koordinatensystem setzen
    n=50
    for i in range(n+1):
        x = i/n
        Line(Point(x,0), Point(0,1-x)).draw(win)
 
def spirale():
    win.setCoords(-1.1,-1.1,1.1,1.1)  # Koordinatensystem setzen
    umdrehungen = 5
    schritte = 400;
    for i in range(schritte):
        winkel = i/schritte*umdrehungen*2*pi
        winkel2 = (i+1)/schritte*umdrehungen*2*pi
        radius = i/schritte;
        Line(Point(radius*cos(winkel), radius*sin(winkel)), Point(radius*cos(winkel2), radius*sin(winkel2))).draw(win)
 
 
 
def clickAndWait(titel="Hello"):
    global win    # Damit kann die Variable win auch verändert werden
    win.getMouse() # Pause to view result
    win.close()
    win = GraphWin(titel, 600, 600)
 
 
huellkurve()
clickAndWait("Spirale")
spirale()
 
win.getMouse() # Pause to view result
 
win.close()    # Close window when done

Setup

Es gibt einen Screencast: direkter link, oder Stream auf BLDSG Sharepoint

Auf der Kommandozeile (git-bash) egal in welchem Ordner:

pip install graphics.py
sudo pip3 install tk graphics.py

Gehen Sie in einen geeigneten Ordner (wo Ihre eigenen Dateien fürs Programmieren liegen) und öffnen Sie dort den Ordner mit VisualCode:

code .

wobei der Punkt für das aktuelle Verzeichnis steht. Alternativ kann natürlich Code auch über das Startmenu gestartet werden und via File→Open Folder der Ordner geöffnet werden.

Wird ein ganzer Ordner geöffnet, können mehrere Dateien bearbeitet werden und die Programme komfortabel gestartet werden.

Beispiel-Programm zum Testen:

from graphics import *
 
win = GraphWin("Hello", 600, 600)
text = Text(Point(100,300), "It works")
text.setSize(36)
text.draw(win)
win.getMouse() # Pause to view result
win.close()    # Close window when done
  • lehrkraefte/blc/informatik/glf22/python/graphics.txt
  • Last modified: 2022/11/25 08:09
  • by Ivo Blöchliger