W tym wpisie zajmę się grafiką komputerową generowaną dzięki API OpenGL. OpenGL, to cytując wikipedię: „Zestaw funkcji składa się z 250 podstawowych wywołań, umożliwiających budowanie złożonych trójwymiarowych scen z podstawowych figur geometrycznych”.  Przedstawie tu dwie animacje trójwymiarowe: dywan i trójkąt Sierpińskiego.


Dywan Sierpińskiego jest to rysunek przedstawiający widok na osiach współrzędnych podzielony na dziewięć równych kwadratów, gdzie część środkowy z nich jest pusty (reszta zamalowana). Następnie rekurencyjnie dokonuje się takiego podziału na kolejne dziewięć, mniejszych kwadratów w każdym z poprzednich wydzielonych czworokątów. Wykonujemy ten krok tak długo ile mamy ustalonych iteracji. Analogicznie trójkąt Sierpińskiego to grafika, w której główny trójkąt podzielony jest na cztery wewnętrzne a środkowy jest pusty. Również on jest dzielony rekurencyjnie w podobny sposób jak kwadrat. Efektem są całkiem interesujące graficzne animacje.


Założenia mojego programu są takie, że używam 4 niezależnych zmiennych (x1,x2,y1,y2) do rysowania fraktala GL_POLYGON. W rzeczywistości jest to po prostu kwadrat. Aby ułatwić sobie pracę, przesunąłem widok tak, aby wszelkie operacji geometryczne były wykonywane w pierwszej ćwiartce. Ułatwiło mi to orientację i wyznaczanie kolejnych kwadratów. Nie miało to jednak znaczenia dla algorytmu.


    Następnie wydzieliłem sobie dwie funkcje: rysujKwadrat oraz Sierpiński. Pierwsza z nim jak sama nazwa wskazuje rysuje kwadrat oraz koloruje w losowy sposób. Zmienna długość, to po prostu miara boku kwadratu. W kolejnej funkcji    rekurencyjnie wywołuje funkcje Sierpiński aby rysować jak najwięcej kwadratów (zgodnie z algorytmem). W ciele funkcji znajduje się 8 kwadratów z widoku na którym pracuje obecnie program.


    Na sam koniec funkcję Sierpiński wywołuję w funkcji RenderScene, wpisane w nią liczby oznaczają budowę kwadratu gdzie jeden punkt po przekątnej kwadratu jest na przecięciu osi x,y (punkt 0) a drugi w punkcie 200,200. Ostatnia wartość to ustalany stopień zaawansowania rysowanego ‘dywanu’.


Poniżej przykładowa funkcja rysująca dywan:


void sierpinski(float x1, float y1, float x2, float y2, int poziom)
{
    float bok = (x2-x1)/3.0f;
   
    if(poziom > 0)
    {
        rysujKwadrat(x1, y1, x2, y2);
        // rozpoczynam rysowac od kwadratu znajdujacego sie najblizej osi x,y.
        // dalej przesuwam sie w prawo po okregu
        sierpinski(x1, y1, x2-(2*bok), y2-(2*bok), poziom-1);   
        sierpinski(x1, y1+bok, x2-(2*bok), y2-bok, poziom-1);
        sierpinski(x1, y1+(2*bok), x2-(2*bok), y2, poziom-1);
       
        sierpinski(x1+bok, y1+(2*bok), x2-bok, y2, poziom-1);
       
        sierpinski(x1+(2*bok), y1+(2*bok), x2, y2, poziom-1);
        sierpinski(x1+(2*bok), y1+bok, x2, y2-bok, poziom-1);
        sierpinski(x1+(2*bok), y1, x2, y2-(2*bok), poziom-1);

        sierpinski(x1+bok, y1, x2-bok, y2-(2*bok), poziom-1);
       
   
    }
}

 

Dywan i trójkąt Sierpińskiego (VS 2010)

blog comments powered by Disqus