kilolilo

Untitled

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