Rekurencja

w opracowaniu klasy E '91

Zagnieżdżenie wielokątów foremnych

Grzegorz Bajkowski

Rezultat

Jest to aplet przedstawiający zagnieżdżające się w sobie wielokąty foremne. Można ustawiać w nim ilość zagęszczeń st i wielokąt jakim chcemy operować a. W pracy użyta jest animacje, lecz nie bedę tłumaczył jej działania, gdyż jest to dodatek niezwiązany z tematem.

Okrag o środku O jest opisany na wielokącie. Każdy kolejny kąt ∠AOB, ∠AOB, ∠AOB... itd. są sobie równe. Ich miarę określa wzór: 360º/(ilość wierzchołków)

Rysowanie figury foremnej polega na zrobieniu pętli mającej tyle powtórzeń co ilość wierzchołków tego wielokąta. Obliczanie położenia wierzchołków jest opisane wzorem (przykładowo):
B(x,y)=(r·cos(∠AOB),r·sin(∠AOB))
C(x,y)=(r·cos(∠AOC),r·sin(∠AOC))

void foremny(Graphics g,double r,double gi) 
{
  int i; 
  pkt2d w=new pkt2d(0,0); 

  w.war(r*Math.cos(gi),r*Math.sin(gi)); 
  lo28.kursor(g,w); 
  for(i=1;i<=ile;i++) 
  {
    w.war(r*Math.cos(i*fi+gi),r*Math.sin(i*fi+gi)); 
    lo28.kreska(g,w);	
    lo28.kropka(g,w,Color.white);
  }
}

Funkcja foremny() przedstawia pętle tworzącą wielokąt foremny. Zmienna i wyznacza, który wierzchołek liczymy, dlatego to wlaśnie ona zostala użyta jako rosnąca zmienna w tej pętli, ponieważ dzieki temu możemy poprowadzic miedzy punkami linie.

Zmienna r wyznacza w jaki okrąg będzie wpisana nasza figura, natomiast gi jest wartościa kąta o jaki przechyli się wielokąt.

Kolejną trudnością w tym aplecie, było znalezienie promienia nowego wielokąta foremnego.

Miarę nowego promienia x obliczę korzystając z twierdzenia sinusów, lecz zanim to zrobię, muszę obliczyć kąt leżący na przeciwko boku r (nazwijmy go β).

β= 180º-α-0.5·(180º-φ),
gdzie φ= 360º/(liczba wierzchołków)

Mając już wszystkie potrzebne dane, możemy skorzystać z tw. sinusów:
x=r·sin(0.5·(180º-φ))/sin(β)
W ten sposób otrzymujemy nowy promień.

 
void rekurencja(Graphics g,double r,double gi,int st) 
{
  double a; 
  double alfa; 
  if(st>0) 
  {
    alfa=Math.PI-bi-0.5*(Math.PI-fi); 
    a=(r*Math.sin((Math.PI-fi)/2))/Math.sin(alfa); 

    foremny(kontekst,a,gi); 
    rekurencja(kontekst,a,gi+bi,st-1);
  }
}

Zadanie kończy krótka rekurencja, która zwiększa początkowy kąt gi o jego wartość bi (bi=gi na samym poczatku, bi stałe (nasza α)).