Napisałem dwie metody poniżej, aby automatycznie wybrać N różnych kolorów. Działa poprzez zdefiniowanie częściowej funkcji liniowej na kostce RGB. Zaletą tego jest to, że możesz również uzyskać skalę progresywną, jeśli tego właśnie chcesz, ale kiedy N staje się duży, kolory mogą zacząć wyglądać podobnie. Mogę również wyobrazić sobie równomierne podzielenie kostki RGB na sieć, a następnie rysowanie punktów. Czy ktoś zna jakieś inne metody? Wykluczam definiowanie listy, a potem po prostu jej przeglądanie. Powinienem również powiedzieć, że generalnie nie dbam o to, czy kolidują ze sobą, czy też nie wyglądają ładnie, muszą być tylko wizualnie odrębne.
public static List<Color> pick(int num) {
List<Color> colors = new ArrayList<Color>();
if (num < 2)
return colors;
float dx = 1.0f / (float) (num - 1);
for (int i = 0; i < num; i++) {
colors.add(get(i * dx));
}
return colors;
}
public static Color get(float x) {
float r = 0.0f;
float g = 0.0f;
float b = 1.0f;
if (x >= 0.0f && x < 0.2f) {
x = x / 0.2f;
r = 0.0f;
g = x;
b = 1.0f;
} else if (x >= 0.2f && x < 0.4f) {
x = (x - 0.2f) / 0.2f;
r = 0.0f;
g = 1.0f;
b = 1.0f - x;
} else if (x >= 0.4f && x < 0.6f) {
x = (x - 0.4f) / 0.2f;
r = x;
g = 1.0f;
b = 0.0f;
} else if (x >= 0.6f && x < 0.8f) {
x = (x - 0.6f) / 0.2f;
r = 1.0f;
g = 1.0f - x;
b = 0.0f;
} else if (x >= 0.8f && x <= 1.0f) {
x = (x - 0.8f) / 0.2f;
r = 1.0f;
g = 0.0f;
b = x;
}
return new Color(r, g, b);
}
java
colors
color-scheme
color-picker
praca
źródło
źródło
Odpowiedzi:
Za pomocą modelu kolorów HSL można tworzyć kolory.
Jeśli wszystko, czego chcesz, to różne odcienie (prawdopodobnie) i niewielkie różnice w jasności lub nasyceniu, możesz rozdzielić odcienie w następujący sposób:
źródło
To pytanie pojawia się w kilku dyskusjach SO:
Proponowane są różne rozwiązania, ale żadne nie jest optymalne. Na szczęście na ratunek przychodzi nauka
Arbitralne N.
Ostatnie 2 będą darmowe przez większość bibliotek uniwersyteckich / serwerów proxy.
N jest skończony i stosunkowo mały
W takim przypadku można wybrać rozwiązanie listowe. Bardzo interesujący artykuł na ten temat jest dostępny bezpłatnie:
Do rozważenia jest kilka list kolorów:
Wpadłem również na tę paletę przez studenta MIT. Wreszcie następujące linki mogą być przydatne w konwersji między różnymi systemami kolorów / współrzędnymi (na przykład niektóre kolory w artykułach nie są określone w RGB):
Dla listy Kelly'ego i Boyntona dokonałem już konwersji na RGB (z wyjątkiem bieli i czerni, co powinno być oczywiste). Trochę kodu C #:
A oto wartości RGB w reprezentacjach szesnastkowych i 8-bitowych na kanał:
Dla wszystkich programistów Java, oto kolory JavaFX:
poniżej przedstawiono nieposortowane kolory kelly zgodnie z powyższą kolejnością.
poniżej są posortowane kolory kelly według odcieni (zauważ, że niektóre żółcienie nie kontrastują)
źródło
Podobnie jak odpowiedź Uri Cohen, ale zamiast tego jest generatorem. Zacznie od używania kolorów daleko od siebie. Deterministyczny.
Próbka, najpierw pozostawione kolory:
źródło
Oto pomysł. Wyobraź sobie cylinder HSV
Zdefiniuj górną i dolną granicę jasności i nasycenia. Określa kwadratowy pierścień o przekroju w przestrzeni.
Teraz rozprosz losowo N punktów w tej przestrzeni.
Następnie zastosuj na nich algorytm iteracyjnego odpychania, albo dla określonej liczby iteracji, albo do momentu ustabilizowania się punktów.
Teraz powinieneś mieć N punktów reprezentujących N kolorów, które są tak różne, jak to możliwe, w przestrzeni kolorów, którą jesteś zainteresowany.
Hugo
źródło
Dla przyszłych pokoleń dodaję tutaj akceptowaną odpowiedź w Pythonie.
źródło
Wydaje się, że wszyscy przegapili istnienie bardzo użytecznej przestrzeni kolorów YUV, która została zaprojektowana w celu reprezentowania postrzeganych różnic kolorów w ludzkim układzie wzrokowym. Odległości w YUV reprezentują różnice w postrzeganiu człowieka. Potrzebowałem tej funkcjonalności dla MagicCube4D, która implementuje 4-wymiarowe kostki Rubika i nieograniczoną liczbę innych krętych łamigłówek 4D o dowolnej liczbie twarzy.
Moje rozwiązanie zaczyna się od wybrania losowych punktów w YUV, a następnie iteracyjnego rozbicia dwóch najbliższych punktów i konwersji do RGB tylko po zwróceniu wyniku. Metoda to O (n ^ 3), ale nie ma to znaczenia dla małych liczb lub tych, które można buforować. Z pewnością można go usprawnić, ale wyniki wydają się doskonałe.
Funkcja pozwala na opcjonalne określenie progów jasności, aby nie wytwarzać kolorów, w których żaden komponent nie jest jaśniejszy ani ciemniejszy niż podane ilości. IE możesz nie chcieć wartości zbliżonych do czerni lub bieli. Jest to przydatne, gdy powstałe kolory zostaną użyte jako kolory podstawowe, które zostaną później zacienione za pomocą oświetlenia, warstw, przezroczystości itp. I nadal muszą wyglądać inaczej niż kolory podstawowe.
źródło
Model kolorów HSL może dobrze nadawać się do „sortowania” kolorów, ale jeśli szukasz wizualnie odrębnych kolorów, zdecydowanie potrzebujesz zamiast tego modelu kolorów Lab .
Kiedy już to wiesz, znalezienie optymalnego podzbioru N kolorów z szerokiej gamy kolorów jest nadal trudnym problemem (NP), trochę podobnym do problemu Podróżującego sprzedawcy i wszystkie rozwiązania wykorzystujące algorytmy k-średnich lub coś takiego nie będzie tak naprawdę Wsparcie.
To powiedziawszy, jeśli N nie jest zbyt duży i jeśli zaczniesz od ograniczonego zestawu kolorów, z łatwością znajdziesz bardzo dobry podzbiór różnych kolorów zgodnie z odległością Lab z prostą losową funkcją.
Zakodowałem takie narzędzie na własny użytek (można je znaleźć tutaj: https://mokole.com/palette.html ), oto, co dostałem dla N = 7:
Wszystko jest w javascript, więc zajrzyj do źródła strony i dostosuj ją do własnych potrzeb.
źródło
L
od 0 do 128,a
ib
od -128 do 128. ¶ że rozpoczęłaL
= 0,a
= -128,b
= -128, który stanowi jasnoniebieskiej barwy. Potem wzrosłema
trzy razy. ❶ Duża zmiana (+128)a
= 50 powoduje tylko nieco ciemniejszy niebieski. ❷ (+85)a
= 85 wyników wciąż w kolorze niebieskim. ❸ Jednak stosunkowo niewielka zmiana (+43)a
= 128 całkowicie zmienia kolor na fuksja.Oto rozwiązanie problemu „wyraźnego” problemu, który jest całkowicie przesadzony:
Utwórz kulę jednostkową i upuść na nią punkty za pomocą odpychających ładunków. Uruchom układ cząsteczkowy, aż przestaną się poruszać (lub delta będzie „wystarczająco mała”). W tym momencie każdy z punktów jest jak najdalej od siebie. Konwertuj (x, y, z) na rgb.
Wspominam o tym, ponieważ w przypadku niektórych klas problemów ten rodzaj rozwiązania może działać lepiej niż brutalna siła.
Pierwotnie widziałem to podejście tutaj do mozaikowania kuli.
Ponownie, najbardziej oczywiste rozwiązania przechodzenia przez przestrzeń HSL lub przestrzeń RGB prawdopodobnie będą działać dobrze.
źródło
Spróbowałbym naprawić nasycenie i luminację do maksimum i skupić się tylko na odcieniu. Widzę, że H może przejść od 0 do 255, a następnie się zawija. Teraz, jeśli chcesz dwa kontrastujące kolory, weźmiesz przeciwne strony tego pierścienia, tj. 0 i 128. Jeśli chcesz 4 kolory, weźmiesz niektóre oddzielone przez 1/4 długości 256 koła, tj. 0, 64, 128, 192. I oczywiście, jak sugerowali inni, gdy potrzebujesz N kolorów, możesz po prostu oddzielić je od 256 / N.
Dodałbym do tego pomysłu użycie odwróconej reprezentacji liczby binarnej do utworzenia tej sekwencji. Spójrz na to:
... w ten sposób, jeśli potrzebujesz N różnych kolorów, możesz po prostu wziąć pierwsze N liczb, odwrócić je i uzyskać jak najwięcej odległych punktów (bo N jest potęgą dwóch), zachowując jednocześnie każdy prefiks sekwencja bardzo się różni.
Był to ważny cel w moim przypadku użycia, ponieważ miałem tabelę, w której kolory zostały posortowane według obszaru objętego tym kolorem. Chciałem, aby największe obszary na wykresie miały duży kontrast, i nie przeszkadzało mi to, że niektóre małe obszary miały kolory podobne do kolorów z pierwszej dziesiątki, ponieważ dla czytelnika było oczywiste, który z nich po prostu obserwując ten obszar.
źródło
getfracs
. Ale twoje podejście jest szybkie i „proste” w językach niskopoziomowych: nieco cofania w C .Jeśli N jest wystarczająco duży, dostaniesz podobne kolory. Na świecie jest ich tylko tyle.
Dlaczego nie po prostu równomiernie rozdzielić je w widmie, tak:
Jeśli chcesz pomieszać sekwencję, aby podobne kolory nie były obok siebie, możesz przetasować wynikową listę.
Czy to rozumiem?
źródło
Jest to trywialne w MATLAB (istnieje polecenie hsv):
źródło
Napisałem pakiet dla R o nazwie Qualpalr, który został zaprojektowany specjalnie do tego celu. Polecam spojrzeć na winietę, aby dowiedzieć się, jak to działa, ale postaram się podsumować główne punkty.
Qualpalr bierze specyfikację kolorów w przestrzeni kolorów HSL (która została wcześniej opisana w tym wątku), rzutuje ją na przestrzeń kolorów DIN99d (która jest percepcyjnie jednolita) i znajduje tę,
n
która maksymalizuje minimalną odległość między nimi.źródło
Myślę, że ten prosty algorytm rekurencyjny uzupełnia przyjętą odpowiedź w celu wygenerowania wyraźnych wartości odcienia. Zrobiłem to dla hsv, ale może być również używane do innych przestrzeni kolorów.
Generuje odcienie w cyklach, możliwie jak najbardziej osobno w każdym cyklu.
Nie mogłem znaleźć tego rodzaju algorytmu tutaj. Mam nadzieję, że to pomoże, to mój pierwszy post tutaj.
źródło
Ta funkcja OpenCV wykorzystuje model kolorów HSV do generowania
n
równomiernie rozłożonych kolorów wokół 0 <= H <= 360º z maksymalnym S = 1,0 i V = 1,0. Funkcja generuje kolory BGR wbgr_mat
:źródło