H
Hummer101
Neues Mitglied
- 0
Guten Tag,
erstmal stell ich mich kurz vor (mein erster Beitrag
).. Mein Name ist Jonathan, bin 21 und studiere aktuell Informatik
.
Um etwas mehr Praxis in Java und allgemein im Coden zu erlangen, bin ich aktuell mit nem Kumpel an einem Android-Spiel dran (wer weiß, vlt. kann man ja iwann dadurch den Nebenjob schmeißen
)
Die Gegebenheiten:
Eine Canvas (sagen wir mal 480x800) wird per Zufall mit drawLine() kreuz und quer bemalt und ergibt nach etwa 40-50 Linien ein "WirrWarr" an Flächen abgetrennt durch diese Linien. Hier ein Bild, damit man es sich vorstellen kann (Achtung, das Bild entspricht bereits dem "Ziel")
in einem mehrdimensionalen IntegerArray "PixelArray" ist nun für jedes Pixel gespeichert, ob es bemalt ist oder nicht (als Bsp. eine Linie von 0,0 - 0,100 speichert im PixelArray[0][0-100] eine 1 rein).
Des weiteren sind alle Schnitt/Eckpunkte in einem PointF Array gespeichert. Für das Problem hab ich auch noch ein Array erstellt, welches jeweils ein Punktpaar einer Linie (Start & Endpunkt) speichert.
Das Problem:
Ich möchte wie auf dem Bild zu sehen alle entstehenden Flächen verschieden färben. Dies ist meines Wissens nach nur mit der drawPath()-Methode möglich, bei der man von einem Punkt zum Anderen wandert und so eine geschlossene Fläche erstellt & mit einer Paint füllt.
Und genau das ist das Problem. Wie kann ich diese Punkte einer jeweiligen Fläche berechnen? Da jede Linie per Random erstellt wird, ist es nicht möglich jede Linie einer bestimmten Fläche zuzuweisen.
Mein Ansatz:
Ich wähle aus meinem PixelArray einen beliebigen Punkt aus, welcher noch unbemalt ist(==0). Dieser muss ja in einer Fläche sein. Nun bilde ich einen immer größer werdenden Kreis(bzw Quadrat triffsts eher) um diesen Punkt und überprüfe, ob ich einen Rand (Pixelarray==1) oder einen Eckpunkt (EckpunktArray==1) treffe. Wenn ich mehr als 2 Eckpunkte treffe, prüfe ich, ob jeder Eckpunkt mit dem anderen verbunden ist (im Paar-Array) und wenn das der Fall ist habe ich alle Eckpunkte der Fläche und kann sie mit einer DrawPath füllen.
Wenn ich auf eine Linie treffe (ich iteriere immer über -radius<x>radius und -radius<y>radius für radius++ while alle Eckpunkte gefunden) bin ich ja im nächsten Iterationsschritt für x bzw y außerhalb meiner Fläche und setze einen boolean auf false damit ein eventl. gefundener Eckpunkt nicht dazugezählt wird (ist ja dann von einer benachbarten Fläche)
Leider ist das nicht so ganz umsetzbar, denn wenn ich zB beim Iterieren außerhalb der Fläche beginne ist das mit dem Boolean-Wert wieder schwer festzustellen)
Hier noch eine kleine Skizze, vlt. hilft die zum Verständnis:
Die blauen Linien sind diese automatisch-generierten "Störlinien". Die zu bemalende Fläche sollte erkennbar sein. Nun beginne ich mit orange ein immer größer werdendes Quadrat um einen Punkt zu "zeichnen". Irgendwann trifft dieses orange Quadrat auf alle gespeicherten Eckpunkte (schwarz) und der Algorithmus terminiert. So die Idee (die gestrichelten Linien stellen den Boolean -Wert auf false dar)
Ich hoffe ich konnte das alles einigermaßen verständlich erklären, ist halt nicht ganz einfach das Problem
Schon einmal vielen Dank für eure Ideen!! Ich komm echt nichtmehr weiter..
erstmal stell ich mich kurz vor (mein erster Beitrag


Um etwas mehr Praxis in Java und allgemein im Coden zu erlangen, bin ich aktuell mit nem Kumpel an einem Android-Spiel dran (wer weiß, vlt. kann man ja iwann dadurch den Nebenjob schmeißen
Die Gegebenheiten:
Eine Canvas (sagen wir mal 480x800) wird per Zufall mit drawLine() kreuz und quer bemalt und ergibt nach etwa 40-50 Linien ein "WirrWarr" an Flächen abgetrennt durch diese Linien. Hier ein Bild, damit man es sich vorstellen kann (Achtung, das Bild entspricht bereits dem "Ziel")

in einem mehrdimensionalen IntegerArray "PixelArray" ist nun für jedes Pixel gespeichert, ob es bemalt ist oder nicht (als Bsp. eine Linie von 0,0 - 0,100 speichert im PixelArray[0][0-100] eine 1 rein).
Des weiteren sind alle Schnitt/Eckpunkte in einem PointF Array gespeichert. Für das Problem hab ich auch noch ein Array erstellt, welches jeweils ein Punktpaar einer Linie (Start & Endpunkt) speichert.
Das Problem:
Ich möchte wie auf dem Bild zu sehen alle entstehenden Flächen verschieden färben. Dies ist meines Wissens nach nur mit der drawPath()-Methode möglich, bei der man von einem Punkt zum Anderen wandert und so eine geschlossene Fläche erstellt & mit einer Paint füllt.
Und genau das ist das Problem. Wie kann ich diese Punkte einer jeweiligen Fläche berechnen? Da jede Linie per Random erstellt wird, ist es nicht möglich jede Linie einer bestimmten Fläche zuzuweisen.
Mein Ansatz:
Ich wähle aus meinem PixelArray einen beliebigen Punkt aus, welcher noch unbemalt ist(==0). Dieser muss ja in einer Fläche sein. Nun bilde ich einen immer größer werdenden Kreis(bzw Quadrat triffsts eher) um diesen Punkt und überprüfe, ob ich einen Rand (Pixelarray==1) oder einen Eckpunkt (EckpunktArray==1) treffe. Wenn ich mehr als 2 Eckpunkte treffe, prüfe ich, ob jeder Eckpunkt mit dem anderen verbunden ist (im Paar-Array) und wenn das der Fall ist habe ich alle Eckpunkte der Fläche und kann sie mit einer DrawPath füllen.
Wenn ich auf eine Linie treffe (ich iteriere immer über -radius<x>radius und -radius<y>radius für radius++ while alle Eckpunkte gefunden) bin ich ja im nächsten Iterationsschritt für x bzw y außerhalb meiner Fläche und setze einen boolean auf false damit ein eventl. gefundener Eckpunkt nicht dazugezählt wird (ist ja dann von einer benachbarten Fläche)
Leider ist das nicht so ganz umsetzbar, denn wenn ich zB beim Iterieren außerhalb der Fläche beginne ist das mit dem Boolean-Wert wieder schwer festzustellen)
Hier noch eine kleine Skizze, vlt. hilft die zum Verständnis:

Die blauen Linien sind diese automatisch-generierten "Störlinien". Die zu bemalende Fläche sollte erkennbar sein. Nun beginne ich mit orange ein immer größer werdendes Quadrat um einen Punkt zu "zeichnen". Irgendwann trifft dieses orange Quadrat auf alle gespeicherten Eckpunkte (schwarz) und der Algorithmus terminiert. So die Idee (die gestrichelten Linien stellen den Boolean -Wert auf false dar)
Ich hoffe ich konnte das alles einigermaßen verständlich erklären, ist halt nicht ganz einfach das Problem
Schon einmal vielen Dank für eure Ideen!! Ich komm echt nichtmehr weiter..