kilolilo

Untitled

May 22nd, 2018
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 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. double 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 Vector{
  43. public:
  44. float x,y;
  45. Vector(float a,float b):x(a),y(b){
  46. }
  47. Vector operator +(Vector other){
  48. return Vector(x+other.x, y+other.y);
  49. }
  50. Vector operator -(Vector other){
  51. return Vector(x-other.x, y-other.y);
  52. }
  53. Vector operator *(float a){
  54. return Vector(x*a,y*a);
  55. }
  56. Vector operator /(float a){
  57. return Vector(x/a,y/a);
  58. }
  59. float dot (Vector other){
  60. return x*other.x+y*other.y;
  61. }
  62. void print(){
  63. cout<<'('<<x<<','<<y<<')'<<endl;
  64. }
  65. void draw(){
  66. static float d = 10;
  67. Vector n1(-y, x);
  68. Vector n2(y, -x);
  69. Vector a(x, y);
  70. Vector ar_1 = (n1 - a*3) / d;
  71. Vector ar_2 = (n2 - a*3) / d;
  72. draw_line(0,0,x,y);
  73. draw_line(x, y, ar_1.x + x, ar_1.y + y);
  74. draw_line(x, y, ar_2.x + x, ar_2.y + y);
  75. }
  76. };
  77.  
  78. class circle{
  79. public:
  80. double x,y,r,vx,vy;
  81. circle(double x_, double y_, double r_, double vx_, double vy_):r(r_), x(x_), y(y_){
  82. vx = vx_ / 1000.0 * msec;
  83. vy = vy_ / 1000.0 * msec;
  84. }
  85. void print_circle(){
  86. int n=41;
  87. double cx=x + r;
  88. double cy=y;
  89. double step = p/n;
  90. for (float f=step; f<=p*2;f+=step){
  91. draw_line(cx ,cy ,cos(f)*r+x ,sin(f)*r+y);
  92. cx=x + cos(f)*r;
  93. cy=y + sin(f)*r;
  94. }
  95. }
  96. void update(){
  97. if(x+r_1>kx || x-r_1<-kx){
  98. vx*=-1;
  99. }
  100. if(y+r_1>ky || y-r_1<-ky){
  101. vy*=-1;
  102. }
  103. x+=vx;
  104. y+=vy;
  105. }
  106. };
  107.  
  108. circle a(4, 0, r_1, 0.5, 1);
  109. circle b1(-3,0,1,1,1);
  110. vector<circle>particles;
  111.  
  112.  
  113. void draw_clocks(float rad, float stop_angle){
  114. float coef = 6.0;
  115. for(float angle = -0.5 * M_PI; angle < stop_angle; angle += M_PI / 7){
  116. float x = rad * cos(-angle);
  117. float y = rad * sin(-angle);
  118. draw_line(x, y, x - x / coef,y - y / coef);
  119. }
  120. for(float angle = -0.5 * M_PI; angle < stop_angle; angle += M_PI / 14){
  121. float x = rad * cos(-angle);
  122. float y = rad * sin(-angle);
  123. draw_line(x, y, x - x / coef*0.5,y - y / coef*0.5);
  124. }
  125. }
  126. void collide(vector <circle> & particles){
  127. for(int i = 0; i < particles.size(); i++){
  128. for(int j = i + 1; j < particles.size(); j++){
  129. double 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);
  130. double r = (particles[i].r + particles[j].r) * (particles[i].r + particles[j].r);
  131. if(l <= r){
  132. double abx = particles[j].x - particles[i].x;
  133. double aby = particles[j].y - particles[i].y;
  134. double abd = sqrt (abx*abx + aby*aby);
  135. double lx = abx / abd;
  136. double ly = aby / abd;
  137. double delta = (sqrt(r) - abd) * 0.5;
  138. double p[2] = {ly, -lx};
  139. double V2l = particles[j].vx * lx + particles[j].vy*ly;
  140. double V2p = particles[j].vx * p[0] + particles[j].vy*p[1];
  141. double V1l = particles[i].vx * lx + particles[i].vy*ly;
  142. double V1p = particles[i].vx * p[0] + particles[i].vy*p[1];
  143. particles[i].vx = V2l * lx + V1p * p[0];
  144. particles[i].vy = V2l * ly + V1p * p[1];
  145. particles[j].vx = V1l * lx + V2p * p[0];
  146. particles[j].vy = V1l * ly + V2p * p[1];
  147. }
  148.  
  149. }
  150. }
  151. }
  152.  
  153. void Render() {
  154. static float cur_angle = -0.5 * M_PI;
  155. float cur_angle_1=-0.5*M_PI;
  156. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  157. glLoadIdentity();
  158. glTranslatef(0, 0, -10);
  159. glColor3d(1, 1, 1);
  160. glScalef(scale, scale, scale);
  161. Vector b(cos(-cur_angle),sin(-cur_angle));
  162. cur_angle += angle_step;
  163. // if (cur_angle==-M_PI*0.5){
  164. // cur_angle_1+=angle_step;
  165. // Vector c(cos(-cur_angle_1),sin(-cur_angle_1));
  166. //}
  167. draw_clocks(1, 2*M_PI);
  168. /*
  169. if(cur_angle%M_PI/6==0){
  170. draw_line();
  171. }
  172. */
  173. if (cur_angle > 2 * M_PI) cur_angle -= 2 * M_PI;
  174. draw_line(-kx,-ky,kx,-ky);
  175. draw_line(kx,-ky,kx,ky);
  176. draw_line(kx,ky,-kx,ky);
  177. draw_line(-kx,ky,-kx,-ky);
  178. for (int i=0;i<particles.size();i+=1){
  179. particles[i].print_circle();
  180. particles[i].update();
  181. }
  182. b.draw();
  183. collide(particles);
  184. glFlush();
  185. }
  186.  
  187. void update(int t) {
  188. Render();
  189. glutTimerFunc(msec, update, 0);
  190. }
  191.  
  192. void keyb(unsigned char key, int x, int y) {
  193. if(key == '+') {
  194. scale *= 1.1;
  195. }
  196. if(key == '-') {
  197. scale *= 0.9;
  198. }
  199. Render();
  200. }
  201.  
  202. void reshape(int w, int h) {
  203.  
  204. // предупредим деление на ноль
  205. // если окно сильно перетянуто будет
  206. if(h == 0)
  207. h = 1;
  208. float ratio = 1.0* w / h;
  209.  
  210. // используем матрицу проекции
  211. glMatrixMode(GL_PROJECTION);
  212.  
  213. // Reset матрицы
  214. glLoadIdentity();
  215.  
  216. // определяем окно просмотра
  217. glViewport(0, 0, w, h);
  218.  
  219. // установить корректную перспективу.
  220. gluPerspective(45,ratio,1,1000);
  221.  
  222. // вернуться к модели
  223. glMatrixMode(GL_MODELVIEW);
  224. }
  225.  
  226. int main(int argc, char **argv)
  227. {
  228. particles.push_back(a);
  229. particles.push_back(b1);
  230. glutInit(&argc, argv);
  231. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  232. glutInitWindowSize(800, 600);
  233. glutCreateWindow("Physics Engine");
  234. glEnable(GL_DEPTH_TEST);
  235. glMatrixMode(GL_PROJECTION);
  236. glLoadIdentity();
  237. glMatrixMode(GL_MODELVIEW);
  238. glLoadIdentity();
  239. glClearColor(0, 0, 1.0, 0.0);
  240.  
  241. glutTimerFunc(50, update, 0);
  242. glutReshapeFunc(reshape);
  243. glutDisplayFunc(Render);
  244. glutKeyboardFunc(keyb);
  245. glutMainLoop();
  246.  
  247. }
Add Comment
Please, Sign In to add comment