Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- GK_07_KPP.CPP
- #include <iostream>
- #define GLUT_DISABLE_ATEXIT_HACK
- #include "GL/glut.h"
- using namespace std;
- GLfloat glfActualAngle;
- GLfloat glfDelta;
- GLfloat tt, uu, vv;
- bool bTryb;
- GLfloat ptab[4][3]; //tablica PUNKCIOROW
- GLfloat ptab2[4][3]; //tablica PUNKCIOROW 2
- // Drawing (display) routine.
- void drawScene(void)
- {
- // Clear screen to background color.
- glClear(GL_COLOR_BUFFER_BIT);
- if (bTryb) {
- // ToDo - Ustawienie punktow kontrolnych krzywej Beziera(typ GLfloat)
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glDisable(GL_LIGHTING);
- glLoadIdentity();
- glRotatef(glfActualAngle, 0.0f, 1.0f, 1.0f);
- // TODO - rysowanie punktow kontrolnych
- glPointSize(5.0);
- /* należy wywolac funkcje, ktora definiuje wierzcholek w trzech wymiarach
- glVertex3f(GLfloat x, GLfloat y, GLfloat z)
- */
- //PUNKCIORY 1
- ptab[0][0] = -4; ptab[0][1] = -4; ptab[0][2] = 0;
- ptab[1][0] = 8; ptab[1][1] = 8; ptab[1][2] = 0;
- ptab[2][0] = -8; ptab[2][1] = 8; ptab[2][2] = 0;
- ptab[3][0] = 4; ptab[3][1] = -4; ptab[3][2] = 0;
- //PUNKCIORY 2
- ptab2[0][0] = 4; ptab2[0][1] = -4; ptab2[0][2] = 0;
- ptab2[1][0] = 16; ptab2[1][1] = -16; ptab2[1][2] = 0;
- ptab2[2][0] = 16; ptab2[2][1] = 0; ptab2[2][2] = 0;
- ptab2[3][0] = 4; ptab2[3][1] = -12; ptab2[3][2] = 0;
- //RYSOWANIE PUNKCIOROW 1
- glColor3f(0.0, 0.0, 1.0);
- glBegin(GL_POINTS);
- for(int i =0; i < 4; ++i)
- glVertex3f(ptab[i][0], ptab[i][1], ptab[i][2]);
- glEnd();
- //RYSOWANIE PUNKCIOROW 2
- glColor3f(1.0, 1.0, 0.0);
- glBegin(GL_POINTS);
- for(int i =0; i < 4; ++i)
- glVertex3f(ptab[i][0], ptab[i][1], ptab[i][2]);
- glEnd();
- glPointSize(1.0);
- glColor3f(1.0, 0.0, 0.0);
- glBegin(GL_LINE_STRIP);
- // TODO - rysowanie krzywej
- /*
- - krzywą można narysowac laczyc punkty liniami -
- glBegin(GL_LINE_STRIP) i po wyznaczeniu punktu wywolac
- glVertex3f(GLfloat x, GLfloat y, GLfloat z)
- kazdy nastepny podany wierzcholek okresla punkt do ktorego przedluzana jest linia
- */
- for(double i =0; i <= 1.01; i += 0.01)
- {
- glVertex3f(pow(1-i, 3)*ptab[0][0] + 3.0*i*pow(1-i, 2)*ptab[1][0] + 3.0*pow(i, 2)*(1-i)*ptab[2][0] + pow(i, 3)*ptab[3][0],
- pow(1-i, 3)*ptab[0][1] + 3.0*i*pow(1-i, 2)*ptab[1][1] + 3.0*pow(i, 2)*(1-i)*ptab[2][1] + pow(i, 3)*ptab[3][1],
- pow(1-i, 3)*ptab[0][2] + 3.0*i*pow(1-i, 2)*ptab[1][2] + 3.0*pow(i, 2)*(1-i)*ptab[2][2] + pow(i, 3)*ptab[3][2]);
- }
- for(double i =0; i <= 1.01; i += 0.01)
- {
- glVertex3f(pow(1-i, 3)*ptab2[0][0] + 3.0*i*pow(1-i, 2)*ptab2[1][0] + 3.0*pow(i, 2)*(1-i)*ptab2[2][0] + pow(i, 3)*ptab2[3][0],
- pow(1-i, 3)*ptab2[0][1] + 3.0*i*pow(1-i, 2)*ptab2[1][1] + 3.0*pow(i, 2)*(1-i)*ptab2[2][1] + pow(i, 3)*ptab2[3][1],
- pow(1-i, 3)*ptab2[0][2] + 3.0*i*pow(1-i, 2)*ptab2[1][2] + 3.0*pow(i, 2)*(1-i)*ptab2[2][2] + pow(i, 3)*ptab2[3][2]);
- }
- glEnd();
- //Animacja punktu na krzywej. Nalezy wyznaczyc wspolrzedne punktu na krzywej za pomoca algorytmu
- //deCasteliau
- glPointSize(5.0);
- glColor3f(0.0, 1.0, 0.0);
- //TODO - Wyznaczenie i narysowanie zielonego punktu dla parametru tt
- static bool drugi = false;
- glBegin(GL_POINTS);
- tt += 0.005f;
- GLfloat ptabb[4][3];
- GLfloat ptabb2[4][3];
- //SEGMENT 1
- if(!drugi)
- {
- for(int i = 0; i < 4; ++i)
- for(int j = 0; j < 3; ++j)
- ptabb[i][j] = ptab[i][j];
- for(int i = 1; i < 4; ++i)
- for(int j = 0; j < 4 - i; ++j)
- for(int k = 0; k < 3; ++k)
- ptabb[j][k] = (1-tt)*ptabb[j][k] + tt*ptabb[j+1][k];
- glVertex3f(ptabb[0][0], ptabb[0][1], ptabb[0][2]);
- }
- //SEGMENT 2
- if(drugi)
- {
- for(int i = 0; i < 4; ++i)
- for(int j = 0; j < 3; ++j)
- ptabb2[i][j] = ptab2[i][j];
- for(int i = 1; i < 4; ++i)
- for(int j = 0; j < 4 - i; ++j)
- for(int k = 0; k < 3; ++k)
- ptabb2[j][k] = (1-tt)*ptabb2[j][k] + tt*ptabb2[j+1][k];
- glVertex3f(ptabb2[0][0], ptabb2[0][1], ptabb2[0][2]);
- }
- if (tt > 1.0f)
- {
- drugi = !drugi;
- tt = 0.0f;
- }
- glEnd();
- }
- else //POWIERZCHNIA
- {
- // TODO - Ustawienie punktow kontrolnych dla powierzchni Beziera (typ GLfloat)
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glDisable(GL_LIGHTING);
- glLoadIdentity();
- glRotatef(glfActualAngle, 0.0, 1.0, 1.0);
- glPointSize(5.0);
- glColor3f(1.0, 1.0, 0.0);
- // TODO - rysowanie punktow kontrolnych
- glBegin(GL_POINTS);
- // należy wywolac funkcje, ktora definiuje wierzcholek w trzech wymiarach
- // glVertex3f(GLfloat x, GLfloat y, GLfloat z)
- // rysowanie powierzchni
- glPointSize(1.0);
- glColor3f(1.0, 0.0, 0.0);
- // TODO - rysowanie powierzchni
- // Rysowanie jednej lini lamanej nalezy umiescic miedzy
- //glBegin(GL_LINE_STRIP);
- // kolejne wyznaczone punkty glVertex3f(GLfloat x, GLfloat y, GLfloat z)
- //glEnd();
- //Animacja punktu na krzywej. Nalezy wyznaczyc wspolrzedne punktu na krzywej za pomoca algorytmu
- //deCasteliau
- glPointSize(5.0);
- glColor3f(0.0, 1.0, 0.0);
- //TODO - Wyznaczenie i narysowanie zielonego punktu dla parametru uu, vv
- glBegin(GL_POINTS);
- uu += 0.005f;
- if (uu > 1.0f)
- {
- uu = 0.0f;
- vv += 0.5f;
- if (vv > 1.0f)
- vv = 0.0f;
- }
- glEnd();
- }
- glPopMatrix();
- // Flush created objects to the screen, i.e., force rendering.
- glFlush();
- }
- // Initialization routine.
- void setup(void)
- {
- // Set background (or clearing) color.
- glClearColor(1.0, 1.0, 1.0, 0.0);
- glfActualAngle = 0.0f;
- glfDelta = 0.2f;
- tt = 0.0f;
- uu = 0.0f;
- vv = 0.0f;
- bTryb = true;
- }
- // OpenGL window reshape routine.
- void resize(int w, int h)
- {
- // Set viewport size to be entire OpenGL window.
- glViewport(0, 0, (GLsizei)w, (GLsizei)h);
- // Set matrix mode to projection.
- glMatrixMode(GL_PROJECTION);
- // Clear current projection matrix to identity.
- glLoadIdentity();
- // Specify the orthographic (or perpendicular) projection,
- // i.e., define the viewing box.
- glOrtho(-10.0, 10.0, -10.0, 10.0,-10.0, 10.0);
- //glFrustum(-10.0, 10.0, -10.0, 10.0, 5.0, 100.0);
- // Set matrix mode to modelview.
- glMatrixMode(GL_MODELVIEW);
- // Clear current modelview matrix to identity.
- glLoadIdentity();
- }
- void animate(int value) {
- glfActualAngle += glfDelta;
- if(glfActualAngle > 360.0f)
- glfActualAngle = 0.0f;
- glutTimerFunc(5, animate, 1);
- glutPostRedisplay();
- }
- // Keyboard input processing routine.
- void keyInput(unsigned char key, int x, int y)
- {
- bTryb = !bTryb;
- }
- // Mouse callback routine.
- void mouseControl(int button, int state, int x, int y)
- {
- //ToDo
- }
- // Main routine: defines window properties, creates window,
- // registers callback routines and begins processing.
- int main(int argc, char **argv)
- {
- // Initialize GLUT.
- glutInit(&argc, argv);
- // Set display mode as single-buffered and RGB color.
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- // Set OpenGL window size.
- glutInitWindowSize(500, 500);
- // Set position of OpenGL window upper-left corner.
- glutInitWindowPosition(100, 100);
- // Create OpenGL window with title.
- glutCreateWindow("Laboratorium GK: 07_KPP");
- // Initialize.
- setup();
- // Register display routine.
- glutDisplayFunc(drawScene);
- // Register reshape routine.
- glutReshapeFunc(resize);
- // Register the mouse and keyboard callback function.
- glutMouseFunc(mouseControl);
- glutKeyboardFunc(keyInput);
- //Animation
- glutTimerFunc(5, animate, 1);
- // Begin processing.
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement