/*
* Laboratorium Grafiki Komputerowej * Pierwszy program wykorzystujący OpenGL'a*/
#include<stdio.h> /* System */
#include<stdlib.h>
#include <GL/freeglut.h> /* 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
{
if(n<0)
{
printf("\nPodales zla liczbe iteracji. Wprowadz jeszcze raz.\n");
}
}while(n<0);
do
{
printf("Dlugosc boku <1,600>(rozmiar okna 600x600): ");
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;
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");
}
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);
}
}