Głównym celem modelu kolorów RGB (czerwony zielony niebieski) jest wykrywanie, reprezentacja i wyświetlanie obrazów w systemach elektronicznych, takich jak telewizory i komputery
HSL (Hue Saturation Lightness) to alternatywny model kolorów, zaprojektowany w latach 70. XX wieku przez badaczy grafiki komputerowej w celu ściślejszego dopasowania do sposobu, w jaki widzenie ludzkie postrzega atrybuty tworzenia kolorów
Oto artykuły wiki dla RGB i HSL . Programy graficzne często wykonują obliczenia w HSL, a później konwertują do preferowanego formatu dla większości ekranów: RGB.
Zadanie polega na napisaniu funkcji / programu, który pobiera HSL jako dane wejściowe i wyjściowe RGB.
Możesz wybrać preferowaną reprezentację dla We / Wy, o ile jest ona spójna między nimi.
Na przykład, mogą być tablicą / krotka z 3 elementów lub obiekt z 3 wymienionych właściwości h
, s
i l
, ale ja przyjąć inne pomysłowe wariacje, jak otrzymaniu HSL jako liczba całkowita (tracąc precyzji) oraz wyprowadzanie rgb całkowitą.
Można założyć, że dane wejściowe są bezpieczne w zakresie i formacie, o których można zdecydować. Zdecydowanie sugeruję albo zakresy, 0-1 0-1 0-1
albo 0-360 0-100 0-100
dla hsl i 0-1 0-1 0-1
lub 0-255 0-255 0-255
dla rgb.
Każda odpowiedź jest wymagana do określenia obu powyższych odpowiedzi i umieszczania różnych odmian w swoich odpowiedziach, jeśli jesteś z nich szczególnie dumny, nawet jeśli nie mają mniej znaków niż inne odmiany. Umieść najmniejszy na wierzchu.
Pseudo-przypadki dla 0-360 0-100 0-100
→0-255 0-255 0-255
h s l → r g b
0 0 0 → 0 0 0
90 56 17 → 43 68 19
202 19 39 → 81 104 118
72 55 26 → 88 103 30
Formuły konwersji można znaleźć tutaj :
To dobry sposób na wizualizację konwersji:
źródło
H
o0-360
to[0,360)
, że będzie lepiej napisany jako0-359
?a-b
notacji samo w sobie jest niewłaściwe w przypadku wartości niecałkowitych, ale powiedziałbym, że lepiej jest zadawać pytanie bardziej czytelnym. Jeśli ktoś jeszcze narzeka, to przemyślę to, więc dziękuję za zwrócenie na to uwagi[0,360)
tego czasu :)Odpowiedzi:
JavaScript (ES6),
989594 bajtówStaje H w [0,360) i S / L na [0,1) . Wyjścia R , G i B jako tablica 3 pływaków w [0,1) .
Przypadki testowe
Ten fragment przekształca wyniki z powrotem w [0,255] .
Pokaż fragment kodu
W jaki sposób?
Kod inicjalizacji
Kod główny
Permutacje (0, C, X)
Nieco trudną częścią jest wygenerowanie prawidłowej permutacji (0, C, X) zgodnie z kątem elementu odcienia. Jak pokazano na poniższym rysunku, każda wartość kolumny jest wybierana z tej samej sekwencji cyklicznej okresu 6 , zaczynając od różnych przesunięć. W powyższym kodzie używamy - ~ H zamiast po prostu + H, ponieważ musimy zmusić H do liczby całkowitej. Stąd przesunięcia (5,3,1) zamiast (0,4,2) .
źródło
H
w[0,6)
i wyprowadzanie w[0,1]
zaoszczędzić trochę bajtów?Mathematica, 155 bajtów
Wypróbuj online!
źródło
Hue
jest, podobnie jak HSB (AKA HSV), a nie HSL (patrz rysunki 2a i 2b na powiązanej stronie Wikipedii).RGBColor
, ale istniejeHSLColor
. > _>Python 2 , 32 bajty
Wypróbuj online!
Ta funkcja jest w rzeczywistości wbudowana w Pythona poprzez
hls_to_rgb
wnętrzecolorsys
biblioteki. Format danych wejściowych kopalni ma zakres 0-1 HLS (zamiast HSL oba są powszechnymi akronimami tego samego [aczkolwiek HSL jest bardziej powszechny]). I wydobywam wartości RGB w krotce o zakresie od 0 do 1.Kredyty
Dziękuję Jonathanowi Allanowi za wskazanie, że muszę go tylko zaimportować (a następnie pomóc mi zmniejszyć liczbę bajtów).
źródło
from colorsys import hls_to_rgb
od tego czasu daje nam funkcję, która może być ponownie użyta. Edytuj - ustaw 21 jakofrom colorsys import*
.import colorsys
dla 15!C ++,
228221 bajtów-7 bajtów dzięki Zacharýowi
Oba argumenty to tablice, które mają minimalny rozmiar 3 elementów (tj.
float hsl[3]
Iint rgb[3]
W porządku. Jak to działa? Co to za długa tablica?
Cóż, to nie jest długa tablica, to
int
tablica. Żartuję, tablica wskazuje, o ile pozycji przesuwamy w prawo CX i 0, gdy chcemy wybrać prawidłową permutację, + 2. Pamiętasz, jak wybierane są R ', G' i B '?Powiedzmy, że mamy „normalną” kolejność {C, X, 0}
Teraz, gdy wybrana jest pierwsza permutacja (tj. {C, X, 0}), nie trzeba przesuwać, co jest dokładnie tym samym, co przesunięcie w prawo o 0. Tak więc pierwsze 3 elementy tablicy to 0,0 i 0
Dla drugiej permutacji ({X, C, 0}) musimy przesunąć w prawo C o 1, a lewe przesunięcie X o -1, więc czwarty, piąty i szósty element tablicy to 1, -1 i 0
I tak dalej...
W przypadku 3. i 4. permutacji muszę przesunąć w lewo 0 na 2, więc przesunięcie w prawo o -2. Ponieważ istnieją więcej niż 2 liczby, które są ujemne, raczej dodam 2 do każdego elementu w tablicy i odejmuję 2 w czasie wykonywania (z powodów golfowych, aby mieć tylko liczby całkowite w tablicy).
źródło
Python 2 ,
119112 bajtówWypróbuj online!
Pobiera dane wejściowe jako
H=[0,6[, S=[0,1], L=[0,1]
źródło
HTML + JavaScript (ES6), 8 + 88 = 96 bajtów
Pobiera dane wejściowe jako kąt i dwa procenty. Oceniam fragment kodu HTML
<p id=p>
i funkcję strzałki JavaScript. Nie wiem, z czego korzystają przeglądarki zaokrąglające, więc moje odpowiedzi mogą się nieco różnić od twoich.źródło
Szybkie 4, 218 bajtów
Akceptuje wartości HSL z zakresu [0,1] jako argumenty i zwraca tablicę zawierającą wartości RGB z tego samego zakresu:
Chodzi o to, aby najpierw przekonwertować dane wejściowe z HSL na HSB, a następnie użyć konstruktora HSB wbudowanego obiektu koloru w kakao, aby pobrać wartości RGB.
Wersja UIKit ma dokładnie taką samą długość, ponieważ jedynymi zamiennikami są:
Cocoa
→UIKit
NSColor
→UIColor
Nie golfowany:
Poniższy fragment kodu mogą być używane do testowania, po prostu zastąpienie wartości
h
,s
orazl
:Niestety nie mogę podać linku do piaskownicy online, ponieważ wszystkie z nich działają w systemie Linux, który nie obejmuje Cocoa.
źródło
GLSL (GL_ES)
160 144 134131 bajtówBarwa mieści się w zakresie 0–6 (zapisuje 3 bajty)
Sat, light i rgb mają wartość 0-1
Wypróbuj na książce shaderów
Użyto narzędzia do pobierania kolorów na ekranie drukowania, aby przetestować wyjście, które było prawidłowe,
z wyjątkiem małego błędu w 202 19 39 → 81 104 118, co dało 80 104 118
źródło
R , 88 bajtów
Wypróbuj online!
Ta funkcja przyjmuje na wejściu wartości H, S i L jako wartości dystansowe 0-1 i wysyła wartości RGB jako wartości dystansowe 0-255. Konwertuje reprezentację HSL na reprezentację HSV, a następnie używa
hsv()
do konwersji reprezentacji HSV na kolor R (tj. Reprezentację szesnastkową - #rrggbb), a następnie używacol2rgb()
do konwersji koloru R na wartości RGB.źródło
Galaretka ,
3932 bajtów-1 dzięki Cairnowi coinheringaahing (
%2
jest po prostuḂ
)-1 i / lub inspiracji dla -4 dzięki Cairnowi coinheringaahing !
Pełny program przyjmujący trzy argumenty wiersza poleceń:
L
,H
,S
W zakresach[0,1)
,[0,6)
i[0,1)
odpowiednioktóra drukuje listę podającą format RGB jako
[R, G, B]
z każdą z trzech wartości w zakresie[0,1]
Uwaga:
H
może również zawijać tak jak[0,360)
by to robił.Wypróbuj online!
W jaki sposób?
źródło