Среда программирования:
Microsoft Visual C++ 2010 Express
#include "stdafx.h" #include <glut.h> #include <math.h> #include <stdlib.h> bool drawing=true;//параметр "рисовать/не рисовать" float WinWid = 600.0, WinHei = 600.0;//размеры экрана float X1=-100, Y1=100, X2=100, Y2=100, X3=100, Y3=-100, X4=-100, Y4=-100;//координаты квадрата int cnt=0, Add=0;//вспомогательные переменные для изменения координат float S1=100, S2=600, S3=500, S4=0;//координат треугольников void KVADRAT(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)//функция прорисовки квадрата { glBegin(GL_QUADS); glVertex2f(x1, y1); glVertex2f(x2, y2); glVertex2f(x3, y3); glVertex2f(x4, y4); glEnd(); } void TREUGOLNIK(float s1, float t1, float s2, float t2, float s3, float t3)//функция прорисовки треугольников { glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 1.0); glVertex2f(s1, t1); glColor3f(0.0, 1.0, 1.0); glVertex2f(s2, t2); glColor3f(1.0, 1.0, 0.0); glVertex2f(s3, t3); glEnd(); } void Draw()//функция прорисовки всего изображения { glClear(GL_COLOR_BUFFER_BIT);//очистка буфера цвета glPushMatrix();//сохраняем текущую матрицу glColor3f(0.0, 0.0, 0.0);//выбираем чёрный цвет для квадрата KVADRAT(X1+Add, Y1+Add, X2+Add, Y2-Add, X3-Add, Y3-Add, X4-Add, Y4+Add);//рисуем квадрат if(drawing){//если drawing=true то рисуем треугольники TREUGOLNIK(-S1, S3-cnt, S4, S2-cnt,S1, S3-cnt);//верхний треугольник TREUGOLNIK(S3-cnt, -S1, S3-cnt, S1, S2-cnt,S4);//правый треугольник TREUGOLNIK(-S1, -S3+cnt, S1, -S3+cnt, S4, -S2+cnt);//нижний треугольник TREUGOLNIK(-S3+cnt, S1, -S3+cnt, -S1, -S2+cnt, S4);//левый треугольник } glPopMatrix(); glutSwapBuffers(); } void Initialize()//инициализация { glClearColor(1.0, 1.0, 1.0, 1.0);//цвет фона glMatrixMode(GL_PROJECTION);//тип используемой матрицы glLoadIdentity(); glOrtho(-WinWid/2, WinWid/2, -WinHei/2, WinHei/2, -200.0, 200.0);//выбор системы координат glMatrixMode(GL_MODELVIEW); } void Timer(int)//функция таймера { if(cnt<400)cnt+=2;//изменение координаты для перемещения треугольников if(cnt==400)//после перемещения треугольников в нужную позицию рисуем новый квадрат, а треугольники не прорисовываем { Add=100; drawing=false; cnt++; } if(cnt>400){//трансформируем квадрат до исходного размера if(Add!=0) { Add--; } else{ //снова рисуем треугольники с исходной позиции за экраном drawing=true; cnt=0; } } glutPostRedisplay(); glutTimerFunc(10, Timer, 0); } int main(int argc, char** argv) { glutInit(&argc, argv);//инициализируем переменные glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(WinWid, WinHei);//выбор размеров окна glutInitWindowPosition(50,50);//выбор позиции окна glutCreateWindow("Transforming square");//название окна glutDisplayFunc(Draw);//вызов функции прорисовки glutTimerFunc(10, Timer, 0);//вызов функции таймера Initialize(); glutMainLoop(); return 0; }
Прикрепленный файл | Размер |
---|---|
Marokhovskaya_Kseniya_Transforming_squares.zip | 10.17 кб |