/ / Konstruowanie kolorów dla maksymalnego kontrastu - algorytm, język-agnostyk, matematyka, grafika, kolory

Konstruowanie kolorów dla maksymalnego kontrastu - algorytm, język-agnostyk, matematyka, grafika, kolory

Chcę narysować niektóre elementy na ekranie, każdy element jestw jednym z N zestawów. Liczba zestawów zmienia się cały czas, więc muszę obliczyć N różnych kolorów, które są tak różne, jak to tylko możliwe (aby ułatwić identyfikację tego, co jest w tym zestawie).

Na przykład z N = 2 moje wyniki byłybyczarny i biały. Z trzema, wydaje mi się, że dostanę cały czerwony, cały zielony, cały niebieski. Dla wszystkich czterech nie jest tak oczywiste, jaka jest prawidłowa odpowiedź, i tutaj mam problem.

EDYTOWAĆ:: Oczywistym podejściem jest odwzorowanie 0 na czerwony, 1 na zielony i wszystkie kolory pomiędzy odpowiednimi kolorami tęczy, następnie można uzyskać kolor dla zestawu N za pomocą GetRainbowColour (N / TotalSets), więc metoda GetRainbowColour jest wszystkim to musi rozwiązać ten problem

Odpowiedzi:

5 dla odpowiedzi № 1

Możesz przeczytać o modelach HSL i HSV w tym zakresie artykuł wikipedia. "H" w akronimie oznacza Hue, a to jest tęcza, którą chcesz. Wygląda na to, że chcesz maksymalnie nasycić. W artykule wyjaśniono również, jak konwertować na kolory RGB.

Wygląda jak podobne pytanie zostało zadane wcześniej.


5 dla odpowiedzi nr 2

Odpowiedź na to pytanie jest subiektywna - cojest najlepszym kontrastem dla kogoś z pełnym widzeniem, niekoniecznie najlepiej kontrastuje z kimś, kto jest ślepy na kolory lub ma ograniczony wzrok lub kimś z normalnym wzrokiem, który obsługuje sprzęt w ciemnym otoczeniu.

Fizjologicznie, ludzie mają o wiele lepszerozdzielczość dla intensywności, która dla barwy lub nasycenia. Właśnie dlatego telewizja analogowa, cyfrowe wideo i kompresja zdjęć wyrzucają informacje o kolorze, aby zmniejszyć przepustowość (4: 2: 2) - jeśli umieścisz dwa piksele o różnej intensywności, nie ma znaczenia jaki to kolor - po prostu możemy wyczuć różnice kolorów na dużych obszarach o podobnej intensywności.

Więc jeśli coś, co próbujesz wyświetlić, mawiele małych obszarów o zaledwie kilku pikselach, lub chcesz, aby był używany w ciemności (w ciemności mózg zwiększa niebieskie komórki i nie widzimy również koloru) lub 10% populacji mężczyzn, którzy są ślepi na kolory, należy rozważyć użycie intensywności jako głównego czynnika różnicującego, a nie odcień. GetRainbowColour zignorowałby najważniejszy wymiar ludzkiego zmysłu wzrokowego, ale może pracować całkiem dobrze dla ciągłych danych.


1 dla odpowiedzi nr 3

Dzięki, brainjam, za sugestię użycia HSL. Podsunąłem tę małą funkcję, która wydaje się dobrze działać na wykresach złożonych:

var contrastingColors = function(len) {
var result = [];
if (len > 0) {
var h = [0, 180];                       // red, cyan
var shft = 360 / len;
var flip = 0;
var l = 50;
for (var ix = 0; ix < len; ix++) {
result.push("hsl(" + h[flip] + ",100%," + l + "%)");
h[flip] = (h[flip] + shft) % 360;
flip = flip ? 0 : 1;
if (flip == 0) {
l = (l == 50) ? 30 : (l == 30? 70 : 50);
}
}
}
return result;
};