kilolilo

Untitled

May 15th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.01 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.  
  13. double scale = 1.0;
  14. double vx=0,vy=0;
  15. double p=3.14,r_1=1;
  16. double kx=5,ky=5;
  17.  
  18.  
  19. int msec = 5;
  20. float angle_step = M_PI / 30 / 1000.0 * msec;
  21.  
  22. void render_square(double x, double y) {
  23. glPushMatrix();
  24.  
  25. double dx = 0.5;
  26. double dy = 0.5;
  27. glBegin(GL_POLYGON);
  28. glVertex2f(x, y);
  29. glVertex2f(x + dx, y);
  30. glVertex2f(x + dx, y - dy);
  31. glVertex2f(x, y - dy);
  32. glEnd();
  33. glPopMatrix();
  34. }
  35.  
  36. void draw_line(double x, double y, double x1, double y1) {
  37. glBegin(GL_LINES);
  38. glVertex2d(x, y);
  39. glVertex2d(x1, y1);
  40. glEnd();
  41. }
  42. class circle{
  43. public:
  44. double x,y,r,vx,vy;
  45. circle(double x_, double y_, double r_, double vx_, double vy_):r(r_), x(x_), y(y_){
  46. vx = vx_ / 1000.0 * msec;
  47. vy = vy_ / 1000.0 * msec;
  48. }
  49. void print_circle(){
  50. int n=41;
  51. double cx=x + r;
  52. double cy=y;
  53. double step = p/n;
  54. for (float f=step; f<=p*2;f+=step){
  55. draw_line(cx ,cy ,cos(f)*r+x ,sin(f)*r+y);
  56. cx=x + cos(f)*r;
  57. cy=y + sin(f)*r;
  58. }
  59. }
  60. void update(){
  61. if(x+r_1>kx || x-r_1<-kx){
  62. vx*=-1;
  63. }
  64. if(y+r_1>ky || y-r_1<-ky){
  65. vy*=-1;
  66. }
  67. x+=vx;
  68. y+=vy;
  69. }
  70. };
  71. class Vector{
  72. public:
  73. float 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 float d = 10;
  96. Vector n1(-y, x);
  97. Vector n2(y, -x);
  98. Vector a(x, y);
  99. Vector ar_1 = (n1 - a*3) / d;
  100. Vector ar_2 = (n2 - a*3) / 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. circle a(0, 0, r_1, 2, 0.05);
  107. circle b1(0,0,1,0,1);
  108. vector<circle>particles;
  109.  
  110.  
  111. void draw_clocks(float rad, float stop_angle){
  112. float coef = 6.0;
  113. for(float angle = -0.5 * M_PI; angle < stop_angle; angle += M_PI / 7){
  114. float x = rad * cos(-angle);
  115. float y = rad * sin(-angle);
  116. draw_line(x, y, x - x / coef,y - y / coef);
  117. }
  118. for(float angle = -0.5 * M_PI; angle < stop_angle; angle += M_PI / 14){
  119. float x = rad * cos(-angle);
  120. float y = rad * sin(-angle);
  121. draw_line(x, y, x - x / coef*0.5,y - y / coef*0.5);
  122. }
  123. }
  124. void collide(vector <circle> & particles){
  125. for(int i = 0; i < particles.size(); i++){
  126. for(int j = i + 1; j < particles.size(); j++){
  127. float l = (particles[i].x - particles[j].x) * (particles[i].x - particles[j].x) + (particles[i].y - particles[j].y) * (particles[i].y - particles[j].y);
  128. float r = (particles[i].r + particles[j].r) * (particles[i].r + particles[j].r);
  129. if(l <= r)
  130. cout << particles[i].x << " - " << particles[j].y << endl;
  131. }
  132. }
  133. }
  134.  
  135. void Render() {
  136. static float cur_angle = -0.5 * M_PI;
  137. float cur_angle_1=-0.5*M_PI;
  138. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  139. glLoadIdentity();
  140. glTranslatef(0, 0, -10);
  141. glColor3d(1, 1, 1);
  142. glScalef(scale, scale, scale);
  143. a.print_circle();
  144. b1.print_circle();
  145. Vector b(cos(-cur_angle),sin(-cur_angle));
  146. cur_angle += angle_step;
  147. // if (cur_angle==-M_PI*0.5){
  148. // cur_angle_1+=angle_step;
  149. // Vector c(cos(-cur_angle_1),sin(-cur_angle_1));
  150. //}
  151. draw_clocks(1, 2*M_PI);
  152. /*
  153. if(cur_angle%M_PI/6==0){
  154. draw_line();
  155. }
  156. */
  157. if (cur_angle > 2 * M_PI) cur_angle -= 2 * M_PI;
  158. draw_line(-kx,-ky,kx,-ky);
  159. draw_line(kx,-ky,kx,ky);
  160. draw_line(kx,ky,-kx,ky);
  161. draw_line(-kx,ky,-kx,-ky);
  162. for (int i=0;i<particles.size();i+=1){
  163. particles[i].print_circle();
  164. particles[i].update();
  165. }
  166. collide(particles);
  167. b.draw();
  168. glFlush();
  169. }
  170.  
  171. void update(int t) {
  172. Render();
  173. glutTimerFunc(msec, update, 0);
  174. }
  175.  
  176. void keyb(unsigned char key, int x, int y) {
  177. if(key == '+') {
  178. scale *= 1.1;
  179. }
  180. if(key == '-') {
  181. scale *= 0.9;
  182. }
  183. Render();
  184. }
  185.  
  186. void reshape(int w, int h) {
  187.  
  188. // предупредим деление на ноль
  189. // если окно сильно перетянуто будет
  190. if(h == 0)
  191. h = 1;
  192. float ratio = 1.0* w / h;
  193.  
  194. // используем матрицу проекции
  195. glMatrixMode(GL_PROJECTION);
  196.  
  197. // Reset матрицы
  198. glLoadIdentity();
  199.  
  200. // определяем окно просмотра
  201. glViewport(0, 0, w, h);
  202.  
  203. // установить корректную перспективу.
  204. gluPerspective(45,ratio,1,1000);
  205.  
  206. // вернуться к модели
  207. glMatrixMode(GL_MODELVIEW);
  208. }
  209.  
  210. int main(int argc, char **argv)
  211. {
  212. particles.push_back(a);
  213. particles.push_back(b1);
  214. glutInit(&argc, argv);
  215. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  216. glutInitWindowSize(800, 600);
  217. glutCreateWindow("Physics Engine");
  218. glEnable(GL_DEPTH_TEST);
  219. glMatrixMode(GL_PROJECTION);
  220. glLoadIdentity();
  221. glMatrixMode(GL_MODELVIEW);
  222. glLoadIdentity();
  223. glClearColor(0, 0, 1.0, 0.0);
  224.  
  225. glutTimerFunc(50, update, 0);
  226. glutReshapeFunc(reshape);
  227. glutDisplayFunc(Render);
  228. glutKeyboardFunc(keyb);
  229. glutMainLoop();
  230.  
  231. }
Add Comment
Please, Sign In to add comment