High_Light

столкновение окружностей

May 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <vector>
  6.  
  7. #include <GL/glut.h>
  8. #include <GL/gl.h>
  9. #include <GL/glu.h>
  10.  
  11. using namespace std;
  12. int msec = 10;
  13. double scale = 1.0;
  14. double vx=0,vy=0;
  15. double p=3.14,r_1=0;
  16. double kx=5,ky=5;
  17. double angle_step = p/30/100.0 * msec;
  18. double k_;
  19. double k_1;
  20.  
  21. void render_square(double x, double y) {
  22.     glPushMatrix();
  23.  
  24.     double dx = 0.5;
  25.     double dy = 0.5;
  26.     glBegin(GL_POLYGON);
  27.     glVertex2f(x, y);
  28.     glVertex2f(x + dx, y);
  29.     glVertex2f(x + dx, y - dy);
  30.     glVertex2f(x, y - dy);
  31.     glEnd();
  32.     glPopMatrix();
  33. }
  34.  
  35. void draw_line(double x, double y, double x1, double y1) {
  36.     glBegin(GL_LINES);
  37.     glVertex2d(x, y);
  38.     glVertex2d(x1, y1);
  39.     glEnd();
  40. }
  41. class circle{
  42. public:
  43.     double x,y,r,vx,vy;
  44.     circle(double x_, double y_, double r_, double vx_, double vy_):r(r_), x(x_), y(y_){
  45.         vx = vx_ / 1000.0 * msec;
  46.         vy = vy_ / 1000.0 * msec;
  47.     }
  48.     void print_circle(){
  49.         int n=40;
  50.         double cx=x + r;
  51.         double cy=y;
  52.         double step = p/n;
  53.         for (float f=step; f<=p*2;f+=step){
  54.             draw_line(cx, cy ,cos(f)*r+x ,sin(f)*r+y);
  55.              cx=x + cos(f)*r;
  56.              cy=y + sin(f)*r;
  57.         }
  58.     }
  59.  
  60.     void update(){
  61.         if(x+r>kx || x-r<-kx){
  62.             vx*=-1;
  63.         }
  64.         if(y+r>ky || y-r<-ky){
  65.             vy*=-1;
  66.         }
  67.         x+=vx;
  68.         y+=vy;
  69.     }
  70. };
  71. class Vector{
  72. public:
  73.     double x,y;
  74.     Vector(float a,float b):x(a),y(b){
  75.     }
  76.     Vector operator +(Vector other){
  77.         return Vector(x+other.x, y+other.y);
  78.     }
  79.     Vector operator -(Vector other){
  80.         return Vector(x-other.x, y-other.y);
  81.     }
  82.     Vector operator *(float a){
  83.         return Vector(x*a,y*a);
  84.     }
  85.     Vector operator /(float a){
  86.         return Vector(x/a,y/a);
  87.     }
  88.     float dot (Vector other){
  89.         return x*other.x+y*other.y;
  90.     }
  91.     void print(){
  92.         cout<<'('<<x<<','<<y<<')'<<endl;
  93.     }
  94.     void draw(){
  95.         static double d = 6.0;
  96.         Vector n1(-y, x);
  97.         Vector n2(y, -x);
  98.         Vector a(x,y);
  99.         Vector ar_1 = (n1 - a*2)/d;
  100.         Vector ar_2 = (n2 - a*2)/d;
  101.         draw_line(0,0,x,y);
  102.         draw_line(x, y, ar_1.x + x, ar_1.y + y);
  103.         draw_line(x, y, ar_2.x + x, ar_2.y + y);
  104.     }
  105. };
  106. /*class Liniya{
  107. public:
  108.     double x,y;
  109.     Liniya(float a,float b):x(a),y(b){
  110.     }
  111.     Liniya operator +(Liniya other){
  112.         return Liniya(x+other.x, y+other.y);
  113.     }
  114.     Liniya operator -(Liniya other){
  115.         return Liniya(x-other.x, y-other.y);
  116.     }
  117.     Liniya operator *(float a){
  118.         return Liniya (x*a,y*a);
  119.     }
  120.     Liniya operator /(float a){
  121.         return Liniya (x/a,y/a);
  122.     }
  123.     float dot (Liniya  other){
  124.         return x*other.x+y*other.y;
  125.     }
  126.     void print(){
  127.         cout<<'('<<x<<','<<y<<')'<<endl;
  128.     }
  129.     void draw(){
  130.         static double d = 6.0;
  131.         Liniya  n1(-y, x);
  132.         Liniya  n2(y, -x);
  133.         Liniya  a(x,y);
  134.         //Liniya  ar_1 = (n1 - a*2)/d;
  135.         //Liniya  ar_2 = (n2 - a*2)/d;
  136.         draw_line(0,0,x,y);
  137.         //draw_line(x, y, ar_1.x + x, ar_1.y + y);
  138.         //draw_line(x, y, ar_2.x + x, ar_2.y + y);
  139.     }
  140. };*/
  141. //Liniya c(2,2);
  142. Vector b(2,2);
  143. vector<circle> particles;
  144. circle a(-4, 0, 0.4, 1, 0);
  145. circle n(4, 0, 0.4, -1, 0);
  146.  
  147.  
  148.  
  149. /*void draw_clocks(float stop_angle){
  150.     int j = 0;
  151.     float coef = 0.8;
  152.     for(float  angle = 0; angle <  2 * p; angle += p/30.0, j++){
  153.         float x = cos(angle);
  154.         float y = sin(angle);
  155.         if(j % 5 == 0) coef = 0.6;
  156.         else coef = 0.8;
  157.         draw_line(x, y, x * coef, y * coef);
  158.     }
  159. }*/
  160. void modul(float a){
  161.     if(a < 0)
  162.         a = -a;
  163. }
  164. void colide(vector <circle> & part){
  165.     for(int i = 0; i < part.size(); i++){
  166.         for(int j = i + 1; j < part.size(); j++){
  167.             float l = (part[i].x - part[j].x) * (part[i].x - part[j].x) + (part[i].y - part[j].y) * (part[i].y - part[j].y);
  168.             float r = (part[i].r + part[j].r) * (part[i].r + part[j].r);
  169.  
  170.             if(l <= r){
  171.                 //cout << i << " - " << j << endl;
  172.                 double k= r-l;
  173.                 k_=sqrt(k)/2;
  174.             }
  175.         }
  176.     }
  177. }
  178. void Render() {
  179.         static double cur_angle = 1.5*p;
  180.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  181.         glLoadIdentity();
  182.         glTranslatef(0, 0, -10);
  183.         glColor3d(1, 1, 1);
  184.         glScalef(scale, scale, scale);
  185.         for(int i = 0; i < particles.size(); i++){
  186.             particles[i].print_circle();
  187.             particles[i].update();
  188.         }
  189.         colide(particles);
  190.         //draw_clocks(cur_angle);
  191.         //Vector b(cos(-cur_angle),sin(-cur_angle));
  192.        // Liniya c()
  193.         //cur_angle += angle_step;
  194.         //if (cur_angle - 1.5 * p > 2 * p) cur_angle -= 2*p;
  195.         draw_line(-kx,-ky,kx,-ky);
  196.         draw_line(kx,-ky,kx,ky);
  197.         draw_line(kx,ky,-kx,ky);
  198.         draw_line(-kx,ky,-kx,-ky);
  199.  
  200.         //b.draw();
  201.         //n.print_circle();
  202.  
  203.  
  204.         glFlush();
  205. }
  206.  
  207. void update(int t) {
  208.     Render();
  209.     glutTimerFunc(msec, update, 0);
  210. }
  211.  
  212. void keyb(unsigned char key, int x, int y) {
  213.     if(key == '+') {
  214.         scale *= 1.1;
  215.     }
  216.     if(key == '-') {
  217.         scale *= 0.9;
  218.     }
  219.     if(key == 'w') {
  220.         kx *= 1.1;
  221.     }
  222.     if(key == 's') {
  223.         kx *= 0.9;
  224.     }
  225.     if(key == 'd') {
  226.         ky *= 1.1;
  227.     }
  228.     if(key == 'a') {
  229.         ky *= 0.9;
  230.     }
  231.     Render();
  232. }
  233.  
  234. void reshape(int w, int h) {
  235.  
  236.     // предупредим деление на ноль
  237.     // если окно сильно перетянуто будет
  238.     if(h == 0)
  239.         h = 1;
  240.     float ratio = 1.0* w / h;
  241.  
  242.     // используем матрицу проекции
  243.     glMatrixMode(GL_PROJECTION);
  244.  
  245.         // Reset матрицы
  246.     glLoadIdentity();
  247.  
  248.     // определяем окно просмотра
  249.     glViewport(0, 0, w, h);
  250.  
  251.     // установить корректную перспективу.
  252.     gluPerspective(45,ratio,1,1000);
  253.  
  254.     // вернуться к модели
  255.     glMatrixMode(GL_MODELVIEW);
  256. }
  257.  
  258. int main(int argc, char **argv)
  259. {
  260.     particles.push_back(a);
  261.     particles.push_back(n);
  262.  
  263.     glutInit(&argc, argv);
  264.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  265.     glutInitWindowSize(800, 600);
  266.     glutCreateWindow("Physics Engine");
  267.     glEnable(GL_DEPTH_TEST);
  268.     glMatrixMode(GL_PROJECTION);
  269.     glLoadIdentity();
  270.     glMatrixMode(GL_MODELVIEW);
  271.     glLoadIdentity();
  272.     glClearColor(0, 0, 0.0, 0.0);
  273.  
  274.     glutTimerFunc(50, update, 0);
  275.     glutReshapeFunc(reshape);
  276.     glutDisplayFunc(Render);
  277.     glutKeyboardFunc(keyb);
  278.     glutMainLoop();
  279. }
Advertisement
Add Comment
Please, Sign In to add comment