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:

  1. założymy, że wszystkie są niewidoczne
  2. dokonamy przeglądu wszystkich ścian
  3. jeśli ściana jest widoczna wszystkie jej krawędzie uznamy za widoczne

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.