Язык программирования:
C/C++
Среда программирования:
Visual Studio 2010
#include "stdafx.h" #include <glut.h> #include <math.h> #define PI 3.14159265358979323846 float WinWidth = 600.0; float WinHeight = 600.0; float c=100.0; //расстояние до фокуса int segments=10; //детализированность окружности float r=75.0; //радиус окружности float var=0.0; int direction=-1; //направление движения по оси абсцисс int signY=-1; //контроль знака ординаты float Gety(float x) { return signY*sqrt(sqrt(pow(c,4)+4*pow(x,2)*pow(c,2))-pow(x,2)-pow(c,2)); } void drawCircle(float x, float y, float r, int amountSegments) { glLineWidth(5.0); //ширина линий glEnable(GL_ALPHA_TEST); //подключение glAlphaFunc glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //смешание цветов glEnable(GL_BLEND); //подключение glBlendFunc glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); //приоритет качества glEnable(GL_LINE_SMOOTH); //сглаживание линий glBegin(GL_LINE_LOOP); //отрисовка окружности for(int i=0;i<amountSegments;i++) { float angle=2.0*PI*float(i)/float(amountSegments); float dx = r*cosf(angle); float dy = r*sinf(angle); glVertex2f(x+dx,y+dy); } glEnd(); glDisable(GL_ALPHA_TEST); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); } void Draw() { glClear(GL_COLOR_BUFFER_BIT); //очистка окна glColor3ub(239,0,0); //цвет for(int i=0; i<=360; i+=45) { glPushMatrix(); glRotatef((float)i, 0.0, 0.0, 1.0); //вращение drawCircle(var,Gety(var),r,segments); glPopMatrix(); } glutSwapBuffers(); //вывод на экран } void Timer(int value) { if(var>=0&&direction== 1) signY=-1; if(var>=0&&direction==-1) signY= 1; if(var<0 &&direction== 1) signY= 1; if(var<0 &&direction==-1) signY=-1; if(abs(var)>sqrt(2.0)*c&&direction==-1) { var++; direction*=-1; } else if(abs(var)>sqrt(2.0)*c&&direction==1) { var--; direction*=-1; } glutPostRedisplay(); //вызов ф-ции рисования if(direction==-1) var--; else var++; glutTimerFunc(abs(var*PI/2/c)+7,Timer,0); //установка таймера } void Initialize() { glClearColor(0.0, 0.0, 0.0, 1.0); //установка цвета фона glMatrixMode(GL_PROJECTION); //работа с проекционной матрицой glLoadIdentity(); //загрузка единичной матрицы gluOrtho2D(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2); //определяем двухмерную ортографическую проекцию glMatrixMode(GL_MODELVIEW); //работа с модельно-видовой матрицей } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(WinWidth, WinHeight); glutInitWindowPosition(100, 100); glutCreateWindow("LemniscateFlower"); glutDisplayFunc(Draw); //Draw() отвечает за рисование glutTimerFunc(0,Timer,0); //инициализация таймера Initialize(); glutMainLoop(); return 0; }
Прикрепленный файл | Размер |
---|---|
kontrolskiy_lemnicircles.zip | 153.07 кб |