createRandomColor einschränken

Steffanie

Mitglied
Hi Jungs,

ich hab folgendes Problem, vielleicht könnt ihr mir ja helfen!
ich hab folgende Methoden
Java:
	private Color createRandomColor(){
		return new Color(minmax(1,254),minmax(1,254),minmax(1,254));
		}
		private int minmax(int min, int max) {
		return (int) (Math.random()*(max-min)+min);
		}
--> ich glaube bzw hoffe das mit meinem Code zumindest kein Schwarz/Weiß möglich ist!
aber wie bekomme ich es hin das keine hellen Farben möglich sind!
also alles was schwer zu lesen ist...
Klar
private Color createRandomColor(){
Color c=null;
while(//Bedingung)
{
c = new Color(minmax(1,254),minmax(1,254),minmax(1,254))
}
return c;
}
also wie bekomme ich das hin?
 

Natac

Bekanntes Mitglied
Welche Farbwerte haben denn deine "Hellen Farben"? Die musst du dann halt ausschließen. Vielleicht bietet sich eine Methode
Code:
createRandomLightColor()
an, die den Wertebereich von
Code:
minmax(..)
so setzt, dass keine Hellen Farben herauskommen können!?
 

Steffanie

Mitglied
genau sowas will ich eben ich weiß aber nicht wie hellen Farben definiert sind also ob die einen gewissen Werte bereich haben sprich wenn Rot =50 dann ist das eine helle Farbe mti Rottönung oder sowas in der Art...
es sind halt etwas viele Möglichkeiten geben bei 0-255,0-255,0-255;

Gibts da eventuell irgendeinen Algorithmus ich bin sicher nicht die erste die das Problem hat
 

Decrayer

Mitglied
Also, die Farbe wird ja durch RGB gebildet. Wenn R,G und B = 255 sind, dann erhälst du weiss. Wenn R,G und B = 0 sind, dann erhälst du Schwarz. Die Helligkeit der Farbe ist also proportional zur Summe deines R,G und B Wertes (R+G+B = Helligkeit).

Ganz einfache Lösung: Wertebereich der minmax stärker einschränken
Java:
return new Color(minmax(1,128),minmax(1,128),minmax(1,128));

Allerdings wird dann schwarz auch noch möglich sein. Und ein schön knalliges Rot wird es auch nicht mehr geben. Daher:

Bessere Lösung: Die Farbwerte in ein Verhältnis zueinander setzen. z.B.

R = minmax(0,256)
G = minmax(0,256)
B = 256-((R+G)/2)

Wenn R und G beide = 256 sind, dann ergibt sich für B => 0
Wenn R und G beide = 0 sind, dann ergibt sich für B => 256

Noch viel bessere Lösung:
Noch eleganter wäre es, wenn du einfach nur Farben auf einem Helligkeitswert des Farbkreises zulassen würdest. Dazu muss man nur eine Bedinung aufstellen:

R+G+B = Gewünschte Helligkeit (z.B. 512).

Wir wollen also alle Kombinationen aus R, G und B, die zusammen 512 ergeben.

Und jetzt möchte ich eine Funktion für einen schönen Farbverlauf haben, der ich einen Wert zwischen c= 0 und 1 gebe, und die mir dann dafür schöne Farbwerte zurück liefert (halb-Pseudo-Code):


Java:
		c = 3*c; //ich verdreifache das c, weil ich gleich drei Intervalle/Farbübergänge haben werde, und so die Grenzen in den If's einfacher zu schreiben sind.
		double H = 256.0; //maximale Helligkeit (zwischen 0 und 256), hier als double damit ich im code nicht so viel casten brauch und er übersichtlicher wird. Aber am besten als int implementieren.
		double R,G,B;
		
		
		if (c<1.0){
			R = (1-c) * H; //wir fangen bei totalem Rot an (c=0 -> R = H), dass wir mit steigendem c immer weniger werden lassen.
			G = c * H; //und dafür lassen wir den Grünwert steigen.
			//B bleibt 0.
		}
		if (c>1.0 && c<2.0){
			G = (2-c) * H; //Nun ist Grün stark, und wir wollen den Übergang zu Blau bekommen.
			B = (c-1) * H;
			//R hat hier nichts zu sagen.
		}
		if (c>2.0){
			B = (3-c) * H; //Wir starten mit sattem Blau und lassen es weniger werden.
			R = (c-2) * H; //und am Ende ist Rot wieder "in"
		}
		return new Color(R,G,B);

Nachteil von diesem Code: Man wird immer bunte Ergebnisse bekommen, d.h. nie ein Grau, sondern immer nur Farbkombinationen zwischen zwei der drei Farben.
 
Zuletzt bearbeitet:

Steffanie

Mitglied
Wow. Danke das ist ja ne super Lösung. Genau nach soetwas habeich gesucht.:toll:

Das mit den Grauwerten ist sogar im meinem Fall kein Nachteil sondern perfekt. Ich färbe mit dieser Methode die Benutzernamen ein... Wenn nur "farbige" Farben vorkommen ist das perfekt!

So wenn ich das richtig verstehe bewerstelligt ein wert von H=256 das ein reines Rot möglich ist oder?
also wenn ic den Wert z.b. auf 180 abändere wird kein reines Rot mehr vorkommen?
--> Nur die Admins dürfen in "knallem" Rot also Color.red schreiben!
der Methode gebe ich einfach ein Math.random() mit...
Java:
public static Color createRandomColor(double c){
    c = 3*c;
    int H = 180; 
    double R=0.0,G=0.0,B=0.0;
   
 
    if (c<1.0){
        R = (1-c) * H;
        G = c * H; 
        
    }
    else if (c>1.0 && c<2.0){
        G = (2-c) * H;
        B = (c-1) * H;
        
    }
    else if (c>2.0){
        B = (3-c) * H; 
        R = (c-2) * H; 
    }
  
    
    return new Color((int)R,(int)G,(int)B);
   
}
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben