Reprezentacja bryły
Janusz Sobieraj - 28 LO

Jak reprezentować wielościan ?

W przypadku pojedyńczego wielościanu wypukłego (u nas graniastosłup prawidłowy) pełną wiedzę o bryle daje reprezantacja wierzchołkowo-krawędziowa.
Już same wierzchołki pozwalają od biedy narysować wszystkie krawędzie oraz wykonać proste oświetlenie bryły.
Zaś pełna reprezantacja pozwala dodatkowo rysować bryłę, pomijając krawędzie niewidoczne.

Ważne jest by odpowiednio ponumerować wierzchołki i krawędzie ! Odpowiednio tzn zachowując naturalny porządek (odwrotnie do ruchu wskazówek zegara - rys), który można wykorzystać podczas realizacji algorytmu rysowania, oceny widoczności czy też oświetlenia.

Wierzchołki (kolor zielony) podstawy dolnej numerujemy liczbami 0..(n-1). Wierzchołki podstwy górnej zaś liczbami: n..(2n-1).

Krawędzie (kolor żółty) podstawy dolnej numerujemy liczbami 0..(n-1).
Krawędzie podstwy górnej zaś liczbami: n..(2n-1).
Krawędzie boczne numerujemy liczbami: 2n..(3n-1).

Zadanie: Rysujemy
graniastosłup prawidłowy: o wysokości h, podstawa n-kąt foremny wpisany w koło o promieniu r .


Rysujemy wszystkie krawędzie bez względu na ich widoczność.

   Wystarczy wtedy w tablicy pkt3d w[] zgromadzić współrzędne wierzchołków.

void wierzcholki(int n,double r,double h) 
{double fi=2*Math.PI/n; 

  for(int i = 0; i <= n-1; i++) 
  { 
   w[i].war(r*Math.cos(i*fi),r*Math.sin(i*fi),-h/2); 
   w[i+n].war(w[i].x,w[i].y,h/2); 
  } 
}
void rysuj(Graphics g) 
{
 for(int i=0;i<n;i++) 
 {
   //p.dolna
  _3d.linia(g,w[i],w[(i+1)%n]);
     //p.górna
  _3d.linia(g,w[i+n],w[n+(i+1)%n]);
     //kr.boczne
  _3d.linia(g,w[i],w[i+n]);
 }
}

Rysujemy tylko krawędzie widocznoczne.

void krawedzie(int n) 
{ 
 for(int i=0;i<=n-1;i++) 
 { 
   // kr.podstawy dolnej
  l1[i]=i; 
  l2[i]=(i+1) % n; 
   // kr.podstawy górnej
  l1[n+i]=n+i; 
  l2[n+i]=n+(i+1) % n; 
    // kr.boczne
  l1[2*n+i]=i; 
  l2[2*n+i]=n+i; 
 } 
} 
void rysuj(Graphics g,int n) 
{ int k=3*n-1; 
 for(int i = 0; i <= k; i++) 
  if (l[i]) 
   _3d.linia(g,w[l1[i]],w[l2[i]]); 
} 
Wtedy potrzebujemy więcej informacji.
W tablicach:
boolean l[] notujemy widoczność.
int l1[], l2[] numery wierzchołków:
początek i koniec krawędzli l.

Pozostaje jeszcze problem oceny widoczności krawędzi.
Ale o tym w jednym z następnych rozdziałów.