Vorstellung der Aufgabe Nonogramme Andrea Frank Programmerpraktikum FernUniversität in Hagen
Agenda Nonogramme,, was sind das?, wie kann man sie lösen?, immer lösbar? Überblick über die Aufgabe Welche Anforderungen sind Bestandteil der Aufgabe? Fragen Folie 2
Nonogramme Jede Zahl entspricht genau der Länge eines Blocks und dessen Farbe. Bei mehreren Zahlen entspricht ihre Abfolge der Reihenfolge der Blöcke. Zwischen zwei Blöcken von derselben Farbe muss sich mindestens ein leeres Feld befinden. Blöcke von unterschiedlicher Farbe dürfen sich jedoch berühren. Folie 3
Nonogramme Zu diesem Rätsel gibt es eine eindeutige Lösung. Folie 4
Nonogramme Bei diesem Rätsel ist die Lösung nicht eindeutig. Folie 5
Nonogramme Durch Vorgabe einzelner Felder ist wieder eine eindeutige Lösung möglich. Folie 6
Nonogramme? Achtung: Nonogramme können auch unlösbar sein. Folie 7
Überblick über die Anforderungen Die Aufgabe teilt sich in drei Kernbereiche: Lösen eines Rätsels durch einen interaktiven Benutzer Lösen eines Rätsels durch den Computer Erzeugen von Rätseln aus beliebigen Grafikdateien Folie 8
Lösen eines Rätsels durch einen Benutzer GUI - grafische Benutzeroberfläche wahlweise mit AWT, SWING oder JavaFX nimmt Benutzereingaben entgegen zeigt den aktuellen Stand des Lösungsvorgangs an Die Bedienung ist in der Dokumentation zu beschreiben. Folie 9
Lösen eines Rätsels durch einen Benutzer (2) Laden und Speichern von Nonogrammen Dateiauswahldialoge verwenden (AWT: FileDialog / Swing: JFileChooser / JavaFX: FileChooser) erstes Öffnen des Dateiauswahldialogs im data -Verzeichnis erneutes Öffnen im zuletzt verwendeten Verzeichnis beim Laden/Speichern das angegebene Datenformat beachten Folie 10
Lösen eines Rätsels durch einen Benutzer (3) Interaktives Lösen Auswahl der aktuellen Farbe mit der Maus beliebiges Feld im Gitter mit der aktuellen Farbe belegen beliebiges Feld als Leerfeld markieren Feldbelegung wieder entfernen zum Ende: Überprüfen, ob Lösung korrekt ist Folie 11
Lösen eines Rätsels durch einen Benutzer (4) GUI - grafische Benutzeroberfläche Hinweise: Falls Sie nicht viel Erfahrung haben, erstellen Sie eine einfache Benutzeroberfläche (AWT: Frame / Swing: JFrame) mit einem Zeichenbereich (Canvas / JPanel) und einem Menü (Menu / JMenu). Später können Sie z.b. eine Toolbar (JToolBar (nur Swing)) für die Auswahl der Farben hinzufügen. Bei sehr großen Rätseln könnte der Zeichenbereich durch Scrollen (ScrollPane / JScrollPane) oder Zoomen (AffineTransform) erweitert werden (Hinweis für die Anforderung der Auflösung beachten). Viele hilfreiche Tipps und Codebeispiele finden Sie z.b. im Swing-Tutorial: http://docs.oracle.com/javase/tutorial/uiswing/ Folie 12
Lösen eines Rätsels durch den Computer Algorithmus GUI In Ihrem Programm muss ein Algorithmus zum Lösen von Nonogrammen implementiert sein. Dieser muss sowohl über die GUI als auch über das Test- Interface verwendet werden. Dieser Lösungsalgorithmus ist in der Dokumentation zu beschreiben. Über ein Bedienelement weist der Benutzer das Programm an, die Lösung zu berechnen. Diese wird durch Anzeige des ausgefüllten Gitters dargestellt (keine Anzeige von Zwischenschritten nötig). Test-Interface Zusätzlich wird der Lösungsalgorithmus beim automatischen Testlauf über das Interface verwendet. Folie 13
Lösen eines Rätsels durch den Computer (2) Achtung: Mit einem einfachen Probieren kommen Sie nicht weit. 16 Felder mit jeweils 2 Möglichkeiten (1 Farbe + Leerfeld) ergeben 2 65536 Möglichkeiten 100 Felder mit jeweils 5 Möglichkeiten (4 Farben + Leerfeld) ergeben 5 10 Möglichkeiten intelligente Lösungsstrategien suchen Die Techniken zum Lösen aus den Kapiteln 2 (Schritt-für-Schritt- Anleitung) und 8 (Implementierungshinweise) sind nur Vorschläge. Eigene Lösungsalgorithmen sind ebenfalls erlaubt. Folie 14
Lösen eines Rätsels durch den Computer (3) Überprüfen des Lösungsalgorithmus mit dem Test-Interface Zusatzmaterial Nonogramme.zip von der ProPra-Webseite http://www.fernuni-hagen.de/mathinf/studium/lehre/praktika/programmierpraktikum/2016_2017_ws.shtml Library Nonogramme.jar in Java-Projekt einbinden Javadoc in IDE einbinden Testdaten (Verzeichnis data) verwenden Test-Interface INonogramSolver implementieren Methode getsolution() liefert das Ergebnis Testlauf durchführen (Aufruf mit Parameter t ) Einzeltests (Aufruf mit Parameter -t beispiel.test ) Folie 15
Folie 16
Erzeugen von Rätseln eine beliebige Grafik (*.gif, *.png, *.jpg) als Quelle verwenden Festlegen der späteren Größe des Rätsels Festlegen der Anzahl der Farben im Rätsel Skalieren der Grafik Für das Skalieren einer Grafik können Sie Klassen und Methoden aus dem Java-SDK verwenden. Folie 17
Erzeugen von Rätseln (2) Runterrechnen der Farben (Farbreduktion) Reduktion auf 7 Farben Verschiedene gängige Verfahren Octrees, Median Cut, NeuQuant, Pairwise Clustering, Wu Color Quantization, Folie 18
Farbreduktion mit Octree Octree Jeder Knoten hat bis zu 8 Nachfolger (gespeichert im array childs). Jedes Blatt repräsentiert eine Farbe des Bildes Zusätzliche Attribute in Blättern: red, green, blue (Summe der Farbanteile) references (Anzahl der Pixel im Bild mit dieser Farbe) Folie 19
Farbreduktion mit Octree (Einfügen in den Baum) Pixel im Bild Farbe int 8978273 hex #88FF61 RGB 136, 255, 97 i 0 1 2 3 4 5 6 7 R = 136 = 1 0 0 0 1 0 0 0 G = 255 = 1 1 1 1 1 1 1 1 B = 97 = 0 1 1 0 0 0 0 1 Index: 6 3 3 2 6 2 2 3 Folie 20
Farbreduktion mit Octree (Einfügen in den Baum) Einfügen einer Farbe gegeben durch (r,g,b) / Int-Werte in [0..255] (Achtung: Transparenz vorher entfernen) node := Wurzel des Baums; for i :=0 to 7 do index := r[i] g[i] b[i]; // Aneinanderreihung der i-ten Bits if node.childs[index] == null then node.childs[index] := new Node(); end if node := node.childs[index]; end for node.references++; node.red += r; Node.green += g; Node.blue += b; Folie 21
Farbreduktion mit Octree (Reduktionsphase) while (Anzahl Blätter > Farbanzahl) do Wähle inneren Knoten n, dessen Summe der Farbanzahlen seiner Söhne minimal ist (dieser befindet sich direkt über Blättern); Reduziere(n); end while Folie 22
Farbreduktion mit Octree (Reduktionsphase) Reduziere (n) if (n.anzahl Söhne > (Anzahl Blätter - Farbanzahl)) then while (Anzahl Blätter > Farbanzahl) do Wähle aus n das Paar Söhne (n1,n2) mit geringstem Farbunterschied; n1.red += n2.red; n1.green += n2.green; n1.blue += n2.blue; n1.references += n2.references; Lösche n2 aus n; end while else // reduziere alle Söhne n.references := 0; for i:=0 to 7 do if (n.childs[i]!= null) then n.references += n.childs[i].references; n.red += n.childs[i].red;... n.childs[i] := null; end if end for end if Folie 23
Farbreduktion mit Octree (Endphase) Blätter im Baum einsammeln Diese stellen die wichtigsten Farben dar. alle Pixel des Bildes durchgehen Jede Farbe der ähnlichsten wichtigen Farbe zuordnen. Farbunterschiede berechnen:,,,,, ) ) + ) Hinweis: Da der Farbunterschied lediglich verglichen wird, genügt es, auf das Wurzelziehen zu verzichten und das Quadrat des Farbunterschieds zu vergleichen. Folie 24
Erzeugen von Rätseln (3) eine Farbe als Hintergrundfarbe wählen Eindeutigkeit prüfen und eventuell einige Felder vorbelegen (Schlüsselwort content) Rätsel im angegebenen Dateiformat speichern Folie 25
Fragen? Folie 26