Advertisement
Serafim_

Два шара летят с оскоком

Apr 10th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.03 KB | None | 0 0
  1. #include <iostream>  //Загаловочный файл
  2. #include <list>      //Прдключение библиотеки контейнера
  3. #include<cmath>      //Подключение математической библиотеки
  4. #include <algorithm>  //Библиотека алгоритмов
  5.  
  6. #include <GL/glut.h>              
  7. #include <GL/gl.h>              //Подключение графических библиотек
  8. #include <GL/glu.h>
  9.  
  10. using namespace std;
  11. double p = 3.14;
  12.  
  13. double x_cur = 0, y_cur = 0;
  14. double Vx_cur = 0.5, Vy_cur = 0.5;
  15. double scale = 1.0;
  16. double x_circle = 0;
  17. double A = p/15;
  18.  
  19.  
  20. void render_square(double x, double y) {
  21.     glPushMatrix();   //Положить и вытащить стек из матрицы
  22.  
  23.     double dx = 0.5;
  24.     double dy = 0.5;
  25.     glBegin(GL_POLYGON);         // glBegin - (Функция библиотеки OpenGL) определяет границы, внутри которых заданы вершины примитива или группы примитивов.работает с буфером накопления.
  26.     glVertex2f(x, y);            //Задает вершины точки  
  27.     glVertex2f(x + dx, y);
  28.     glVertex2f(x + dx, y - dy);
  29.     glVertex2f(x, y - dy);
  30.     glEnd();                     //Завершение рисования
  31.     glPopMatrix();
  32. }
  33.  
  34. void draw_line(double x, double y, double x1, double y1) {
  35.     glBegin(GL_LINES);
  36.     glVertex2d(x, y);                                         //Рисование квадрата
  37.     glVertex2d(x1, y1);
  38.     glEnd();
  39. }
  40. class circle{                                               //Описание класса шар
  41. public:
  42.     double X, Y, R, VX, VY;
  43.     circle(double x, double y,double r, double Vx, double Vy) : X(x), Y(y), R(r), VX(Vx), VY(Vy) {
  44.  
  45.     }
  46.     void draw(){
  47.         for( double f = 0; f <= 2*p; f += A){
  48.             double x_1 = cos(f)*R;
  49.             double y_1 = sin(f)*R;
  50.             double x_2 = cos(f + A)*R;               //Рисует шар
  51.             double y_2 = sin(f + A)*R;
  52.             draw_line(x_1 + X,y_1 + Y,x_2 + X,y_2 + Y);
  53.         }
  54.     }
  55.     void update(){
  56.         X += VX;
  57.         Y += VY;
  58.         if ((X - R) < -40){
  59.             VX  = -VX;
  60.         }
  61.         if((X + R) > 5){
  62.             VX = -VX;
  63.         }
  64.         if((Y + R) > 10){
  65.             VY = -VY;
  66.         }
  67.         if((Y - R) < -10){
  68.             VY = -VY;
  69.         }
  70.     }
  71. };
  72.  
  73. circle c1(0,0,0.2,0.8,0.8);                //Задаем шары
  74. circle c2(-2,-2,4,0.3,0.3);
  75.  
  76. void Render() {
  77.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Очистка в черный цвет окна
  78.         glLoadIdentity();                                    //Замена текущей матрицы в единичную матрицу
  79.         glTranslatef(0, 0, -10);                            //Функция glTranslatef умножает текущую матрицу на матрицу преобразования.
  80.         glColor3d(1, 1, 1);
  81.         glScalef(scale, scale, scale);
  82.         draw_line(5,10,5,-10);
  83.         draw_line(5,-10,-40,-10);
  84.         draw_line(-40,-10,-40,10);
  85.         draw_line(-40,10,5,10);
  86.         c2.draw();
  87.         c2.update();
  88.         c1.draw();
  89.         c1.update();
  90.         glFlush();
  91. }
  92. void update(int t) {
  93. double dt = 0.1;
  94.     x_cur += dt * Vx_cur;
  95.     y_cur += dt * Vy_cur;
  96.     Render();
  97.     glutTimerFunc(50, update, 0);
  98. }
  99.  
  100. void keyb(unsigned char key, int x, int y) {
  101.     if(key == '+') {
  102.         scale *= 1.1;
  103.     }
  104.     if(key == '-') {
  105.         scale *= 0.9;
  106.     }
  107.     if(key == 'w'){
  108.         Vy_cur += 0.5;
  109.         Vx_cur += 0.5;
  110.     }
  111.     if(key == 's'){
  112.         Vy_cur = 0;
  113.         Vx_cur = 0;
  114.     }
  115.     Render();
  116. }
  117.  
  118. void reshape(int w, int h) {
  119.  
  120.     // предупредим деление на ноль
  121.     // если окно сильно перетянуто будет
  122.     if(h == 0)
  123.         h = 1;
  124.     float ratio = 1.0* w / h;
  125.  
  126.     // используем матрицу проекции
  127.     glMatrixMode(GL_PROJECTION);
  128.  
  129.         // Reset матрицы
  130.     glLoadIdentity();
  131.  
  132.     // определяем окно просмотра
  133.     glViewport(0, 0, w, h);
  134.  
  135.     // установить корректную перспективу.
  136.     gluPerspective(45,ratio,1,1000);
  137.  
  138.     // вернуться к модели
  139.     glMatrixMode(GL_MODELVIEW);
  140. }
  141.  
  142. int main(int argc, char **argv)
  143. {
  144.     glutInit(&argc, argv);
  145.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  146.     glutInitWindowSize(800, 600);
  147.     glutCreateWindow("Physics Engine");
  148.     glEnable(GL_DEPTH_TEST);
  149.     glMatrixMode(GL_PROJECTION);
  150.     glLoadIdentity();
  151.     glMatrixMode(GL_MODELVIEW);
  152.     glLoadIdentity();
  153.     glClearColor(0., 0.0, 0.0, 0.0);
  154.  
  155.     glutTimerFunc(50, update, 0);
  156.     glutReshapeFunc(reshape);
  157.     glutDisplayFunc(Render);
  158.     glutKeyboardFunc(keyb);
  159.     glutMainLoop();
  160. }
  161.  
  162.  
  163.    
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171. void WINAPI glTranslatef(  
  172.    GLfloat x,
  173.    GLfloat y,
  174.    GLfloat z
  175. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement