Dvortsov_D1

шарик с отскоком

Apr 10th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 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.  
  12. double scale = 1.0;
  13. void render_square(double x, double y) {
  14.     glPushMatrix();
  15.  
  16.     double dx = 0.5;
  17.     double dy = 0.5;
  18.     glBegin(GL_POLYGON);
  19.     glVertex2f(x, y);
  20.     glVertex2f(x + dx, y);
  21.     glVertex2f(x + dx, y - dy);
  22.     glVertex2f(x, y - dy);
  23.     glEnd();
  24.     glPopMatrix();
  25. }
  26.  
  27. void draw_line(double x, double y, double x1, double y1) {
  28.     glBegin(GL_LINES);
  29.     glVertex2d(x, y);
  30.     glVertex2d(x1, y1);
  31.     glEnd();
  32. }
  33.  
  34. class Circle{
  35. public:
  36.     float x, y, radius, vx, vy;
  37.     Circle(float cx, float cy, float vx, float vy, float rad) : x(cx), y(cy), radius(rad), vx(vx), vy(vy) {}
  38.     void draw(){
  39.         float step = 0.04;
  40.         for (float f = 0; f <= M_PI * 2; f += step){
  41.             draw_line(x + radius * cos(f), y + radius * sin(f), x + radius * cos(f+step), y + radius * sin(f+step));
  42.         }
  43.     }
  44.     void update(){
  45.         if (y > 4.0 - radius){
  46.             vy = -vy;
  47.             y = 4.0 - radius +vy;
  48.         }
  49.         if (y < -4.0 + radius){
  50.             vy = -vy;
  51.             y = -4.0 + radius  - vy;
  52.         }
  53.         if (x > 14.0 - radius || x < -14.0 +  radius ){
  54.             vx = -vx;
  55.         }
  56.         x += vx;
  57.         y += vy;
  58.  
  59.     }
  60. };
  61.  
  62. Circle c1(0,0,0.1,0.0,0.1);
  63. Circle c2(0,0,0.0,0.1,0.2);
  64.  
  65. static float TIME = 0.0;
  66.  
  67. void draw_circle(float x0, float y0, float vx, float vy, float r, int n){
  68.     float step = M_PI*2.0f / n;
  69.     if (y0 + vy * TIME < -5.0){
  70.         vy = -vy;
  71.         vx = -vx;
  72.     }
  73.  
  74.     for (float f = 0; f <= M_PI * 2; f += step){
  75.         draw_line(x0 + vx * TIME + r * cos(f), y0 + vy * TIME + r * sin(f), x0 + vx * TIME + r * cos(f+step), y0 + vy * TIME + r * sin(f+step));
  76.     }
  77. }
  78. void draw_rectangle(){
  79.     draw_line(-14.0,-4.0,14.0,-4.0);
  80.     draw_line(14.0,-4.0,14.0,4.0);
  81.     draw_line(14.0,4.0,-14.0,4.0);
  82.     draw_line(-14.0,4.0,-14.0,-4.0);
  83. }
  84.  
  85. void Render() {
  86.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  87.         glLoadIdentity();
  88.         glTranslatef(0, 0, -10);
  89.         glColor3d(1, 1, 1);
  90.         glScalef(scale, scale, scale);
  91.         //draw_circle(0.0, 0.2, 0.01, 0.0, 0.2, 8);
  92.         //draw_circle(0.0, 0.0, -0.01, 0.0, 0.4, 6);
  93.         //draw_circle(0.0, -0.2, 0.000, 0.0, 0.6, 18);
  94.         //TIME += 2.5;
  95.         draw_rectangle();
  96.         c1.update();
  97.         c1.draw();
  98.         c2.update();
  99.         c2.draw();
  100.  
  101.         glFlush();
  102.  
  103. }
  104.  
  105. void update(int t) {
  106.     Render();
  107.     glutTimerFunc(50, update, 0);
  108. }
  109.  
  110. void keyb(unsigned char key, int x, int y) {
  111.     if(key == '+') {
  112.         scale *= 1.1;
  113.     }
  114.     if(key == '-') {
  115.         scale *= 0.9;
  116.     }
  117.  
  118.     Render();
  119. }
  120.  
  121. void reshape(int w, int h) {
  122.  
  123.     // предупредим деление на ноль
  124.     // если окно сильно перетянуто будет
  125.     if(h == 0)
  126.         h = 1;
  127.     float ratio = 1.0* w / h;
  128.  
  129.     // используем матрицу проекции
  130.     glMatrixMode(GL_PROJECTION);
  131.  
  132.         // Reset матрицы
  133.     glLoadIdentity();
  134.  
  135.     // определяем окно просмотра
  136.     glViewport(0, 0, w, h);
  137.  
  138.     // установить корректную перспективу.
  139.     gluPerspective(45,ratio,1,1000);
  140.  
  141.     // вернуться к модели
  142.     glMatrixMode(GL_MODELVIEW);
  143. }
  144.  
  145. int main(int argc, char **argv)
  146. {
  147.     glutInit(&argc, argv);
  148.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  149.     glutInitWindowSize(800, 600);
  150.     glutCreateWindow("Physics Engine");
  151.     glEnable(GL_DEPTH_TEST);
  152.     glMatrixMode(GL_PROJECTION);
  153.     glLoadIdentity();
  154.     glMatrixMode(GL_MODELVIEW);
  155.     glLoadIdentity();
  156.     glClearColor(0.0,0.529,0.0,0.0);
  157.  
  158.     glutTimerFunc(50, update, 0);
  159.     glutReshapeFunc(reshape);
  160.     glutDisplayFunc(Render);
  161.     glutKeyboardFunc(keyb);
  162.     glutMainLoop();
  163. }
Advertisement
Add Comment
Please, Sign In to add comment