Programowanie gradientów

Z Wikipedii:
Gradient - rozwiązanie stosowane w grafice komputerowej polegające na wypełnieniu określonego obszaru płynnym przejściem tonalnym pomiędzy co najmniej dwoma kolorami. Kształt tego wypełnienia może być rozmaity - począwszy od prostego równomiernego przejścia pomiędzy przeciwnymi bokami prostokąta, a skończywszy na przejściu wzdłuż linii krzywej, rozchodzeniu się promienistym itp.

W aplecie po lewej stronie mamy przykład gradientów. Przykład (1), (2), (3) pokazuje przejście dla kolorów podstawowych (R, G i B) od koloru czarnego np do czerwonego (dla 1).

Aby uzyskać taki efekt rozpatrzymy każdą składową koloru oddzielnie.
Np dla (1), będziemy zmieniali tylko sładową R w zakresie 0-255 na długości dl tzn wg wzoru:

for(int i=0;i<dl;i++) 
{
 g.setColor(new Color( i * 255 / dl,0 ,0));
 g.drawLine(113+i,15,113+i,45);
} 
Dla gradientu (2) odpowiedni wzór zmodyfikujemy:

g.setColor(new Color(0, i * 255 / dl, 0 ) );

Gradienty oznaczone (4), (5) i (6) to mieszanie składowych :
(4)=(1+2), (5)=(2+3) zaś (6)=(1+2+3).
Dla przykładu gradient (4) :

g.setColor(new Color(i*255/dl , i*255/dl , 0));

Rozpatrzymy teraz gradientowe przejście pomiędzy dwoma dowolnymi kolorami, tak jak pokazano na przykładzie poniżej:

Zadanie:
Uzyskać płynne przejście z koloru K1 do koloru K2, w dl krokach.
Zadanie rozwiążemy interpolując różnicę K2-K1 poszczególnych składowych RGB. Oto algorym :

1° rozłożymy każdy z kolorów na skladowe:
2° obliczyć wielkość kroku
3° wyznaczyć składowe koloru przejścia
składowe koloru uzyskujemy na dwa sposoby (zakładam, że kolory nie są podane w postaci 0xrrggbb):

np:
K1.r=K1>>16 ( o ile kolor podany jest liczbą) lub K1.r=K1.getRed() to dla Javy, gdzie kolory są obiektami
Wielkość kroku dla każdej składowej obliczamy oddzielnie np (K2.r-K1.r) / dl

A teraz algorytm w akcji:
void rysuj(Graphics gg,Color K1,Color K2) 
{int K1_r,K1_g,K1_b,K2_r,K2_g,K2_b,r,g,b;

  K1_r=K1.getRed();    K2_r=K2.getRed(); 
  K1_g=K1.getGreen();  K2_g=K2.getGreen(); 
  K1_b=K1.getBlue();   K2_b=K2.getBlue(); 

  for(int i=0;i<=dl;i++) 
   {
    r=K1_r+i*(K2_r-K1_r)/dl; 
    g=K1_g+i*(K2_g-K1_g)/dl; 
    b=K1_b+i*(K2_b-K1_b)/dl; 
    gg.setColor(new Color(r,g,b)); 
    gg.drawLine(2+i,5,2+i,35);
   }
} 

Rysuj przejścia od koloru K1 do koloru K2


Wyznacz składowe RGB kolorów K1 i K2





Interpoluj składowe RGB koloru przejścia


Wyznacz kolor przejścia





Inny ciekawy artykuł na ten temat Znajdziesz tu....