Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////////////////////////////////////////////////////////////////////////////////////
- //
- // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
- // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
- //
- //////////////////////////////////////////////////////////////////////////////////////////
- #include <glut.h>
- #include <math.h>
- // Definicja stalych
- #define DLUGOSC_BOKU 5.0
- #define OBSERWATOR_ODLEGLOSC 20.0
- #define OBSERWATOR_OBROT_X 20.0
- #define OBSERWATOR_OBROT_Y 20.0
- #define OBSERWATOR_OBROT_Z 0.0
- #define OBSERWATOR_FOV_Y 30.0
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- GLfloat rotObsY = 40.0;
- GLfloat rotObsX = 40.0;
- GLfloat rotObsZ = 0.0;
- int odleglosc = 40, i, j;
- int N = 5;
- int M = 5;
- // Prototypy funkcji
- void RysujSzescian(double a);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
- // Srodek szescianu znajduje się w punkcie (0,0,0).
- void RysujSzescian(double a)
- {
- // Pocztaek tworzenia ukladu wspolrzednych
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(-200.0, 0.0, 0.0);
- glVertex3f(200.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, -200.0, 0.0);
- glVertex3f(0.0, 200.0, 0.0);
- // Os Z
- glColor3f(0.0, 0, 1);
- glVertex3f(0.0, 0.0, -200.0);
- glVertex3f(0.0, 0.0, 200.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();
- /*
- glColor3f(1.0, 1, 1);
- glBegin(GL_TRIANGLE_FAN); // gorna podstawa
- glVertex3f(0,25, 0);
- for(i=0;i*360/N<=360;i++)
- {
- glVertex3f(25*cos((float)(i*360/N)*3.1415926535/180.0),25,25*sin((float)(i*360/N)*3.1415926535/180.0));
- }
- glEnd();
- glColor3f(1, 0, 0);
- glBegin(GL_TRIANGLE_FAN); //dolna podstawa
- glVertex3f(0,0, 0);
- for(i=0;i*360/N<=360;i++)
- {
- glVertex3f(5*cos((float)(i*360/N)*3.1415926535/180.0),0,5*sin((float)(i*360/N)*3.1415926535/180.0));
- }
- glEnd();
- glBegin(GL_TRIANGLES);
- for (i = 0; i*360.0/N <= 360.0; i++)
- {
- glVertex3f(5 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 0, 5 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
- glVertex3f(25 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
- glVertex3f(25 * cos((float)((i+1) * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)((i+1) * 360 / N)*3.1415926535 / 180.0));
- glVertex3f(5 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 0, 5 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
- glVertex3f(5 * cos((float)((i+1) * 360 / N)*3.1415926535 / 180.0), 0, 5 * sin((float)((i+1) * 360 / N)*3.1415926535 / 180.0));
- //glVertex3f(25 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
- glVertex3f(25 * cos((float)((i+1) * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)((i+1) * 360 / N)*3.1415926535 / 180.0));
- }
- glEnd();
- // Sciany boczne
- glBegin(GL_QUAD_STRIP);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, -a/2.0);
- glVertex3f(a/2.0, -a/2.0, -a/2.0);
- glVertex3f(-a/2.0, a/2.0, -a/2.0);
- glVertex3f(-a/2.0, -a/2.0, -a/2.0);
- glVertex3f(-a/2.0, a/2.0, a/2.0);
- glVertex3f(-a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glEnd();
- // Gorna sciana
- glBegin(GL_QUAD_STRIP);
- glVertex3f(-a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(-a/2.0, a/2.0, -a/2.0);
- glVertex3f(a/2.0, a/2.0, -a/2.0);
- glEnd();
- // Dolna sciana
- glBegin(GL_QUAD_STRIP);
- glVertex3f(-a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glVertex3f(-a/2.0, -a/2.0, -a/2.0);
- glVertex3f(a/2.0, -a/2.0, -a/2.0);
- glEnd();
- */
- //16.(X1) ¼ walca w trybie GL_QUAD o promieniu podstawy 3 i jej środku w punkcie (0, 0, 0), wysokości 5
- //GÓRNA PODSTAWA
- /* glColor3f(1.0, 1, 1);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0,25, 0);
- for(i=0;i*360/N<=360;i++)
- {
- glVertex3f(25*cos((float)(i*360/N)*3.1415926535/180.0),25,25*sin((float)(i*360/N)*3.1415926535/180.0));
- }
- glEnd(); */
- //DOLNA PODSTAWA
- /*
- glColor3f(1.0, 1, 1);
- glBegin(GL_QUADS);
- for (i = 0; i * 360 / N < 90; i++)
- {
- glVertex3f(0, 0, 0);
- glVertex3f(0, 0, 0);
- glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
- glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
- }
- glEnd();
- //GORNA PODSTAWA
- glBegin(GL_QUADS);
- for (i = 0; i * 360 / N < 90; i++)
- {
- glVertex3f(0, 5, 0);
- glVertex3f(0, 5, 0);
- glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 5, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
- glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.5), 5, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
- }
- glEnd();
- //POWIERZCHNIA BOCZNA WALCA
- glColor3f(1.0, 1.0, 0.0);
- glBegin(GL_QUADS);
- for (i = 0; i * (360 / N) < (90.0); i++)
- {
- glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
- glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 5, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
- glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0), 5, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
- glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
- }
- glEnd();
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0);
- glVertex3f((3), 0, 0);
- glVertex3f((3), 5, 0);
- glVertex3f(0, 5, 0);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3f(0, 0, 0);
- glVertex3f(0, 0, 3);
- glVertex3f(0, 5, 3);
- glVertex3f(0, 5, 0);
- glEnd();
- */
- //glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.5), 5, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
- double r = 2.0;
- double h = 3.0;
- double hPodzial = h / M ;
- double dAlfa = 90.0 / N;
- glColor3f(1, 0, 1);
- for (int j = 0; j * hPodzial < h; j++) {
- glBegin(GL_QUADS);
- for (int i = 0; i * dAlfa <= 90.0; i++) {
- if (j % 2 == 0)glColor3f(1, 0, 1);
- else glColor3f(0, 1, 0);
- if (i * dAlfa != 90.0) {
- glVertex3f(r * cos(DEG2RAD(i * dAlfa)), (j + 1) * hPodzial, r * sin(DEG2RAD(i * dAlfa)));
- glVertex3f(r * cos(DEG2RAD(i * dAlfa)), j * hPodzial, r * sin(DEG2RAD(i * dAlfa)));
- glVertex3f(r * cos(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)), j * hPodzial, r * sin(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)));
- glVertex3f(r * cos(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)), (j + 1) * hPodzial, r * sin(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)));
- }
- if (i * dAlfa == 90) {
- glVertex3f(0, j * hPodzial, 2);
- glVertex3f(0, (j + 1) * hPodzial, 2);
- glVertex3f(0, (j + 1) * hPodzial, 0);
- glVertex3f(0, j * hPodzial, 0);
- glVertex3f(0, j * hPodzial, 0);
- glVertex3f(0, (j + 1) * hPodzial, 0);
- glVertex3f(2, (j + 1) * hPodzial, 0);
- glVertex3f(2, j * hPodzial, 0);
- }
- }
- glEnd();
- }
- glColor3f(0, 0, 1);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, 0, 0);
- for (int i = 0; i * dAlfa <= 90.0; i++) {
- glVertex3f(r * cos(DEG2RAD(i * dAlfa)), 0, r * sin(DEG2RAD(i * dAlfa)));
- }
- glEnd();
- glColor3f(1, 0, 0);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, h, 0);
- for (int i = 0; i * dAlfa <= 90.0; i++) {
- glVertex3f(r * cos(DEG2RAD(i * dAlfa)), h, r * sin(DEG2RAD(i * dAlfa)));
- }
- glEnd();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
- // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
- void UstawParametryWidoku(int szer, int wys)
- {
- // Zapamietanie wielkosci widoku
- szerokoscOkna = szer;
- wysokoscOkna = wys;
- // Ustawienie parametrow viewportu
- glViewport(0, 0, szerokoscOkna, wysokoscOkna);
- // Przejscie w tryb modyfikacji macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja wyswietlajaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- // Wyczyszczenie bufora koloru i bufora glebokosci
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
- glMatrixMode(GL_MODELVIEW);
- // Zastapienie aktywnej macierzy macierza jednostkowa
- glLoadIdentity();
- // Ustalenie polozenia obserwatora
- glTranslatef(0, 0, -odleglosc);
- glRotatef(rotObsX, 1, 0, 0);
- glRotatef(rotObsY, 0, 1, 0);
- glRotatef(rotObsZ, 0, 0, 1);
- // Narysowanie szescianu
- RysujSzescian(bok);
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- // Funkcja klawiszy specjalnych
- void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
- {
- switch (klawisz)
- {
- case GLUT_KEY_UP:
- rotObsX = rotObsX + 1.0;
- break;
- case GLUT_KEY_DOWN:
- rotObsX = rotObsX - 1.0;
- break;
- case GLUT_KEY_LEFT:
- rotObsY = rotObsY - 1.0;
- break;
- case GLUT_KEY_RIGHT:
- rotObsY = rotObsY + 1.0;
- break;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {/*
- if(klawisz == '+')
- bok *= 1.1;
- else if (klawisz == '-')
- bok /= 1.1;
- else if (klawisz == 27)
- exit(0); */
- switch (klawisz)
- {
- case 'X':
- rotObsX = rotObsX + 1.0;
- break;
- case 'x':
- rotObsX = rotObsX - 1.0;
- break;
- case 'y':
- rotObsY = rotObsY - 1.0;
- break;
- case 'Y':
- rotObsY = rotObsY + 1.0;
- break;
- case 'z':
- rotObsZ = rotObsZ - 1.0;
- break;
- case 'Z':
- rotObsZ = rotObsZ + 1.0;
- break;
- case '-':
- odleglosc = (odleglosc < 200) ? odleglosc + 1 : odleglosc;
- break;
- case '+':
- odleglosc = (odleglosc > 20) ? odleglosc - 1 : odleglosc;
- break;
- case 'M':
- N = (N < 64) ? N + 1 : N;
- break;
- case 'P':
- N = (N > 4) ? N - 1 : N;
- break;
- case 'm':
- M = (M < 64) ? M + 1 : M;
- break;
- case 'p':
- M = (M > 4) ? M - 1 : M;
- break;
- if (klawisz == 27)
- exit(0);
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Glowna funkcja programu
- int main(int argc, char** argv)
- {
- // Zainicjowanie biblioteki GLUT
- glutInit(&argc, argv);
- // Ustawienie trybu wyswietlania
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- // Ustawienie polozenia dolenego lewego rogu okna
- glutInitWindowPosition(100, 100);
- // Ustawienie rozmiarow okna
- glutInitWindowSize(szerokoscOkna, wysokoscOkna);
- // Utworzenie okna
- glutCreateWindow("Szescian");
- // Odblokowanie bufora glebokosci
- glEnable(GL_DEPTH_TEST);
- // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
- glClearDepth(1000.0);
- // Ustawienie koloru czyszczenia bufora ramki
- glClearColor(0.0f, 0.0f, 0.3f, 0.0f);
- // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- // Zarejestrowanie funkcji (callback) odpowiedzialnej za
- glutDisplayFunc(WyswietlObraz);
- // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
- // zmieniane sa rozmiary okna
- glutReshapeFunc(UstawParametryWidoku);
- // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
- // zadnych zadan
- glutIdleFunc(WyswietlObraz);
- // Zarejestrowanie funkcji obslugi klawiatury
- glutKeyboardFunc(ObslugaKlawiatury);
- // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
- // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
- glutMainLoop();
- // Zarejestrowanie funkcji obslugi klawiszy specjalnych
- glutSpecialFunc(ObslugaKlawiszySpecjalnych);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement