Язык программирования:
C/C++
Среда программирования:
microsoft visual studio 2013
#include <glut.h> #include <math.h> #include <stdlib.h> #include <iostream> using namespace std; float angle ; //переменная увеличивающая градус float angle2 ;//переменная уменьшающая градус int t = 500; //кол-во рисуемых линий float x; //координаты x float y;//координаты y //сохранение пропорций void proporsion(int w, int h) { if (h==0) { h=1; } float ratio = float(w)/h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45,ratio,500,500); glMatrixMode(GL_MODELVIEW); } //рисование void paint(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очистка буфера glLineWidth(3); //задание толщины линии glPushMatrix();//сохранение матрицы glBegin(GL_LINE_STRIP);//рисование замкнутых ломаных glColor3ub(255, 255, 255);//установка цвета //рисование верхнего круга for (int i = 0; i <= t; i++) { float a = (float)i / (float)t * 3.1415f * 2;// 360 градусов x = sin(a)*3.5; y = cos(a)/1.2+3.8; glVertex2f(x, y);//рисуем точки по которым будет проводиться линия } glEnd();//завершение glBegin glPopMatrix();//восстановление матрицы //рисование нижнего круга glPushMatrix(); glBegin(GL_LINE_STRIP); glColor3ub(255, 255, 255); for (int i = 0; i <= t; i++) { float a = (float)i / (float)t * 3.1415f * 2; x = sin(a)*3.0; y = cos(a)*1.6-2.9; glVertex2f(x, y); } glEnd(); glPopMatrix(); //рисование линий glPushMatrix(); glBegin(GL_LINES); glColor3ub(255, 0, 0); float a = 3.1415f * 1.0;//180 градусов float a1 = 3.1415f * angle;//увеличение градуса //цикл в котором создается 36 линий с одинаковым промежутком в 10 градусов, вершины которых лежат на верхнем и нижнем кругах for(int i = 0; i < 36; i++) { //верхняя точка x = cos(a1-(a/18)*i)*3.5; y = (sin(a1-(a/18)*i))/1.2+3.8; glVertex2f(x, y); //нижняя точка x = sin(a1+(a/18)*i)*3.0; y = (cos(a1+(a/18)*i)*1.6-2.9); glVertex2f(x, y); } glEnd(); glPopMatrix(); glutSwapBuffers(); } //установка таймера void Timer(int) { angle = angle + 0.01 + angle2;//меняет положение вершин линий if(angle > 0.5 )//когда произошел сдвиг на 90 градусов начинает обратное движение { angle2 = -0.02; } if(angle < 0)//когда вернулось начальное положение повторяем увеличение снова { angle2 = 0; } glutTimerFunc(15,Timer,0);//обновлять экран каждые 15мсек glutPostRedisplay();//обновляет экран } int main(int argc, char **argv) { // инициализация glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);// буфер рисования и буф сторонних вычислений glutInitWindowPosition(100, 100);//позиция окна glutInitWindowSize(500, 500);//размеры окна glutCreateWindow("Twisted cylinder");//название окна glClearColor(0.0, 0.0, 0.0, 1.0);//цвет окна glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);//установка границ glutDisplayFunc(paint);//вызов функции рисования glutReshapeFunc(proporsion);//вызов функции сохранения пропорций glutTimerFunc(0,Timer,0);//вызов таймера glutMainLoop();//основной цикл return 1; }
Прикрепленный файл | Размер |
---|---|
Bruns_cylinder.rar | 745.92 кб |