Widoczność ściany
Na rysunku obok pokazano jak roztrzygnięto widoczność ściany.
W dowolnym wierzchołku ściany wystawiamy dwa wektory: normalny (prostopadły do ściany) i wektor kierunku rzutowania (nazwijmy go umownie wektorem obserwacji).
Ściana A1B1C1D1 jest widoczna ponieważ <(k,N)<90°
Ściana AA1D1D - niewidoczna ponieważ <(k,N1)>90°
Krawędzie bryły ocenimy tak:
|
Wróćmy do ściany A1B1C1D1, jest widoczna ponieważ <(k,N)<90°. Oznacza to, że iloczyn skalarny wektorów k i N jest dodatni :
koN=|k|·|N|·cos<(k,N) >0 |
Dla ściany AA1D1D analogiczny iloczyn jest ujemny.
Wektor prostopadły do ściany obliczymy ze wzoru na iloczyn wektorowy A i B (wektory A i B należą do ściany)
A x B = [ay*bz - by*az, bx*az - ax*bz, ax*by - bx*ay] |
Dla oceny widoczności ściany zdefiniujemy następującą funkcję:
boolean Widoczna(int i,int j,int m) |
{ pkt3d p,q,N,K; double a,b,c,iloczyn; p=new pkt3d(0,0,0);q=new pkt3d(0,0,0); N=new pkt3d(0,0,0); K=new pkt3d(pkt3d.obs.x,pkt3d.obs.y,pkt3d.obs.z); p.x=w[i].x-w[j].x; q.x=w[m].x-w[j].x; p.y=w[i].y-w[j].y; q.y=w[m].y-w[j].y; p.z=w[i].z-w[j].z; q.z=w[m].z-w[j].z; N.x=p.y*q.z-p.z*q.y; N.y=p.x*q.z-p.z*q.x; N.z=p.x*q.y-p.y*q.x; iloczyn=N.x*K.x+N.y*K.y+N.z*K.z; return(iloczyn<0); } |
Jak łatwo zauważyć, funkcja ocenia "widoczna" jeśli wspomniany iloczyn skalarny jest ujemny. Co oznacza, że wektor normalny ściany jest wystawiany "do wnętrza" bryły - sama idea oceny pozostaje bez zmian.