Najlepszym rozwiązaniem, gdy wymagany jest gradient między dwoma kolorami, jest użycie reprezentacji HSV (Wartość nasycenia odcienia).
Jeśli masz wartości HSV dla twoich dwóch kolorów, po prostu dokonujesz interpolacji liniowej dla H, S i V, i masz ładne kolory (interpolacja w przestrzeni RGB zawsze prowadzi do "złych" wyników).
Znajdziesz także here formuły, aby przejść odpowiednio od RGB do HSV i od HSV do RGB.
teraz do problemu z narożach, można dokonać liniową kombinację czterech wartości H/S/V, ważonej przez odległość od E, że cztery punkty A, B, C i D.
EDYTOWANIE: ta sama metoda, co tekBlues, ale w przestrzeni HSV (dość łatwo przetestować ją w przestrzeniach RGB i HSV, a zobaczysz różnice.) W HSV wystarczy obrócić cylinder chromatyczny, i dlatego daje piękny wynik)
Edit2: jeśli wolisz "szybkość i prostotę", można użyć L1-norm, zamiast L2-normy (norma euklidesowa)
Tak więc, jeśli a
ma wielkość kwadratu, a współrzędna punkty są A (0
, 0
), B (0
, a
), C (a
, 0
), D (a
, a
), to barwa punktu E (x
, y
) można obliczyć z:
Hue(E) = (Hue(B)*y/a + Hue(A)*(1-y/a)) * (x/a) + (Hue(D)*y/a + Hue(C)*(1-y/a)) * (1-x/a)
gdzie Hue(A)
jest Hue od punktu A, Hue(B)
odcień B, etc ...
Stosujesz te same formuły dla nasycenia i wartości.
Po ustawieniu barwy/nasycenia/wartości dla punktu E można przekształcić go w przestrzeń RGB.
Mam to działa, dziękuję bardzo. Wygląda całkiem nieźle! –
Powyższa metoda łączenia jest również znana jako "interpolacja dwu liniowa". Wykonujesz to osobno na wartościach H, S i V. –