Язык программирования:
C/C++
Среда программирования:
Microsoft Visual C++ 2010 Express
#include "stdafx.h" #include <glut.h> #include <math.h> #include <stdlib.h> #define PI 3.1415926535898 float WinWid = 600.0, WinHei = 600.0;//размеры экрана float R=200.0; float Angle; float cnt=0; float xc,yc; int p; float rWhite[8] = {0,16,32,48,65,48,32,16};//массив белых радиусов для каждого круга float rBlack[8] = {65,48,32,16,0,16,32,48};//массив чёрных радиусов для каждого круга bool ChangeBlack=true, ChangeWhite=true; void CIRCLE(float Xc, float Yc, float R, float color)//функция прорисовки круга { glBegin(GL_TRIANGLE_FAN); float angle=0.0; if(color==0)glColor3f(0.0, 0.0, 0.0); if(color==1)glColor3f(1.0, 1.0, 1.0); for (int i = 0; i < 100; i++) { angle = 2*PI*i/100; glVertex2f(Xc+R*cos(angle),Yc+R*sin(angle)); } glEnd(); } void Draw()//функция прорисовки всего изображения { glClear(GL_COLOR_BUFFER_BIT);//очистка буферов glPushMatrix();//сохраняем матрицу for(Angle=0;Angle<360;Angle+=45){//рисуем круги каждые 45 градусов с радиусом 200 p=Angle/45; if(ChangeWhite)//изменение белого круга { if(rWhite[p]<65)rWhite[p]++; if(rWhite[p]==65) { rBlack[p]=0; ChangeWhite=false; ChangeBlack=true; } } if(ChangeBlack)//изменение чёрного круга { if(rBlack[p]<65)rBlack[p]++; if(rBlack[p]==65) { rWhite[p]=0; ChangeBlack=false; ChangeWhite=true; } } xc=R*cos((Angle-cnt)*PI/180);//координаты центра круга yc=R*sin((Angle-cnt)*PI/180);// if(ChangeWhite)//при изменении белого круга { CIRCLE(xc,yc,rBlack[p],0); CIRCLE(xc,yc,rWhite[p],1); } if(ChangeBlack)//при изменении чёрного круга { CIRCLE(xc,yc,rWhite[p],1); CIRCLE(xc,yc,rBlack[p],0); } } glPopMatrix();// glutSwapBuffers();//меняем буферы } void Initialize()//инициализация { glClearColor(0.25, 0.25, 0.25, 0.0);//цвет фона glMatrixMode(GL_PROJECTION);//тип использумой матрицы glLoadIdentity(); glOrtho(-WinWid/2, WinWid/2, -WinHei/2, WinHei/2, -200.0, 200.0);//выбор системы координат glMatrixMode(GL_MODELVIEW); } void Timer(int)//функция таймера { cnt++;// glutPostRedisplay(); glutTimerFunc(30, Timer, 0); } int main(int argc, char** argv) { glutInit(&argc, argv);//инициализируем переменные glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(WinWid, WinHei);//выбор размеров окна glutInitWindowPosition(50,50);//выбор позиции окна glutCreateWindow("DEMO");//название окна glutDisplayFunc(Draw);//вызов функции прорисовки glutTimerFunc(30, Timer, 0);//вызов функции таймера Initialize(); glutMainLoop(); return 0; }
Прикрепленный файл | Размер |
---|---|
Marokhovskaya_Circles.zip | 850.41 кб |