mmofacts.com

Bevölkerungsdichte auf 2D Ebene anzeigen

gepostet vor 16 Jahre, 10 Monate von RaydenDD
Hmm, ich bin momentan etwas ratlos wie ich das am performantesten mache (Benutze JAVA).
Problembeschreibung:
Ich habe eine 2000x2000 Grid, an beliebigen Punkten in diesem Grid kann ein Planet sein der eine bestimmte Bevölkerung hat. In einem gewissen Umkreis in der Matrix sollte nun dieser Planet x,y mit dieser Bevölkerung beschreiben. Falls jetzt ein anderer Planet ebenfalls in diesen Radius reinschneidet muss die Bevökerung an der Schnittfläche summiert werden.
Ganz am Ende wird dann der Logarithmus der Bevölkerung jedes Punkts in der 2000x2000 Matrix genommen und daraus der RGB Wert für die Darstellung berechnet.
Wäre für Hilfe dankbar
gepostet vor 16 Jahre, 10 Monate von TheUndeadable
Kannst du dazu mal ein kleines Bild zeichen, so wirklich viel kann ich mir mit deiner Beschreibung nicht vorstellen.
gepostet vor 16 Jahre, 10 Monate von KoMtuR
Also ich würde es so machen:
Ich würde ein int-array (oder long, wenn du solche größen brauchst) nehmen, was in deinem fall 4000 Felder hat. Dann würd ich einfach immer einen Punkt die Zahl zuweisen, die deiner Bevölkerung entspricht (man kanns ja auch abstrahieren und sagen, dass 1000 Einwohner den Wert 1 haben oder sowas).
Dieses Array kannst du wahlweise in eines der vielen Matrix-Bibliotheken stecken, so dass du dann später einfach diese Logarithmus-Funktion auf alle Elemente anwenden kannst. So und dann gibts bei den meistens Bibliotheken noch eine Funktion, wo du den Max-Wert rausbekommst.
Hast du diesen, dann kannst du ja alle weiteren Werte dafür runterrechnen. Also der maximal-Wert hat dann eben (255,255,255). Nun schmeisste dein Java2D Zeugs an und erstellst ein 2000*2000 ARGB Image und zeichnest an den Punkt im Array dein entsprechenden Kreis mit der bestimmten Farbe und dies dann mit einem bestimmten Alpha-Wert (ich würde es so machen, dass der Alpha-Wert zunimmt, umso näher die Zahl am Maximum ist).
Dan ganz zum Schluß nochn Blur-Effekt drüber hauen und dann wäre es fertig. Nur sicherlich wirds nicht den Effekt haben, den du genau haben willst
Andere Möglichkeit wäre, dass du deine Bewohnerzahlen am Anfang in eine Art baum aufteilst, so dass die gleichen Bewohnerzahlen zusammengefasst sind. Dann erstellste dir ein int-Array, welches dann eben die Ausmaße deines Kreises hat. Dann füllst du dieses Array entsprechend deiner Anzahl von der Bevölkerung (Also ich würd dann ein Template nehmen, wo entweder ne 0 oder ne 1 steht und wo die 1 steht wird die Zahl hingesetzt). Dieses Array kopierste dann einfach in dein großes Array an die betreffende Stelle (kopieren+addieren ) und gehst dann wieder mitn Logarithmus drüber.
Dann ein BufferedImage erstellen, was nun nicht ARGB sein muss und dir mit getData() das Raster holen und dann eben Pixel für Pixel zeichnen, was aber auch recht fix gehen sollten bei so nem Array. (Also nicht mit den Java2D Pixel Funktionen arbeiten, weil das nurn Umstand ist).
Theoretisch könntest du, wenn du den größten Wert schon vorher weißt auch gleich in dem Raster rum malen und dann eben die Pixel auf den Höchstwert weiß beschränken. Dann über diese Pixel den Logarithmus berechnen und vielleicht einen Filter schreiben, der dann am Ende die vielleicht etwas dunkle Fläche wieder auf den Weiß-Wert korrigiert.
Musste mal schauen konnte es nun leider nicht testen.
KoMtuR - Forum 1:5
gepostet vor 16 Jahre, 10 Monate von RaydenDD
@Undeadable:
Stell dir einfach ne Landkarte von Europa vor. Für jede Stadt machst du abhängig von der Bevölkerung einen Kreis auf die Landkarte (sagen wir mal 10 Mio. = Rot-Wert = 255 // 0 = Rot-Wert -> 0 // Das ganze irgendwie logarithmisch ). Jetzt kanns natürlich sein das sich der Kreis einer 2 Mio. und 5 Mio. Stadt überlagern. Das würde jetzt bedeuten das an der Schnittfläche dieser Kreis der entsprechende R-Wert von 7 Mio. sein muss
@Komtur:
Ich habs jetzt noch nicht getestet, aber wenn ich 2 Kreise mit Alpha 0.2 und Alpha 0.5 übereinanderzeichne hab ich nacher etwas vergleichbares wie 1 Kreis mit Alpha 0.7? Sprich es das Rot wird dann intensiver je mehr ich mit unterschiedlichen Alpha-Werten übereinander zeichne ...
PS: Ich hab grad die Alpha Methode getestet ... scheint so als würd das für meine Zwecke ausreichend sein . Selbstverständlich ist 2x Rot mit Alpha 128 zeichnen nicht ganz Alpha 256 aber es reicht für meine Zwecke.
gepostet vor 16 Jahre, 10 Monate von TheUndeadable
k, danke, habe es jetzt verstanden, aber nun hast du eine funktionierende Lösung ;-)
Hätte wahrscheinlich auch mit Transparenzen und Kreise gearbeitet, aber im Nachhinein ist das leichter gesagt.
Wenn du nur Ausschnitte rendern willst, würde ich die Planetendaten so indizieren, dass du effizient die einzelnen Planeten um deinen Ausschnitt herum holst und nicht alle Planeten für eine Kreisprüfung einladen musst.
gepostet vor 16 Jahre, 10 Monate von Sarge
i luv this forum
kurzform:
Schau einmal bei Crys Travian Seite vorbei ( travian.macaputo.de/ ) der macht eigtl genau soetwas, allerdings nur punktuell ohne diese kreis addition.
Ich würde an deiner stelle ersteinmal versuchen ob das vielleicht nicht schon die schöneren Ergebnisse gibt, da das mit der Kreisaddition bei einer hohen Dichte von städten ziemlich schnell ziemlich zu nem großen frabkleks werden wird. Aber ich denke da muss man einfach ein wenig spielen.
Jeden Tag ein Bild zu einem Video verschmolzen der alten Bilder z.B.:
www.myvideo.de/watch/591163
Seine "neue" spiellerei pov-ray: travian.macaputo.de/pics/pov_de1_final.png
gepostet vor 16 Jahre, 10 Monate von RaydenDD
so siehts jetzt aus, falls jemand interessiert ist . Etwas langsam beim Zoomen weil ichs immer wieder neuzeichne aber wurst ... vorerst .. das optimier ich noch ^^
@Sarge: Punkte ansammeln is zwar nett, aber ist auch nicht gerade das was ich mir vorgestellt habe

Auf diese Diskussion antworten