Blog

Advent of Code Tag 4: Visualisieren!

Serge Beaumont

Aktualisiert Oktober 21, 2025
4 Minuten

Als ich mir meine verworrene Lösung für Tag 3 ausdachte, musste ich die Kabelwege unbedingt visualisieren, um eine Vorstellung von der Lösung zu bekommen. Nachdem ich ein hübsches Bild gemacht und es getwittert hatte, bekam ich mehr Likes als erwartet und eine Antwort von jemandem, dass er keine Zeit dafür hätte. Deshalb dieser Beitrag: Visualisierung in Python ist gar nicht so schwer, hier ist, wie es geht.

Ich habe Pillow verwendet, das eine Abspaltung von PIL, der Python Image Library, ist. Nach den üblichen Installationsritualen ist alles, was Sie brauchen, um loszulegen, dieser Code:

from PIL import Image, ImageDraw
...
im = Image.new('RGB', (800, 600), (0, 0, 0))
draw = ImageDraw.Draw(im)

In diesem Code steht (800, 600) für die Größe der Leinwand und (0, 0, 0) für den RGB-Code des Hintergrunds (in diesem Fall Schwarz). Für Puzzlezwecke decken Linien und Punkte 90% Ihres Bedarfs ab:

draw.line((x1, y1, x2, y2), (255, 255, 0), width=5)
draw.ellipse((x1, y1, x2, y2), fill=(255, 0, 255)

Sowohl line als auch ellipse verwenden ein Tupel aus zwei Punkten, um zu bestimmen, was gezeichnet werden soll. Im Fall von ellipse definieren Sie im Grunde die Bounding Box, so dass (0, 0, 10, 10) Ihnen einen Kreis mit dem Mittelpunkt (5, 5) und einem Durchmesser von 10 gibt. Dann gibt es noch ein RGB-Tupel für die Farbe und eine Linienbreite. Größere Werte sind gut, um große Bilder zu veröffentlichen und trotzdem einige Linien zu sehen. Eine Breite von 1 ermöglicht eine präzise Ausgabe des Puzzles, wenn Sie nach Inspiration für eine Lösung suchen.

im.show()

Das ist alles, was Sie tun müssen, um Ihr Bild anzuzeigen. Auf einem Mac wird dadurch die Vorschau mit einem Bild gestartet.

Es gibt eine Sache, die Sie vielleicht im Code tun möchten, nämlich das Koordinatensystem zu spiegeln. Das ist notwendig, weil das Koordinatensystem des Bildes (0, 0) oben links mit der positiven x-Achse nach rechts und der positiven y-Achse nach unten liegt. Warum sollten Sie das also nicht ändern?

    def flip(point):
        return point[0], im.height - point[1]

Schließlich werden Sie wahrscheinlich Minimal- und Maximalwerte haben, die nicht genau zwischen (0, 0) und einer schönen positiven Koordinate wie (800, 800) liegen. Sie können dies beheben, indem Sie jede Puzzle-Koordinate in eine Bildkoordinate umwandeln. Da Sie Ihre Minimal- und Maximalwerte in einem Tupel boundaries ermittelt haben, können wir alle Koordinaten in die richtige Position übersetzen und die Drehung gleich mitmachen...

min_x, min_y, max_x, max_y = boundaries
im = Image.new('RGB', (abs(max_x - min_x), abs(max_y - min_y)), (0, 0, 0))
...
def to_image_coords(point):
        return flip((point[0] - min_x, point[1] - min_y))

Und das war's. Damit Sie das nicht alles selbst schreiben müssen, habe ich eine kleine .py-Datei erstellt, die eine Komfortklasse enthält, die das Obige für Sie verpackt. Sie können sie hier finden. Ich habe sie gerade erst erstellt, daher hoffe ich, dass sie nicht zu viele Fehler enthält... :-) Viel Spaß beim Visualisieren!

Advent des Codes 2019 Serie

Verfasst von

Serge Beaumont

Contact

Let’s discuss how we can support your journey.