# Land aus einer Weltkarte selektieren



## Gast (20. Okt 2008)

Hey,

ich bin neu hier und ich hoffe, dass ihr mir helfen könnt. 

Ich möchte das Brettspiel Risiko als Computerspiel umsetzen. Dazu muss ich es schaffen, dass ich auf der Weltkarte, mit der Maus über ein Land fahren kann und dabei das Land farblich hervorgehoben wird. Wenn ich dann auf das Land klicke, soll eine bestimmte Aktion geschehen.

Nun meine Frage: Wie geht so etwas? Ich bin totaler Anfänger auf dem Gebiet. Kann mir jemand ein Tipp geben unter was ich da zum Bsp. bei google suchen muss. Ich finde nichts zu dem Thema bzw. weiß nicht so richtig unter was ich suchen soll? 

Ich hab schon mal was von BufferedImage oder so gehört. Damit soll wohl so einiges möglich sein.

Meine Idee: Jedes Land ist zum Bsp. mit einer schwarzen Linie umrandet. Kann man dann einen Bereich, der vollkommen von einer solchen schwarzen Linie umrandet ist auswählen? Praktisch die Pixel auf die Farbe schwarz überprüfen. Wenn man dann alle Pixel gefunden hat (von einer Umrandung) dann kann man den Bereich zwischen diesen Pixeln auswählen.

Ist diese Idee umsetzbar oder totaler Quatsch?

Wäre echt nett, wenn mir jemand einen Tipp geben könnte.


----------



## Marco13 (20. Okt 2008)

Ach, "umsetzbar" ist vieles. Sind ja nur Bits. Also, man könnte das theoreitsch so machen: Man "füllt" den Bereich, über dem sich die Maus befindet, bis man an schwarze Pixel stößt. Aber das wäre ziemlich murksig und ineffizient. Besser wäre es, wenn du die Umrisse der Länder als Polygon hättest.... Wo gedenkst du denn die Karte herzubekommen?


----------



## trazzag (20. Okt 2008)

Zum Weiterlesen empfehle ich dir, daß du dir mal die Klasse GeneralPath anguckst - mit der kannst du ein Polygon anhand eines Pfades (also deinen Linien) konstruieren.

Hier mal eine Beispiel-Methode:

```
private GeneralPath makePolygon(int sides, double[] x, double[] y,
			boolean closed) {
		GeneralPath polygon = new GeneralPath(Path2D.WIND_EVEN_ODD, sides);
		polygon.moveTo(x[0], y[0]);
		for (int i = 1; i < sides; i++)
			polygon.lineTo(x[i], y[i]);
		if (closed)
			polygon.closePath();
		return polygon;
	}
```


----------



## Gast (21. Okt 2008)

Erst mal danke für eure schnelle Antwort. Also wegen dem Bild: Entweder ich "male " das Bild mit einem Grafikprogramm selbst oder halt ein Bild bei Google suchen, oder das Spielbrett von Risiko abscannen. Macht das irgendwie einen Unterschied? Oder sollte ich eine Variante bevorzugen?


----------



## Quaxli (21. Okt 2008)

Das kannst Du machen, wie Du willst.  Selber malen ist individueller 

Zum Thema Landerkennung noch eine andere Lösungsmöglichkeit: hier


----------



## Krondor (21. Okt 2008)

Hi,

ich habe dazu mal in folgendem Post was geschrieben:
http://www.java-forum.org/de/viewtopic.php?t=70810&postdays=0&postorder=asc&start=0
Der Kram von mir beginnt auf Seite 2.

Das hilft dir vielleicht auch weiter.




> Hab mal nen kleines Beispielprogramm geschrieben damit du siehst was ich meine.
> Das gezeichnete Polygon könntest du dann über deine Grafik legen.
> Ich hab die Transparenz auch direkt eingebaut.
> Die Linie ist nicht transparent, der Füllbereich schon.
> ...


----------



## Guest (22. Okt 2008)

Also ich glaube ich habe jetzt eine Lösung für mein Problem gefunden.

Das gesamte Problem lässt sich über die sogenannte "Schattenkarte" lösen, die in dem einem Link beschrieben wurde. 
Im Vordergrund habe ich meine Originalkarte, in der nicht jedes Land eine eigene Farbe hat. Im Hintergrund (Benutzer sieht sie nicht) gibt es eine Schattenkarte, in der jedes Land eine eigene eindeutige Farbe hat. 

Bewegt der Benutzer nun, die Maus über ein Land, wird die Position der Maus im Bild bestimmt. Diese Pixel werden im Schattenbild  bzgl. der Farbe analysiert. Dann lasse ich überprüfen welche Pixel im Schattenbild noch diesen Farbwert haben, und speichere die Pixelpositionen ab. Im Anschluss, verändere ich die Pixelfarbe an den Positionen, die ich gespeichert habe. Gleichzeitig kann ich über die Schattenkarte jeder Farbe den Namen des Landes speichern und somit weiß ich, wenn der Benutzer auf ein Land klickt,  um welches Land es sich handelt.

Nun meine Frage an euch: Was sagt ihr zu dieser Lsg? Ist sie vielleicht zu rechenintensiv?

Das mit dem Polygon ist geeignet, wenn man die Postionen der Pixel kennt, die zu einem Land gehören bzw. zu der Umrandung. Aber diese über ein Grafikprogramm auszulesen, ist mir zu mühsam.


----------



## Marco13 (23. Okt 2008)

Anonymous hat gesagt.:
			
		

> Nun meine Frage an euch: Was sagt ihr zu dieser Lsg? Ist sie vielleicht zu rechenintensiv?


Rechenintensiv ist sie nicht - im Vergleich zur Lösung mit den Polygonen sogar wesentlich schneller, da immer nur ein "lookup" gemacht wird: Es braucht ja praktisch nichts gerechnet zu werden. Man schaut einfach nach der Farbe, und hat sofort die Antwort. Die Lösung benötigt zwar ggf. mehr Speicher, aber was sind schon 2 oder 3 MB :roll: Auf jeden Fall ist es wohl eine der einfachsten denkbaren Lösungen, wenn man die Karte erstmal als Bild (mit eindeutigen Länderfarben) vorliegen hat.


----------



## Mujahiddin (5. Feb 2010)

Also ich hab in verschiedenen Klassen nach einer Farbe getColor() gesucht, sowas gabs aber nicht. Methoden wie: (MouseEvent.getColor(), MouseEvent.getPoint.getColor(), Image.getColor(Point p)) hätte ich erwartet, aber sowas gibt es nicht zur Verfügung.
Nun lautet die Frage: Was machen?
Soll ich Polygone zeichnen, sie mit einer eindeutigen Farbe füllen, um danach ermitteln zu müssen, welchem Polygon der Mausklick gewidmet ist, um dann die Füllfarbe zurückzugeben? Das wäre ja noch umständlicher.
Mit Image.getGraphics().getColor() kann ich auch nix anfangen, ich will ja die Farbe des angeklickten Pixels...

Könnt ihr mir helfen?

Okay, ich hab grade was gefunden: java.awt.Robot;
ich versuch mich mal damit zurechtzufinden!
Wenn ichs nich schaffe, meld ich mich wieder.
So long


----------



## Marco13 (5. Feb 2010)

Wow. Mehr als ein Jahr. Man kann ein Bild mit ImageIO als BufferedImage laden, und dann mit
int rgb = bufferedImage.getRGB(x,y);
die Farbe eines Pixels abfragen - und das RGB notfalls noch mit
Color c = new Color(rgb);
in ein Color-Objekt verwandeln...


----------



## Steev (5. Feb 2010)

Um die einzelnen Farbwerte bekomman muss man den RGB-Wert aber noch wie folgt auseinanderhacken:

[Java]int argb  = image.getRGB( x, y ); 
int alpha = (argb >> 24) & 0xff; 
int red   = (argb >> 16) & 0xff; 
int green = (argb >> 8)  & 0xff; 
int blue  = (argb)       & 0xff;[/Java]


----------

