/* * Laboratorium Grafiki Komputerowej * Pierwszy program wykorzystujący OpenGL'a*/ #include /* System */ #include #include /* Biblioteka GLUT */ void DrawScene(void); /* Funkcja do rysowania *//* Funkcja do rysowania */ void InitOpenGL(void); /* Funkcja do inicjacji OpenGLa */ void ReshapeWindow(int width, int height); /* Funkcja wywoływana w momentach zmiany rozmiarów okna */ void Kwadrat(GLfloat,GLfloat,GLfloat, int); int mainWindow; /* Globalny identyfikator głównego okna programu */ int n; GLfloat bok; GLfloat wierzcholek0; /* Funkcja main */ int main(int argc, char **argv) { glutInit(&argc, argv); // Inicjujemy bibliotekę GLUT glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // Inicjujemy: format koloru, jeden bufor ramki glutInitWindowSize(500, 500); // Ustawiamy początkowe wymiary okna glutInitWindowPosition(0,0); // Ustawiamy pozycję okna - lewy górny naroznik do { printf("Ilosc Iteracji (n>=0): ");scanf("%d",&n); if(n<0) { printf("\nPodales zla liczbe iteracji. Wprowadz jeszcze raz.\n"); } }while(n<0); do { printf("Dlugosc boku <1,600>(rozmiar okna 600x600): "); scanf("%f",&bok); if(n<1) { printf("\nZla wartosc. Wprowadz jeszcze raz.\n"); } }while(bok<=0); printf("\nIlosc iteracji bedzie wynosila: %d",n); printf("\nDlugość boku: %f\n",bok); bok/=3; wierzcholek0=(-1*bok)/2; system("pause"); mainWindow = glutCreateWindow("DYWAN SIERPINSKIEGO_V7"); // Tworzymy główne okno programu TYTUŁ if(mainWindow == 0) // Sprawdzamy powodzenie operacji { puts("Nie mozna stworzyc okna!!!\nWyjscie z programu.\n"); exit(-1); } glutSetWindow(mainWindow); // Czynimy aktywnym okno główne programu glutDisplayFunc(DrawScene); // Tutaj rejestrujemy funkcje narzędziowe - tzw. callbacks glutReshapeFunc(ReshapeWindow); // Tutaj rejestrujemy funkcje narzędziowe - tzw. callbacks InitOpenGL(); // ustawienia początkowe glutMainLoop(); // Wejście do pętli programu return(0); } /* Ta funkcja służy do wstępnej konfiguracji OpenGLa. * Zanim coś narysujemy musimy wywołać tę funkcję. */ void InitOpenGL(void) { glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// Usawiamy domyślny, czarny kolor tła okna - bufor ramki malujemy na czarno } /* Tę funkcję wywołuje system w momencie gdy uytkownik zmieni myszą * rozmiar głownego okna. jej zadaniem jest zachowanie propocji wymiarów * rysowanych obiektów niezależnie od wymiarów okna. */ void ReshapeWindow(int width, int height) { int aspectRatio; // = width / height if(height == 0) // Na wypadek dzielenia przez 0 { height = 1; } aspectRatio = width / height; // Wyliczamy współczynnik proporcji glViewport(0, 0, width, height); // Ustawiamy wielkości okna okna urządzenia w zakresie // od 0,0 do wysokość, szerokość glMatrixMode(GL_PROJECTION); // Ustawiamy układ współrzędnych obserwatora glLoadIdentity(); // Resetujemy macierz projkecji if(width <= height) // Korekta { glOrtho(-100.0, 100.0, -100.0/aspectRatio, 100.0/aspectRatio, 1.0, -1.0); } else { glOrtho(-100.0*aspectRatio, 100.0*aspectRatio, -100.0, 100.0, 1.0, -1.0); } glMatrixMode(GL_MODELVIEW);// Ustawiamy macierz modelu glLoadIdentity();// Resetujemy macierz modelu } /* W tej funkcji określamy to co ma byc narysowane na ekranie.* Jest wywoływana zawsze wtedy, gdy trzeba przerysować ekran - bufor ramki.*/ void DrawScene(void) { glClear(GL_COLOR_BUFFER_BIT); // Czyścimy okno aktualnym (domyślnym) kolorem Kwadrat(wierzcholek0,wierzcholek0,bok, 1); glFlush(); // Komenda wykonania poleceń rysujących } void Kwadrat(GLfloat x1,GLfloat y1,GLfloat dl,int iter) { if(iter>n) { GLfloat x2 = x1+dl; GLfloat y2 = y1+dl; glBegin(GL_POLYGON); // Tworzenie prymitywów graficznych zawsze ograniczamy funkcjami glBegin i glEnd glColor3ub( 150, 255, 100);// Ustawiamy bieżący kolor rysowania na zielony glVertex2f(x1, y1); // Dwa końce pierwszego odcinka glVertex2f(x2,y1);//wierzchołek glVertex2f(x2, y2); glVertex2f(x1,y2);//wierzchołek glEnd(); } else { dl/=3; iter++; Kwadrat(x1, y1, dl,iter); Kwadrat(x1+dl, y1, dl,iter); Kwadrat(x1+2*dl, y1, dl,iter); Kwadrat(x1, y1+dl, dl,iter); Kwadrat(x1+2*dl, y1+dl, dl,iter); Kwadrat(x1, y1+2*dl, dl,iter); Kwadrat(x1+dl, y1+2*dl, dl,iter); Kwadrat(x1+2*dl, y1+2*dl, dl,iter); } }