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
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
- Advent of Code 2019 hat begonnen - Machen Sie mit!
- Advent of Code 2019 - Tag 2
- Advent des Codes: Wie Excel mir den Tag rettete und auch meinem Sohn den Tag rettete
- Advent des Codes - Tag 4: Visualisieren
- Advent des Codes - Tag 5: Saintaerkla2s
- Advent of Code - Tag 6: Wie ich an AoC hängen geblieben bin
- Advent of Code - Tag 7: Teilen Sie Ihren Arbeitsablauf
- Advent of Code - Tag 8: Wie einfache Dinge für manche Menschen sehr schwer sein können
- Advent of Code - Tag 9: Wie ich anfing, Spaß am Lösen von Programmierrätseln zu haben
- Advent of Code - Tag 10: Weltraum-Cowboys schießen Pixel in den Himmel
- Advent des Codes - Tag 11: Sein oder nicht sein
- Advent of Code - Tag 12: Nach dem Mond schießen
- Advent des Codes - Tag 14: Kettenreaktion
- Advent des Codes - Tag 16: Flüche
- Advent of Code - Tag 17: Vakuumieren eines Gerüsts mit dem Intcode-Programm
- Wie kleine grüne Männchen mir geholfen haben, ein Rätsel zu lösen
- Advent of Code - Tag 20: Ein bisschen Überarbeitung
- Advent of Code - Tag 21: Es ist ein Marathon, kein Sprint
- Advent of Code - Tag 22: Mischen von Karten bis in alle Ewigkeit
- Advent of Code - Tag 23: Das Netzwerk ist zuverlässig
- Advent of Code - Tag 24 & 25: Unkonventionelles Denken
Verfasst von
Serge Beaumont
Contact