RGB Farbenspiele

ManicMarble

Erfahrenes Mitglied
Guten Morgen,

ich platziere meine Frage mal hier im Coders Talk, da sie eigentlich sprach-unabhängig ist (obwohl es in meinem konkreten Fall um eine Webanwendung geht):

Ich suche einen Algoritmus, mit dem ich zu einer bestimmten RGB-Farbe ein möglichst kontrastreiches Gegenstück finde.

Ich denke, der Begriff "Komplementärfarbe" trifft es nicht ganz. Eigentlich brauche ich ja eine ganze Reihe von Farben (so etwa 30), die sich alle deutlich sichtbar voneinander unterscheiden. Die Grenze zwischen 2 benachbarten Farbfeldern muss selbst auf einem Graustufen-Ausdruck noch deutlich erkennbar sein.

Sinn der ganzen Angelegenheit ist eine Anwendung zur Erzeugung von Geschäftsgrafiken (Diagramme/Charts). Natürlich könnte ich mir einfach 30 Farben "manuell" raussuchen und experimentell die besten "Nachbarschaften" rausfinden, aber hey - ich bin Programmierer und die Arbeit soll ja auch ein bischen Spaß machen. ;)
 
Hi,

von mir mal ein "halbnaiver" Ansatz, der bei mir im Test recht gute Ergebnisse liefert:

ECMA-Script
Code:
var c = new Array(10); // Farben

var dist = 0x66; // Minimaldistanz (r, g und b gemittelt)

for (var i=0; i<c.length; i++) {
	var obj = new Object();
	obj = getCol(obj, c[i - 1]); // Farbe holen, die sich von der vorherigen unterscheidet
	c[i] = obj;
}

function getCol(obj, prev) {
	do {
		obj.r = int(Math.random() * 0xFF); // zufälliges Farbobjekt erzeugen ...
		obj.g = int(Math.random() * 0xFF);
		obj.b = int(Math.random() * 0xFF);
	} while (distance(obj, prev) < dist); // ... bis Distanz hinreichend groß
	return obj;
}

function distance(o1, o2) { // Distanz berechnen
	var v1 = Math.round((o1.r + o1.g + o1.b) / 3);
	var v2 = Math.round((o2.r + o2.g + o2.b) / 3);
	return Math.abs(v1 - v2);
}

function decToHex(n) { // hier zum Umwandeln numerischer Werte von
	var h = int(n / 16); // 0 bis 255 in hexadezimale Strings verwendet.
	n -= h * 16; // Farbwerte lassen sich natürlich auch direkt
	var l = n; // multipliziert addieren.
	h = hdig(h);
	l = hdig(l);
	return h + l;
}

function hdig(n) {
	if (n > 9) {
		return String.fromCharCode(65 + (n - 10));
	} else {
		return n.toString();
	}
}

Gruß
.
 
Hallo Tobias,
Wow, der Code sieht ziemlich gut aus! Ich bin echt begeistert, dass sich jemand so viel Mühe macht - ist schon eine klasse Community hier.

Leider kann ich den Code derzeit nicht testen, bin zur Zeit auf Dienstreise in den USA, habe hier auf meinem Notebook nur eine eingeschränkte Entwicklungsumgebung laufen und vor allem kaum Zeit. (War natürlich blöd von mir, den Beitrag kurz vor meiner Abreise zu posten.)
Ich werde mir das auf jeden Fall genauer anschauen, sobald ich wieder am Heim-Arbeitsplatz sitze, das wird ab Montag, dem 18.12. sein.

Bis dahin erstmal vielen Dank.
 
Zurück