Řekněme, že n = 100; Jak mohu vytvářet 100 vizuálně odlišných barev? Je to matematicky možné?
Jak generovat n různé barvy pro nějaké přirozené číslo n?
Chcete-li převést do HSL a pak iterovat hodnot odstín (H), přičemž další 2 hodnoty konstantní.
Pro každou hodnotu, kterou převést z HSL zpět do RGB .
Podívejte se na mé odpovědi zde a zde .
Pokud je váš N je velmi velké, a proto barvy nejsou vzhledově odlišné jste mohli v té době re-iterovat přes všechny stejné odstíny a změna ostatních složek měnit sytost nebo jas. Takže v podstatě jste mohli mít maximální počet hodnot odstínu použít, a jakmile bude hit můžete začít znovu s jiným nasycení nebo světelnosti.
100 je hodně barev, ale mohli byste být schopni to udělat tím, že k distribuci jako řídce jak je to možné v HSB a HSL prostoru; dělá to v RGB je zřejmě obtížné.
Například, můžete se rozhodnout použít 10 různých odstínů, 4 různé úrovně sytosti a 3 různé nastavení jasu, které by vám až 120 barev. Budete muset pečlivě vybírat hodnoty sytosti a jasu; lidské oči jsou složité a matoucí senzory. Máte-li léčit barevný prostor jako kužel, pak budete pravděpodobně mít jiný počet odstínů na každé úrovni lehkost / nasycení.
Zde je odkaz na wikipedia vstupu na HSB .
Upravit:
I nemají odborné znalosti v této oblasti a mé matematické schopnosti jsou dost průměr. Ale já mám názor, že řešení tohoto problému je složitější a zajímavější než mnoho odpovědí zde naznačují, protože jsem se snažil udělat něco podobného nedávno a nenašel řešení.
barva Rozdíl
Vnímání barev je samozřejmě subjektivní, ale existuje významná shoda mezi lidmi. Například, že se všichni shodneme, že červená, zelená a modrá jsou velmi různé barvy, a dokonce barvoslepý lidí souhlasí s tím, že černá a bílá jsou velmi odlišné.
RGB
Nejběžnější znázornění barev v počítačových systémech je vektor (r, g, b), což naznačuje, jednoduchou funkci, jako vzdálenost

Umožňuje nastavit rozsah pro r , g a b k [0, 1] a zjistit, jak to funguje:
- Červená (1, 0, 0) a červená (1, 0, 0) má vzdálenost 0 , což by mělo být zřejmé,
- Červená (1, 0, 0) a žlutá (1, 1, 0) je vzdálenost 1 , který je menší, než vzdálenost
- Červená (1, 0, 0) a modré (0, 0, 1) , která je sqrt (2) , který je přijatelný
Zatím je vše dobré. Problémem však je, že modrá a červená mají stejnou vzdálenost 1 od černé (0, 0, 0) , ale při pohledu na obrázek se nezdá k držení pravdivý:

Také žlutá (1, 1, 0) a purpurové (1, 0, 1) mají oba mají stejnou vzdálenost 1 od bílé (1, 1, 1) , což se nezdá smysl buď:

HSV
Myslím, že to je bezpečné předpokládat, že analogové metriky pro systémy HSL a HSV barevné mají stejné problémy. Tato barevná schémata nejsou určeny pro porovnávání barev.
CIEDE2000
Naštěstí existují vědci už se snaží najít dobrý způsob, jak porovnávat barvy. Přišli s několika propracovanými metodami, z nichž poslední bylo CIEDE2000

(úplné vzorec popsány v článku, je obrovský )
Tato metrika se lidské vnímání v úvahu, stejně jako fakt, že jsme se zdají být schopen rozeznat odstíny modré velmi dobře. Takže já bych to použijeme jako náš barevný rozdíl funkci.
Nástup algoritmus Color
naivní řešení
Některé odpovědi navrhl následující algoritmus
colors = []
for n in range(n):
success=False
while not success:
new_color = random_color()
for color in colors:
if distance(color, new_color)>far_enough:
colors.append(new_color)
success = True
break
Tento algoritmus má nějaké problémy:
Rozteč barev není optimální. Představíme-li si barvy být jako čísla na linky, tři čísla by být optimálně rozmístěny takto:
| A ----- b ----- c |
Balení navíc jedno číslo tam bez hnutí, B a C je zřetelně horší než novém uspořádání všechny barvy.
Algoritmus není zaručeno ukončit . Co když není barva, která je dost daleko tvoří stávající barvy v seznamu? Smyčka se bude navždy
Správné řešení
No .. nemám jeden.
Není odpověď na vaši otázku, ale pokud n má maximální hodnotu a vaše aplikace dovolí, můžete použít předdefinovaný seznam barev, jako je tento:
http://en.wikipedia.org/wiki/List_of_colors
Jednou z výhod je, že byste mohli ukázat lidsky čitelný název barvy v popisku pro lidi s barvosleposti.
Pro začátek, nepoužívat RGB prostoru; Je těžké najít horší barevný prostor tohoto problému. (V závislosti na tom, zda používáte barvy pro zobrazení nebo pro tisk buď máte obrovské množství nerozeznatelné barev okolí černé nebo téměř bílá).
Používáte-li Lab prostoru, existuje vnímání barevné modely (CIE 1996? A CIE 2000) pro měření vizuální blízkost barev (pro tisk a zobrazení v tomto pořadí).
Nemusíte říkat, pokud budete počítat barvy najednou a uložit výsledek, nebo zda je nutné přepočítávat za běhu (av tom případě, pokud má být deterministický nebo ne). Je zřejmé, jakákoli diskuse o tom, jak nejlépe generovat soubor bude záviset na tom.
I když by naznačovala, že rovnoměrné rozdělení osy barevného prostoru (řekněme do 8) a za použití těch, jako výchozí body by byla mnohem účinnější než jakýkoli náhodného procesu. Jistě stačí porovnat libovolný bod na její sousedy (a to pouze v případě, že jste již v sadě), což vám ušetří obrovské množství srovnání.
To jo. Definování odlišný je produktem odložení do barevného prostoru a pak, když řekneme, maximálně odlišné barvy, co máme na mysli říct, barvy, které jsou tak daleko od všech ostatních barev, jak je to možné. Ale protože barevný prostor nemění odpověď se nebude měnit. A zavádění něco, co se nejlépe hodí s lidskýma očima a jak lidské oko vidí barvy jako CIE-lab de2000 barev vzdálenosti umožňuje předělání všechny výpočty těžké, ale je statický seznam snadné. Tady je 128 záznamů.
private static final String[] indexcolors = new String[]{
"#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
"#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
"#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
"#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
"#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
"#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
"#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
"#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",
"#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
"#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
"#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
"#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
"#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
"#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
"#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
"#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"
};
Zde je první 256 jako obrázek.

(Zleva doprava) (top-k-dolní část). Ty by mohly být schopni získat ještě několik odlišných barev, pokud jste se, že každá barva byla tak ve stejné vzdálenosti jako je to možné v barevném. Že vyhledávací tabulky vybere každý další barvu maximálně odlišný od všech předešlých barev, spíše než s vyznačením N na začátku a pak zmapovat barevný prostor. Tak jo, hrubá síla a algoritmus barva dsitance vysokou úroveň a máte nastaven tak, aby tuto stejnou sadu barev sami. V průběhu jednoho dne nebo tak.













