Rasterbild

chrisööö

Mitglied
Hallo Leute,
wir müssen eine Klasse Rasterbild schreiben, die wie bei Paint der Farbfüller fungiert.
Bis auf die letzte Methode habe ich auch alles soweit nur komme ich bei der letzten Methode gedanklich nicht weiter. 3 Klassen wurden uns vorgegeben. Ich poste jetzt erstmal nur meine. Wenn das nicht ausreichen sollte poste ich die anderen noch nach. Vielleicht kann mir Jemand gedanklich weiterhelfen.

Java:
/**
 *
 * @author Christian
 * Diese Klasse representiert ein Rasterbild, welches nach einer Farbauswahl
 * die umliegenden gleichfarbigen Raster in der ausgewählten Farbe einfärbt bis
 * diese auf eine Begrenzung trifft.
 */
public class Rasterbild {
    /**
     *Innstanzvariable rechteck wird angelegt.
     */
    private java.awt.Color[][] rechteck;
    /**
     * Der Konstruktor erzeugt ein neues Objekt rechteck.
     * @param rechteck x und y Koordinate wir dem rechteck Objekt vom
     * Typ java.awt.Color zugewiesen.
     *
     */
    public Rasterbild (java.awt.Color[][] rechteck) {
        this.rechteck = rechteck;
    }
    /**
     * @return Gibt die Breite des Bildes (der Rasterpunkte) des Arrays zurück.
     */
    public int gibBreite() {
        return rechteck.length;
    }
    /**
     * @return Gibt die Hoehe des Bildes (der Rasterpunkte) des Arrays zurück.
     */
    public int gibHoehe() {
        return rechteck[0].length;
    }
    /**
     * Liefert die Farbe der durch den Punkt x und y angegeben Koordinaten.
     * @param x Koordinate
     * @param y Koordinate
     * @return Liefert ein rechteck Objekt mit den übergebenen Koordinaten.
     */
    public java.awt.Color gibFarbe(int x, int y) {
        return rechteck[x][y];
    }
    /**
     * Der Startpunkt legt die Fläche fest, die mit der übergebenen Farbe
     * gefüllt werden soll. Es handelt sich hierbei um die Fläche aller Punkte,
     * die die gleiche Farbe wie der Startpunkt besitzen und direkt oder
     * indirekt an den Startpunkt grenzen.
     * @param startpunkt Zuweisung von x und y Koordinate
     * @param neueFarbe Besitzt Koordinaten des Ausgangspunktes
     */
    public void fuelleFlaeche(Punkt startpunkt, java.awt.Color neueFarbe) {
        rechteck[startpunkt.gibX()][startpunkt.gibY()] = neueFarbe;

    }
}

Aufgabe der letzten Methode lautet: Schreiben Sie eine Methode void fuelleFlaeche(Punkt startpunkt, Color neueFarbe) Der Startpunkt legt die Fläche fest, die mit der übergebenen Farbe gefüllt werden soll. Es handelt sich hierbei um die Fläche aller Punkte, die die gleiche Farbe wie der Startpunkt besitzen und direkt oder indirekt an den Startpunkt grenzen. Mit angrenzen ist gemeint, dass Punkte sich mit ihren Seiten berühren. Die beiden unteren grünen Punkte in Abbildung 2 grenzen z. B. nicht aneinander, da sie sich nur mit ihren Ecken berühren.

Ist die übergebene Farbe gleich der Farbe des Startpunkts oder liegt der Startpunkt außerhalb der Grenzen des Bilds, soll das Rasterbild unverändert bleiben.


Also konkret ist mein Problem folgendes:
Wie prüfe ich die umliegenden Raster so, dass ich von jedem ausgehend wieder die umliegenden bis zu einer Begrenzung prüfe? Mir fällt hier einfach keine Lösung ein.
 
Zuletzt bearbeitet:

Painii

Bekanntes Mitglied
Naja, ausgehend von deinem ersten Feld:
Nimm die Farbe die da ist.
Merk sie dir.
Fülle das Feld mit der neuen Farbe.
Schau die umliegenden Felder genauso an.
Falls die nächsten Felder nicht die gleiche Farbe haben, dann höre auf.

Wenn du jetzt von den anderen Feldern "zurückschaust" liegt in den neuen Feldern ja die andere Farbe -> eine Endlosschleife wird dadurch also nicht auftreten
 

chrisööö

Mitglied
Das ist soweit klar. Wie ich beim ersten Punkt die 4 Felder prüfen kann ist klar. Allerdings, wie geht es dann weiter? Ausgehend von den neuen 4 Möglichen Punkten würde es ja exponenziell wachsen oder? Außnahme natürlich er trifft auf eine Begrenzung durch eine andere Farbe. Und ich muss in allen möglichen 4 neuen Felder wieder die umliegenden prüfen usw usw. Irgendwie weiss ich dafür keinen Lösungsansatz.
 

Purgator

Aktives Mitglied
Dafür nimmt man glaube sowas wie Tiefensuche oder Breitensuche (bin mir aber gerade irgendwie unsicher ob das wirklich die richtigen Begriffe sind).
Beides funktioniert mit so einer Art Warteschlange:

Du hast deinen Ausgangspunkt und kannst schauen welche Felder davon gültig sind (d.h. die du einfärben und wo du dann weiter gehen kannst). Die gültigen Felder packst du in die Warteschlange.
Dann nimmst du das erste Feld aus der Warteschlange, färbst es und testest die angrenzenden Felder. Die gültigen angrenzenden Felder werden an die Warteschlange angehängt.

praktisch:
packe startpunkt in Warteschlange
while(warteschlange ist nicht leer) {
nimm feld aus warteschlange
färbe feld
überprüfe nachbarn (wenn gültig in warteschlange einfügen)
}

Hoffe ich habe dein Problem richtig verstanden, wenn ja sollte das eine mögliche Lösung sein.
 

Oben