Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream> //Загаловочный файл
- #include <list> //Прдключение библиотеки контейнера
- #include<cmath> //Подключение математической библиотеки
- #include <algorithm> //Библиотека алгоритмов
- #include <GL/glut.h>
- #include <GL/gl.h> //Подключение графических библиотек
- #include <GL/glu.h>
- using namespace std;
- double p = 3.14;
- double x_cur = 0, y_cur = 0;
- double Vx_cur = 0.5, Vy_cur = 0.5;
- double scale = 1.0;
- double x_circle = 0;
- double A = p/15;
- void render_square(double x, double y) {
- glPushMatrix(); //Положить и вытащить стек из матрицы
- double dx = 0.5;
- double dy = 0.5;
- glBegin(GL_POLYGON); // glBegin - (Функция библиотеки OpenGL) определяет границы, внутри которых заданы вершины примитива или группы примитивов.работает с буфером накопления.
- 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) : X(x), Y(y), R(r), VX(Vx), VY(Vy) {
- }
- void draw(){
- for( double f = 0; f <= 2*p; f += A){
- double x_1 = cos(f)*R;
- double y_1 = sin(f)*R;
- double x_2 = cos(f + A)*R; //Рисует шар
- double y_2 = sin(f + A)*R;
- draw_line(x_1 + X,y_1 + Y,x_2 + X,y_2 + Y);
- }
- }
- void update(){
- X += VX;
- Y += VY;
- if ((X - R) < -40){
- VX = -VX;
- }
- if((X + R) > 5){
- VX = -VX;
- }
- if((Y + R) > 10){
- VY = -VY;
- }
- if((Y - R) < -10){
- VY = -VY;
- }
- }
- };
- circle c1(0,0,0.2,0.8,0.8); //Задаем шары
- circle c2(-2,-2,4,0.3,0.3);
- void Render() {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Очистка в черный цвет окна
- glLoadIdentity(); //Замена текущей матрицы в единичную матрицу
- glTranslatef(0, 0, -10); //Функция glTranslatef умножает текущую матрицу на матрицу преобразования.
- glColor3d(1, 1, 1);
- glScalef(scale, scale, scale);
- draw_line(5,10,5,-10);
- draw_line(5,-10,-40,-10);
- draw_line(-40,-10,-40,10);
- draw_line(-40,10,5,10);
- c2.draw();
- c2.update();
- c1.draw();
- c1.update();
- glFlush();
- }
- void update(int t) {
- double dt = 0.1;
- x_cur += dt * Vx_cur;
- y_cur += dt * Vy_cur;
- Render();
- glutTimerFunc(50, update, 0);
- }
- void keyb(unsigned char key, int x, int y) {
- if(key == '+') {
- scale *= 1.1;
- }
- if(key == '-') {
- scale *= 0.9;
- }
- if(key == 'w'){
- Vy_cur += 0.5;
- Vx_cur += 0.5;
- }
- if(key == 's'){
- Vy_cur = 0;
- Vx_cur = 0;
- }
- 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.0);
- glutTimerFunc(50, update, 0);
- glutReshapeFunc(reshape);
- glutDisplayFunc(Render);
- glutKeyboardFunc(keyb);
- glutMainLoop();
- }
- void WINAPI glTranslatef(
- GLfloat x,
- GLfloat y,
- GLfloat z
- );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement