# Pixel Häufigkeiten entsprechent einfärben



## Guest (14. Mai 2007)

Hallo,

hab da folgendes Problem:

Ich habe ein JFrame (size 800*600) und ein 2dimArray[800][600], in dem Häufigkeiten der entsprechenden Koordinaten gespeichert sind(Handelt sich um Verteilung von Zufallszahlen, aber das tut ja nichts zur Sache).

Jetzt will ich das JFrame entsprechent der Häufigkeiten des Arrays einfärben. 

```
for(int x=0;x<Max_X;x++){
			for(int y=0;y<Max_Y;y++){
				cr = (int)Math.floor( ((255*a[x][y])/z) + 0.5);
				cg = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
				cb = (int)Math.floor( ((255*a[x][y])/z) + 0.5);
				g.setColor( new Color(cr, cb,cg));
		                                g.drawLine( x, y, x, y);
			}
```

z entspricht hier dem max aus dem Array.

Bei dem code wird das aber nur zweifarbig(Gelb/Schwarz). Habe auch schon mit den Werten für cr,cg,cb rumgespielt, also cg,cb einen festen Wert gegeben und cr wie oben berechnet, aber gleiches Ergebnis mit 2 anderen Farben.

Hat jmd vlt einen Tip, wie ich das in etwa so hinbekommen, dass die größten Einträge dunkelblau sind und das dann immer heller wird und bis in gelbe(kommt doch nach blau?) geht? Farben sind da eich egal. Die größten Werte befinden sich hier in der Bildschirmmitte und werden zum Rand hin immer kleiner, fals das eine Hilfe ist.

Bin für jeden Tip dankbar


MfG


----------



## SlaterB (15. Mai 2007)

mann oh meter, darf man annehmen,
dass das mit Java 3D nix zu tun hat? mit Häufigkeiten nix zu tun hat? 
fast dein ganzes Post mit 800x600, Array, Zufallszahlen usw nix direkt damit zu tun hat?

fang doch mal klein an..

deine einzige Frage ist doch zunächst, eine Farbe zu erzeugen?, so:
Color test = new Color(255,255,0);

und teste sowas am besten erst mit großen Flächen, nicht mit einzelnen Pixeln 

-----

falls du dich wunderst, warum deine Farbe nicht geht,
dann hilft dir vielleicht eine Ausgabe, WELCHE Farbe du überhaupt verwendest:
System.out.println(cr ist: ..., ...);


----------



## Guest (15. Mai 2007)

Dann sag mir doch bitte mal in welches Forum das sonst gehört?? Als Beschreibung steht zu diesem: 3d und 2d Programmierung und da dachte ich mir es würde hier am besten passen..

Das es nicht direkt mit Häufigkeiten etc. zu tun hat ist mir auch klar, aber wenn du mal andere Posts liest wird meist bemengelt, dass diese nur eine kurze Frage stellen und keiner eigentlich wiess, was derjenige genau machen will,  also habe ich mal weit ausgeholt und meine Lage genau beschrieben.

Und wie du meinem Text entnehmen kannst, bin ich sehr wohl in der Lage eine Farbe zu erzeugen. Mein einziges Prob ist es Farben entsprechend der Häufigkeiten in dem Array zu erzeugen. Aber fals das so nicht aus dem Text hervor geht:

Der maximalste Eintrag in dem Array ist z.B 2000. Jetzt sollen alle Punkte, die sich in diesem Bereich befinden am dunkelsten eingefärbt werden. Ich weiss man könnt es mit ifs machen, aber ich kenne halt nur den max-Eintrag und alle anderen Werte sind total verschieden, da es sich ja um Verteilung von Zufallszahlen handelt und diese bei jedem Start unterschiedlich sind. Also dachte ich mir, da es ja für cr.cg.cb je nur 255 verschiedene Möglichkeiten gibt die Formel in meinem code aus. Diese erzeugt aber nur 2 verschiedene Farben.

Jetzt brauch ich wahrscheinlich nur nen kleinen Tip, wie ich die Werte anders gewichten kann, dass eben für ´große [x][y] Werte eine dunkle und für kleine eine helle Farbe rauskommt. Meinentwegen auch umgekehrt, sie sollen sich später auf dem Bildschirm nur unterscheiden.



MFG


----------



## SlaterB (15. Mai 2007)

Swing wäre ein passenderes Forum (was du natürlich nicht wissen kannst), 
aber wie nun du sagst hat dein Problem nicht mal was mit Zeichnen oder Farben zu tun,
(diese Information hast do vorher verschwiegen, also hast du auch hier zuwenig Information gegeben  :bae: )
mit deinem Array [x][y] auch nicht


sondern ganz allgemein:
du hast eine Variable u
int u = 2000; 
mit Werten von 0 bis Maximalwert z (z.B. z 2000)
und möchtest diese gleichverzeilt nach 0-255 transferieren

das ist alle Information die man braucht, ohne unnötigen Ballast 

so und das testet man auch nicht irgendwo mitten im Prozess in einem Paint sondern in

```
public class Test {
   public static void main(String[]args) {
      int n = 2000;     
      int k = 1699;
      int m =  255*(k/n);
      System.out.println("k: "+k+" - > m: "+m);   
  }
}
```
siehst du nun das Problem klar und offen vor dir?
(nicht über die Kritik aufregen, sondern daraus lernen);

so ich habe dort nun einen Spezialfall eingebaut, 1699/2000 ist immer 0, da auf int gerundet wird,
wenn man dagegen erst k mit 255 multipliziert und danach durch 2000 teilt, dann kommt es hin,

dein Code sieht allerdings nicht nach einem solchen Rundungsfehler aus,
deshalb ist wohl die Rechnung an sich nicht das Problem, sondern irgendwas anderes?

das kannst du mit System.out.println herausfinden

aus
cr = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
wird

cr = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
System.out.println("vorher: "+a[x][y]+", z: "+z+" -> cr: "+cr);

was kommt da als Ausgabe?
dreimal den gleichen Wert auszurechen ist übrigens unnötig gefährlich,

schreibe

```
cr = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
System.out.println("vorher: "+a[x][y]+", z: "+z+" -> cr: "+cr);
g.setColor( new Color(cr, cr,cr)); 

statt

cr = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
cg = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
cb = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
g.setColor( new Color(cr, cb,cg));
```


----------



## Guest (15. Mai 2007)

Hey,
danke erstmal für deinen Beitrag. 
Ich dachte eigentlich, dass ich das Problem mit dem ersten Post genau beschrieben habe 

Habe halt in einem 2dmi array Werte zwischen 0 und z(2000 war hier nur als Beispiel angegeben, kann auch gut mal 200 oder auch 100000 sein). Jetzt soll die Farbe bei z sehr dunkel werden und bei 0 sehr hell oder halt umgekehrt, man soll es halt nur deutlich unterscheiden können.

Ja stimmt bei meinem code rechen ich mir 3mal den gleichen Wert aus. Hatte wie gesagt vorher für cg,cb feste Werte und n paar Stunden damit rumgespielt und der code ist halt stehen geblieben. 


```
cr = (int)Math.floor( ((255*a[x][y])/z) + 0.5); 
				System.out.println("vorher: "+a[x][y]+", z: "+z+" -> cr: "+cr); 
				g.setColor( new Color(cr, cr,cr));
```

Also bei dem code bekomme ich Ausgaben wie
vorher: 10075, z: 11965 -> cr: 214
vorher: 375, z: 11965 -> cr: 7
vorher: 375, z: 11965 -> cr: 7
vorher: 10375, z: 11965 -> cr: 221
vorher: 10375, z: 11965 -> cr: 221
vorher: 945, z: 11965 -> cr: 20
vorher: 10075, z: 11965 -> cr: 214
vorher: 75, z: 11965 -> cr: 1
vorher: 10375, z: 11965 -> cr: 221


cr is aber auch mal 50,100, und viele Werte dazwischen..wollt jetzt nicht die komplette Ausgabe kopieren. Aber es bleibt 2farbig:  Mit dem code ists jetzt s/w ^^



mfg


----------



## SlaterB (15. Mai 2007)

Schritt für Schritt Fehler suchen:
verkleinere dein Array auf drei bzw. berücksichtige nur die ersten drei Felder, 
und male große Flächen von 50x50,

Ausgabe ist ok aber Bild immer noch s/w?

dann merke dir die Werte und schmeiße das Array raus (bz. ignoriere es) 
und male mit drei festen Farben die drei Flächen,

immer noch s/w?
dann hats zumindest mit allem bisherigen nix zu tun und du kannst neu überlegen
(wie sieht die Grafik-Ausgabe allgemein aus, in einer paint-Operation?)

wenns mit den festen Farben klappt, was ist dann der Unterschied zur Verwendung der ersten drei Felder des Arrays?
usw., alles Schritt für Schritt


----------



## Guest (18. Mai 2007)

Hallo,
ich habe das Problem jetzt gefunden(Mein Prof hat mir bissi geholfen ^^). Ich habe zuviele Zufallszahlen erzeugt, daher kam es zu einer 1:2 Verteilung und es gab im Prinzip nur 2 verschiedene Farben. Die Berechnung [x][y]/z hat dann kaum einen Unterschied gemacht, die Farbe auf dem Bildschirm hat sich nur geringfügig geändert.

danke nochmal für die Beiträge. Thema kann dann geschlossen werden bzw. n Hacken dran ^^


mfg


----------

