Oświetlenie
Janusz Sobieraj - 28 LO

Oświetlenie wielościanu - niezbędne narzędzia

Oświetlenie bryły (jego ścian) wyrażę poprzez odpowiedni kolor. Ściany zwykle są "bardziej" i "mniej" oświetlone - tę cechę wyrazimy poprzez rozjaśnianie / ściemnienie koloru.
Posłużę się gradientem, który dostosuję do naszych potrzeb.

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 rozpatrzę 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:
g.setColor(new Color(i*255/dl,0,0))

void  paleta_zl() 
{ 
 float pr=154f/255f,dr=(254f-154f)/255f; 
 float pg=122f/255f,dg=(252f-122f)/255f; 
 float pb=40f/255f,db=40f/255f; 
 for(int i=0;i<91;i++) 
  paleta[i]=new Color(pr+i*dr/91f ,pg+i*dg/91f ,pb+i*db/91f); 
}


Natężenie oświetlenia ściany uzależnię od "kąta padania" promieni światła
(w zakresie 0°-90°). Dlatego utworzę gradient długości 90, a jego wartości zgromadzę w tablicy paleta[].
Obok procedura generująca 90 odcieni "światła złotego" (4). Jak łatwo zauważyć jest to wybrane "górne" pasmo tego światła.

Point W(int nr) 
{ int x=lo28.cal_x(rz.x);
  int y=lo28.cal_y(rz.y);
  pkt2d rz=_3d.rzut(w[nr]); 
  Point p=new Point(x ,y); 

  return(p); 
} 
//--------zamaluj ścianę boczną-----------------
void  Filuj4(Graphics g,int i,int j,int k,int m) 
{Point[] u= W(i),W(j),W(k),W(m)}; 
 int[] fx={u[0].x,u[1].x,u[2].x,u[3].x}, 
       fy={u[0].y,u[1].y,u[2].y,u[3].y}; 

  g.setColor(paleta[kolor]); 
  g.fillPolygon( fx , fy , 4); 
} 
//-----zamaluju podstawę------------------------
void  FilujP(Graphics g,int kt) 
{ 
  Point fig []=new Point[ile]; 
  int[ ] fx=new int[ile]; 
  int[ ] fy=new int[ile]; 
  int i,j; 

  j=-1; 
  for(i=kt;i<kt+ile;i++) 
  { 
    j++; 
    fig[j]=W(i); 
    fx[j]=fig[j].x; 
    fy[j]=fig[j].y; 
  } 
  g.setColor(paleta[kolor]); 
  g.fillPolygon( fx , fy , ile); 
}

Uzyskany gradient praktycznie wykorzystamy poprzez metodę klasy Graphics
fillPolygon(int[] x,int[] y,int n).
Oznacza to dla nas przeliczenie "naszych" danych typu pkt3d (wierzchołki) na dane typu int[] (2 tablice).
W klasie _3d mamy odpowiednie metody.
Potrzebujemy "zamalować" 4-kąt (ściana boczna) / n-kąt (podstawy).

Obok komplet tych narzędzi.