Czyli n = 100; Jak wygenerować 100 wizualnie różne kolory? Jest to matematycznie możliwe?
Jak wygenerować n różnych kolorów dla każdej liczby naturalnej n?
Chcesz przekonwertować do HSL i następnie iterację wartości odcienia (H) przy zachowaniu pozostałych 2 wartości stałej.
Dla każdej wartości Ci przekonwertować z powrotem do HSL RGB .
Zobacz moje odpowiedzi tutaj i tutaj .
Jeśli N jest bardzo duże i dlatego kolory nie są wizualnie odrębna można w tym punkcie ponownie iteracyjne nad wszystkie te same barwy i zmienić inne składniki zmieniać nasycenie lub jasność. Więc w zasadzie można mieć maksymalną liczbę wartości odcieni do używania, a raz, że jest trafiony można zacząć od nowa z innym nasycenia lub jasności.
100 jest dużo kolorów, ale może być w stanie to zrobić poprzez dystrybucję ich jako słabo jak to możliwe w HSB HSL lub przestrzeni; robi to w RGB jest chyba trudne.
Na przykład, może zdecydujesz się skorzystać z 10 różnych odcieni, 4 różne poziomy nasycenia i 3 różne ustawienia jasności, która daje maksymalnie 120 kolorów. trzeba starannie wybierać wartości nasycenia i jasności; ludzkie oczy są skomplikowane i zagmatwane czujniki. Jeśli potraktować przestrzeń kolorów jako stożek, prawdopodobnie zechcesz inną liczbę barw na każdym poziomie lekkość / nasycenia.
Oto link do Wikipedii wpisu HSB .
Edytować:
Nie mam żadnego doświadczenia w tej dziedzinie, a moje umiejętności matematyczne są dość przeciętne. Ale mam opinię, że rozwiązanie tego problemu jest bardziej skomplikowana i interesująca niż wiele odpowiedzi tutaj sugerować, ponieważ starałem się zrobić coś podobnego niedawno i nie znalazłem rozwiązania.
Różnica barw
Postrzeganie koloru jest oczywiście subiektywna, ale istnieje znacząca umowa pomiędzy ludźmi. Na przykład, wszyscy możemy się zgodzić, że czerwony, zielony i niebieski są bardzo różne kolory, a nawet colorblind ludzie zgadzają się, że czarno-białe są bardzo różne.
RGB
Najczęstszym przedstawieniem kolorów w systemach komputerowych jest wektorem (R, G, B) , która prowadzi do prostej funkcji odległości jak

Pozwala ustawić zakres dla r , g , a B do [0, 1], i jak to działa:
- Czerwony (1, 0, 0) i czerwony (1, 0, 0), ma odstęp 0 , co powinno być oczywiste
- Czerwony (1, 0, 0), i żółty (1, 1, 0) jest w odległości 1 , która jest mniejsza niż odległość
- Czerwony (1, 0, 0) i niebieski (0, 0, 1) , który jest sqrt (2) , która jest prawdopodobna
Jak na razie dobrze. Jednak problemem jest to, że niebieski i czerwony mają taką samą odległość 1 od czerni (0, 0, 0) , ale patrząc na obraz ten nie wydaje się prawdziwe:

Również żółty (1, 1, 0) i magenta (1, 0, 1), oba mają mieć taką samą odległość 1 od bieli (1, 1, 1) , który nie wydaje się mieć sens albo:

HSV
Myślę, że jest bezpiecznie założyć, że metryki analogiczny dla systemów HSV kolor mają te same problemy. Te schematy kolorów nie są przeznaczone do porównywania kolor.
CIEDE2000
Na szczęście istnieje już naukowcy starają się znaleźć dobry sposób na porównanie kolorów. Wpadli niektórych wyszukanych metod, z których ostatnią jest CIEDE2000

(pełny wzór opisany w artykule jest ogromna )
Pomiar ten bierze pod uwagę ludzką percepcję, jak fakt, że wydaje się być w stanie dostrzec odcienie niebieskiego bardzo dobrze. Więc powiedziałbym, że używamy tego jako naszej funkcji różnicy kolorów.
Algorytm Picking Kolor
rozwiązanie naiwny
Niektóre odpowiedzi sugerują następujący algorytm
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
Algorytm ten ma pewne problemy:
Odstęp między kolorami nie jest optymalna. Jeśli wyobrazimy sobie kolorów tak, aby być jak numery na jednej linii, trzy numery będą optymalnie rozmieszczone tak:
| A b ----- ----- c |
Opakowanie dodatkowy jeden numer tam bez ruchu a, b, c jest wyraźnie gorszy niż ujednolicaniu wszystkie kolory.
Algorytm nie jest gwarantowana, aby zakończyć . Co jeśli nie ma koloru, który jest na tyle daleko tworzą istniejące kolory w liście? Pętla będzie trwać wiecznie
Prawidłowe rozwiązanie
Cóż .. nie mam jednego.
Nie jest to odpowiedź na twoje pytanie, ale jeśli n ma wartość maksymalną, a aplikacja na to pozwala, można użyć predefiniowaną listę kolorów, takich jak ten:
http://en.wikipedia.org/wiki/List_of_colors
Jedną z zalet jest to, że można pokazać ludzku czytelną nazwę koloru w podpowiedzi dla osób ślepoty barw.
Na początek, nie używać przestrzeni RGB; trudno znaleźć gorszego przestrzeń kolorów dla tego problemu. (W zależności od tego, czy używasz kolorów na ekranie lub do druku Masz ogromne liczby nie do odróżnienia kolorach czarnym lub w pobliżu w pobliżu White).
Jeśli używasz Space Lab, istnieje percepcyjne modele kolorów (CIE 1996? A CIE 2000) do pomiaru wizualne bliskość kolorach (do druku i wyświetlania odpowiednio).
Nie mów, że jeśli masz zamiar obliczyć kolory raz i zapisać wynik, czy muszą być przeliczane na bieżąco (w takim przypadku, jeśli ma być deterministyczny lub nie). Oczywiście każda dyskusja o tym, jak najlepiej, aby wygenerować zestaw będzie zależeć od tego.
Choć chciałbym sugerować, że równo dzieląc osie przestrzeni barw (powiedzmy do 8) i za pomocą tych punktów początkowych jak byłoby znacznie bardziej efektywne niż jakiekolwiek procesu losowego. Na pewno wystarczy porównać dowolny punkt do swoich sąsiadów (i tylko wtedy, gdy są one już w zestawie), który pozwoli Ci zaoszczędzić ogromną liczbę porównań.
Tak. Definiowanie wyraźna jest produktem odroczenie do przestrzeni kolorów wtedy, kiedy mówimy maksymalnie różne kolory, co powiedzieć, to kolory, które są tak daleko od wszystkich innych kolorach, jak to możliwe. Ale ponieważ przestrzeń kolorów nie zmienia odpowiedź nie ulegnie zmianie. I realizacji czegoś, co lepiej pasuje do ludzkich oczu i jak ludzkie oczy zobaczyć jak kolor CIE-Lab odległości barw dE2000 sprawia ponawianie wszystkie obliczenia ciężko, ale sprawia, że lista statyczna łatwe. Oto 128 wpisów.
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"
};
Oto pierwsza 256 jako obraz.

(Od lewej do prawej) (od góry do dołu). Możesz być w stanie uzyskać jeszcze kilka różnych kolorów, jeśli wykonane, że każdy kolor był w równej odległości, jak to możliwe w przestrzeni kolorów. Tablicę przeglądową, która odbiera każdy dodatkowy kolor co najwyżej odmienny od wszystkich wcześniejszych kolorów, zamiast wyznaczania N na początku i następnie odwzorowanie z przestrzeni kolorów. Więc tak, brute force oraz algorytm kolor dsitance wysoki poziom i jesteś ustawiony, aby ten sam zestaw kolorów samodzielnie. W ciągu jednego dnia albo tak.













