-
- Wstęp
- Klasa pkt3d
- Rzut równoległy
- Rzut perpektywiczny
- Jak rysować bryły
- Widoczność ściany
- Oświetlenie wielościanu
- Wykres funkcji z=f(x,y)
-
|
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.
|