Advertisement
High_Light

peresechenie krugov

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