Oświetlenie bryły
Janusz Sobieraj - 28 LO

Jak rysować graniastosłup oświetlony - kompletny przykład

Wykorzystamy narzędzia z poprzedniego rozdziału. Potrzebujemy jeszcze ustalić "jasność oświetlenia" - będzie to liczba kolor całkowita z przedziału (0,90). Zasada będzie taka - im większy kąt kierunku rzutowania, tym jaśniejsze światło. Oto poprawny wzór:

(int)Math.toDegrees(Math.acos(cos(k,N)))
Otrzymaną warość należy jeszcze zweryfikować do wartości <90, ponieważ funkcja Math.acos zwraca wartośc z przedziału <0,π>.

W aplecie obok zastosowałem prostą aproksymację:

kolor=(int)(90·cos(k,N))

Przypomnę, funkcja widoczna liczy iloczyn skalarny wektorów: normalnego i kierunku. Funkcję cosinus możemy obliczyć:



Ponieważ w Javie nie ma wskaźników, funkcja widoczna zwraca tylko jedną wartość.
boolean  widoczna(int i,int j,int k) 
{ 
  pkt3d p,q,N; 
  double iloczyn,i_dl;

  p=new pkt3d(w[i].x-w[j].x , w[i].y-w[j].y , w[i].z-w[j].z); 
  q=new pkt3d(w[k].x-w[j].x , w[k].y-w[j].y , w[k].z-w[j].z); 

  N=new pkt3d(p.y*q.z-p.z*q.y , p.x*q.z-p.z*q.x , p.x*q.y-p.y*q.x); 
  i_dl=mat.dl3(N)*mat.dl3(_3d.obs); 
  iloczyn=N.x*_3d.obs.x+N.y*_3d.obs.y+N.z*_3d.obs.z; 
  kolor=(int)(90d*Math.abs(iloczyn)/i_dl); 

  return(iloczyn<0); 
}

Informację o kolorze możemy przekazać albo przez nazwę funkcji, lub jak w naszym rozwiązaniu, przez zmienną globalną kolor.