# verschiedene Farben, die mit Java erstellen worden, mit den Augen unterscheiden ****



## ottens (30. August 2011)

Hallo zusammen,

wie kann ich mit java verschiedene Farben, die ich mit Random erstellt habe auseinander halten. 
mit den Farben werden Kurven gezeichnet.
Die Kurven sollen mit den Augen Erkennbar sein, es werden mehr als 200 Farben benötigt.  

es gibt viele Farben, die sehr ähnlich aussehen was macjht man da ? 

hat jemand eine Idee ?

LG

Ottens


----------



## Fabio Hellmann (30. August 2011)

Hi und Herzlich Willkommen bei Tutorials,

ich an deiner Stelle würde nicht nur die verschiedenen Farben (256*256*256=16777216 Farben) verwenden, sondern auch noch die verschiedenen Linientypen. Sprich gestrichelt, gepunktet, etc. .

Ich hoffe ich konnte dir damit weiterhelfen.

Gruß

Fabio


----------



## ottens (30. August 2011)

danke Fabio,
eine Idee aber die Lineintypen sind schon bei der Anwendung reserviert !

grüßr

Ottens


----------



## Fabio Hellmann (30. August 2011)

Mh. Dann könnte es aber wirklich schwierig werden. Die einzigste Möglichkeit die du (aus meiner Sicht) noch hast, ist die Linien mit einem Gradienten (Farbverlauf) zu zeichnen. Wobei das evtl. nicht mehr so professionell rüber kommt. Kommt eben darauf an, wofür du diese verschiedenen Linien brauchst.

Gruß

Fabio


----------



## ottens (30. August 2011)

danke du meinst mit (Gradienten ) Farbverlauf, dass die Linie ihre Farbe wechselt (z.B) durch die Zeit  also soll eine Auswertung programmiert und damit viele Kurven gebraucht werden, mehr darüber kann leider
nicht sagen.

beste Grüße

Ottens


----------



## Fabio Hellmann (30. August 2011)

Jain. Also das man die Farben der Linien über die Zeit verändern kann, ist auch eine Option. Wobei ich denke, dass man dann relativ schnell den Überblick verliert.
Vielleicht schaust du dir zum Thema Gradienten mal den Link hier an. Da wird alles super erklärt und vielleicht findest du dabei noch die ein oder andere Möglichkeit, deine Linien zu gestalten/verändern.

Gruß

Fabio


----------



## ottens (30. August 2011)

danke sehr nett von dir . werde lesen und versuchen.

LG

Ottens


----------



## ottens (30. August 2011)

weißt du vielleicht wie man zwischen Farben vergleichen kann also 
Color farbe = new Color(r,g,b);

if(farbe.getRed() < 30) tue was 
if(farbe.getGreen() <= 40) mach was anderes 

ich bekommen Endlose Schleife ****

Grüße
Ottens


----------



## Fabio Hellmann (30. August 2011)

Das müsste eigentlich schon so funktionieren, wie du es geschrieben hast. Anders würde ich es auch nicht machen. Hier mal mein Code:


```
public boolean isSameColor(Color c1, Color c2) {
   return (c1.getRed() == c2.getRed()) && (c1.getGreen() == c2.getGreen()) && (c1.getBlue() == c2.getBlue());
}
```

Gruß

Fabio


----------



## sheel (30. August 2011)

@Fabio: Bei c2 zweimal () vergessen

@ottens: Ich seh keine Schleife. Schon gar nicht endlos.
Zeig mehr Code.


----------



## ottens (31. August 2011)

ist es möglich so ähnlich aussehende farben auszuschliessen, dass sie nicht wierder
verwendet werden ****

danke 

Ottens


----------



## Fabio Hellmann (31. August 2011)

Meines Erachtens nach ist das nicht möglich. Was du machen kannst, wenn du die Farben erzeugen lässt, dass du den Abstand zur nächsten Farbe größer machst. Ich nehme mal an, dass du die Farben mit einer Schleife initialisierst?


----------



## sheel (31. August 2011)

_Möglich_ ist es schon, geht aber schwer in Mathematik/Physik rein.
Hab irgendwann mal darüber was gelesen...hab es aber weder komplett verstanden, noch kann ich es wiederfinden.

Allein schon vom Aufwand her ist Fabios Methode das einzig Sinnvolle.


----------



## ottens (31. August 2011)

ich habe so einen Pool als Reihung von Farben, dann erstelle ich davon eine Liste und in der Liste 
wenn ich eine neue farbe erstelle mit Random schleife ich die farbe durch die Liste ob liste.contains(farbe)
|| oder semiColorExist() wenn eine von beiden wahr dann soll neue Farbe erstellt werden sonst die Farbe zur 
Liste einfügen 

while()
semiColorExist(randomColor, einePoolFarbe ) --> 

if(  Math.abs(randomColor.getGreen - PoolFarbe.getGreen()) < 50) soll neue farbe erstellt werden 
   for Rot und Blau  auch
Math.abs liefert den Betrag also immer plus.

aber zeigt mir immer Farben die ähnlich aussehen, wo ist der Fehler ****


----------



## Fabio Hellmann (31. August 2011)

Das könnte daran liegen, dass du dir nur die Farben von new Color(0-50, 0-50, 0-50) erstellst. Die Farben gehen aber bis new Color(0-255, 0-255, 0-255).
Aber ein bischen mehr Code wäre nicht schlecht, weil ich sonst auch nur raten kann.


----------



## sheel (31. August 2011)

1) hab ich den Beitrag vier Mal lesen müssen, bis ich ihn verstanden habe.
2) Wenn du schon auf Ähnlichkeit prüfst musst du nicht auch noch auf Gleichheit prüfen. Die ist in der Ähnlichkeit schon drin.
3) Ohne Code können wir nur raten


----------



## ottens (1. September 2011)

public void paintComponent(Graphics gr) {
       super.paintComponent(gr);
farbe = getNewColor();
   while ((semiColorIsSavedToList(farbe) || liste.contains(farbe))){
	farbe = getNewColor();
   }
liste.add(farbe);
			g2d.setColor(farbe);
			g2d.drawString(" neue Farbe ",250 , 20);
			g2d.fillOval(250, 20, 200, 200);
			vorfarbe = farbe;
			setOldColor(farbe);	
		}


----------



## ottens (1. September 2011)

Hallo Fabio. ich bedanke mich für deine Hilfe 
hier ist etwas code 

beste Gruß

Ottens

public void paintcomponent(Gra g) {
	Graphics2D g2 = (Graphics2D) g;
	   far = getNewColor();
	while ((semiColorIsSavedToList(far)){
		far = getNewColor();
	}
	list.add(far);
	g2d.setColor(far);
	g2d.drawString(" neue Far ",250 , 20);
	g2d.fillOval(250, 20, 200, 200);

}
public boolean semiColorIsSavedToList(Color farbe) {
	for(int index = 0 ;   index < liste.size() -1; index++ ){
		Color pool = liste.get(index);
		boolean erg =semiColorExist(farbe, pool);
		return erg;
	}

	public boolean semiColorExist(Color farbe, Color pool){
	   int r = Math.abs(farbe.getRed() - pool.getRed());
	   int g = Math.abs(farbe.getGreen() - pool.getGreen());
	   int b = Math.abs(farbe.getBlue() - pool.getBlue());
		   if( r <= 50 || g <= 50 || b <= 50){
		return true;
	    }
	   return false;
	}
	public Color getNewColor(){
		Random rnd = new Random();
		int rRnd = rnd.nextInt(256);
		int gRnd = rnd.nextInt(256);
		int bRnd = rnd.nextInt(256);
			while((rRnd > 210)  || (Math.abs(rRnd - vorfarbe.getRed())< 50)){
			rRnd = rnd.nextInt(256); 
		} 
		 while((gRnd > 200) || (Math.abs(gRnd - vorfarbe.getGreen())< 50)){
			 gRnd = rnd.nextInt(256); 
		 }
		 while(bRnd < 150 || (Math.abs(bRnd - vorfarbe.getBlue())< 50)){
			 bRnd = rnd.nextInt(256); 
		 }

		Color farbe = new Color(rRnd,gRnd,bRnd);
		return farbe;
	}


----------



## genodeftest (1. September 2011)

@ottens: deinen Code kann man besser lesen, wenn du ihn in die Code-Tags packst (siehe meine Signatur)


----------



## ottens (1. September 2011)

Hallo Fabio,

du meinst System.out.println(" ein String "); ja das mache ich auch aber viele sagen mir
ich soll das nicht benutzen, es ist kein gutes Style meinen viele aber mir auch lieber 
zu benutzen.

Grüße

Ottens


----------



## sheel (1. September 2011)

Nein, er meint, dass du vor den gesamten Quellcode hier im Forum [code=java] schreiben sollst, und danach [/code].

Übrigens hat das nicht Fabio geschrieben, sondern genodeftest.

Und was ist an einem println schlechter Stil?


----------



## ottens (1. September 2011)

Hallo an euch alle also ich bin seit ein oder 2 Tagen hier also bin  neu hier daher.

mit System.out.println(); viele sagen soll man nicht einsetzen 
wenn man programmiert .

es gibt alternative, die man benutzen kann.

danke an allen. 

grüße


----------



## genodeftest (1. September 2011)

@ottens: Kein Problem. Ich habe gemeint, dass du vor deinen Code [code=java] schreiben sollst, und ganz ans Ende von deinem Code [/code]. Das sieht dann mit deinem Code von oben so aus:


```
public void paintComponent(Graphics gr) {
 super.paintComponent(gr);
 Graphics2D g2d = (Graphics2D) gr;

 farbe = getNewColor();
 // wenn die fARBE ODER eine ähnliche SCON DA IST, dann neue Farbe erstellen 
 while ((semiColorIsSavedToList(farbe) || liste.contains(farbe))){
 farbe = getNewColor();
 }
 liste.add(farbe);
 g2d.setColor(farbe);
 g2d.drawString(" neue Farbe ",250 , 20);
 g2d.fillOval(250, 20, 200, 200);

 }
 public boolean semiColorIsSavedToList(Color farbe) {
 for(int index = 0 ; index < liste.size() -1; index++ ){
 Color pool = liste.get(index);
 boolean erg =semiColorExist(farbe, pool);
 return erg;
 }

 public boolean semiColorExist(Color farbe, Color pool){
 int r = Math.abs(farbe.getRed() - pool.getRed());
 int g = Math.abs(farbe.getGreen() - pool.getGreen());
 int b = Math.abs(farbe.getBlue() - pool.getBlue());
 // dieferenz zwiscjen den Farben >= 50 
 if( r <= 50 || g <= 50 || b <= 50){
 return true;
 }
 return false;
 }
 public Color getNewColor(){
 Random rnd = new Random();
 int rRnd = rnd.nextInt(256);
 int gRnd = rnd.nextInt(256);
 int bRnd = rnd.nextInt(256);
 // keine helle Farben 
 while((rRnd > 210) || (Math.abs(rRnd - vorfarbe.getRed())< 50)){
 rRnd = rnd.nextInt(256); 
 } 
 while((gRnd > 200) || (Math.abs(gRnd - vorfarbe.getGreen())< 50)){
 gRnd = rnd.nextInt(256); 
 }
 while(bRnd < 150 || (Math.abs(bRnd - vorfarbe.getBlue())< 50)){
 bRnd = rnd.nextInt(256); 
 }

 Color farbe = new Color(rRnd,gRnd,bRnd);
 return farbe;
 }
```
Der Vorteil ist, dass die Syntax des Java-Codes farblich hervorgehoben wird. Das verbessert die Lesbarkeit. Außerdem ist dann offensichtlich, wo der Code beginnt/endet.

Oder kurz (so wie es in meiner Signatur steht) :
Aus 
[code=java]System.out.println("Hallo");[/code]
wird dann

```
System.out.println("Hallo");
```


----------



## ottens (1. September 2011)

danke genodeftest für die Mühe es ist echt lieb, aber hat jemand für mein Problem eine 
Lösung vielleicht  ****

Grüße

Ottens


----------



## sheel (1. September 2011)

Wenn du den Bitten jetzt auch noch nachkommen würdest, wäre schon.
Vor allem die Einrückungen...

Bearbeite deinen Beitrag oben. Ist doch wirklich nicht viel zu tun.
java vorne und /java hinten und den Code nocheinmal von der IDE reinkopieren.

Dann wird das viel einfacher zu lesen.
Keiner hier hat Lust dreimal so lange herumzurätseln, als nötig wäre.


----------



## Fabio Hellmann (1. September 2011)

Also wenn du die Linientypen nicht noch mit verändern kannst, weil die schon vergeben sind oder sonstiges, dann wird es wohl eher schwierig. Du brauchst zwar nur >200 Farben, aber das Problem liegt beim menschlichen Auge. Wir können numal die Farben nur schwer auseinander halten, sobald sie fast den selben Farbtypen haben. Von daher bin ich fast der Meinung, dass es für dein Problem keine Lösung geben wird.
Außer ich habe irgendetwas übersehen.

Gruß

Fabio


----------



## ottens (1. September 2011)

ok Fabio danke dir es war sehr nett mit euch  zu  kommunitzieren.


LG

Ottens


----------



## genodeftest (1. September 2011)

Doch, das muss sich lösen lassen.
Ist die Anzahl der Farben, die du brauchst begrenzt?

Ich hätte 2 Lösungswege:

1. Du erzeugst ein reduziertes Farbspektrum, das für R, G und B jeweils nur z.B. 8 verschiedene Werte hat: 0, 31, 63, 95, 127, 159, 171, 203, 235, 255 (ein Wert fällt wegen der Hintergrundfarbe weg). Damit hättest du 8^3=512 Farben zur Verfügung. Wenn du eine neue Farbe erzeugst, brauchst du nur eine Zufallszahl von 0 bis (einschließlich) 7 zu erzeugen und multiplizierst diese mit dem Faktor 32, dies wiederholst du für jede Komponente (R, G, B). Dann prüfst du, ob genau diese Farbe bereits existiert. Wenn ja, wiederholst du den letzten Schritt, wenn nein hast du deine Farbe.

2. Wenn du eine Farbe erzeugst, prüfst du ob sie "weit genug von allen anderen Farben entfernt ist", d.h. du überprüfst für jede Komponente und jede Farbe einzeln, ob die Differenz der jeweiligen Farbwerte unterhalb eines Grenzwertes liegt, z.B. so:

```
public Color generateRandomColor(List<Color> allColors, int mindestAbstand)
			throws Exception {

		Color newColor = null;
		for (int i = 0; i < 10000; i++) {

			final Color possibleNewColor = new Color(
					(int) (Math.random() * 0x01000000));
			boolean found = false;
			for (final Color c : allColors) {
				if (Math.abs(c.getBlue() - possibleNewColor.getBlue()) < mindestAbstand
						|| Math.abs(c.getRed() - possibleNewColor.getRed()) < mindestAbstand
						|| Math.abs(c.getGreen() - possibleNewColor.getGreen()) < mindestAbstand) {
					found = false;
					break; // Farbe liegt zu nah an anderer Farbe!
				} else {
					found = true;
				}
			}
			if (found) {
				newColor = possibleNewColor;
				break;// fertig, verlasse äußere Schleife
			}
		}

		if (newColor == null) {
			throw new Exception(
					"Keine Farbe generiert, bitte kleinere Grenze wählen!");
		}
		return newColor;
	}
```
(ungetesteter Code)

Zur ersten Idee fällt mir auch gleich noch was ein, aber ich geh erst essen...


----------



## sheel (1. September 2011)

Das hatten wir schon.
Und seitdem warte ich darauf, dass ottens versteht, was Codetags sind.

@ottens: Falls einfach [code=java]...[/code] nicht verständlich ist findest du in meiner Sig einen Link zu einer ausführlichen Erklärung.


----------



## genodeftest (1. September 2011)

stimmt. sorry, hab ich überlesen.


----------

