#include #include #include #include #include #include #include using namespace std; int msec = 10; double scale = 1.0; double vx=0,vy=0; double p=3.14,r_1=0; double kx=5,ky=5; double angle_step = p/30/100.0 * msec; void render_square(double x, double y) { glPushMatrix(); double dx = 0.5; double dy = 0.5; glBegin(GL_POLYGON); glVertex2f(x, y); glVertex2f(x + dx, y); glVertex2f(x + dx, y - dy); glVertex2f(x, y - dy); glEnd(); glPopMatrix(); } void draw_line(double x, double y, double x1, double y1) { glBegin(GL_LINES); glVertex2d(x, y); glVertex2d(x1, y1); glEnd(); } class circle{ public: double x,y,r,vx,vy; circle(double x_, double y_, double r_, double vx_, double vy_):r(r_), x(x_), y(y_){ vx = vx_ / 1000.0 * msec; vy = vy_ / 1000.0 * msec; } void print_circle(){ int n=40; double cx=x + r; double cy=y; double step = p/n; for (float f=step; f<=p*2;f+=step){ draw_line(cx, cy ,cos(f)*r+x ,sin(f)*r+y); cx=x + cos(f)*r; cy=y + sin(f)*r; } } void update(){ if(x+r>kx || x-r<-kx){ vx*=-1; } if(y+r>ky || y-r<-ky){ vy*=-1; } x+=vx; y+=vy; } }; class Vector{ public: double x,y; Vector(float a,float b):x(a),y(b){ } Vector operator +(Vector other){ return Vector(x+other.x, y+other.y); } Vector operator -(Vector other){ return Vector(x-other.x, y-other.y); } Vector operator *(float a){ return Vector(x*a,y*a); } Vector operator /(float a){ return Vector(x/a,y/a); } float dot (Vector other){ return x*other.x+y*other.y; } void print(){ cout<<'('< 2 * p) cur_angle -= 2*p; draw_line(-kx,-ky,kx,-ky); draw_line(kx,-ky,kx,ky); draw_line(kx,ky,-kx,ky); draw_line(-kx,ky,-kx,-ky); b.draw(); n.print_circle(); a.update(); glFlush(); } void update(int t) { Render(); glutTimerFunc(msec, update, 0); } void keyb(unsigned char key, int x, int y) { if(key == '+') { scale *= 1.1; } if(key == '-') { scale *= 0.9; } if(key == 'w') { kx *= 1.1; } Render(); } void reshape(int w, int h) { // предупредим деление на ноль // если окно сильно перетянуто будет if(h == 0) h = 1; float ratio = 1.0* w / h; // используем матрицу проекции glMatrixMode(GL_PROJECTION); // Reset матрицы glLoadIdentity(); // определяем окно просмотра glViewport(0, 0, w, h); // установить корректную перспективу. gluPerspective(45,ratio,1,1000); // вернуться к модели glMatrixMode(GL_MODELVIEW); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Physics Engine"); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(0, 0, 0.0, 0.0); glutTimerFunc(50, update, 0); glutReshapeFunc(reshape); glutDisplayFunc(Render); glutKeyboardFunc(keyb); glutMainLoop(); }