Язык программирования:
C/C++
Среда программирования:
Eclipse Mars.2(4.5.2)
#include <cmath> #include <vector> #include <GL/glut.h> #define WIDTH 500 #define HEIGHT 500 using namespace std; int theta = 0; //угол поворота struct Point { double x, y; //координаты точки } point; vector <Point> spiral; //массив точек //получение координат точек void build_spiral () { //построение спирали на отрезке [0, 67pi] с шагом 1 градус for ( double phi = 0; phi <= 67 * M_PI; phi += M_PI / 180 ) { //уравнение архимедовой спирали в декартовых координатах point.x = phi * cos (phi); point.y = phi * sin (phi); spiral.push_back (point); } } void reshape ( int w, int h ) { glViewport ( 0, 0, WIDTH, HEIGHT ); //область вывода glLoadIdentity (); //замена текущей матрицы на единичную gluOrtho2D ( -WIDTH / 2, WIDTH / 2, -HEIGHT / 2, HEIGHT / 2 ); //плоскость отсечения glMatrixMode ( GL_MODELVIEW ); //матрица преобразований } void display () { glClear ( GL_COLOR_BUFFER_BIT ); //очистка текущего буфера цвета glClearColor ( 1.0, 1.0, 1.0, 1.0 ); //цвет фона(RGBA, белый) glColor3ub ( 0, 0, 0 ); //цвет рисования(RGB, черный) glPushMatrix (); //поместить текущую матрицу в стек матриц glRotatef ( theta, 0, 0, 1 ); //повернуть текущую матрицу glScaled ( 1.7, 1.7, 1 ); //масштабирование glLineWidth ( 5 ); //толщина линии //сглаживание glHint ( GL_LINE_SMOOTH_HINT, GL_NICEST ); glEnable ( GL_LINE_SMOOTH ); glEnable ( GL_BLEND ); glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glBegin ( GL_LINES ); for ( unsigned i = 1; i < spiral.size(); i ++ ) { glVertex2d ( spiral[i].x, spiral[i].y ); glVertex2d ( spiral[i - 1].x, spiral[i - 1].y ); } glEnd (); //построение окружности в центре окна glBegin ( GL_TRIANGLE_FAN ); glVertex2d ( 0, 0 ); //центр for( int i = 0; i <= 50; i++ ) { double phi = (double)i / 50.0 * M_PI * 2.0; glVertex2d ( 2.5 * cos ( phi ), 2.5 * sin ( phi ) ); } glEnd (); glPopMatrix (); //вытолкнуть последнюю матрицу из текущего стека матриц glutSwapBuffers (); //переключение буфера кадра } void timer ( int state ) { theta = (theta - 45) % 360; //поворачиваем спираль на 45 градусов по часовой стрелке glutPostRedisplay(); //вызываем функцию перерисовки окна glutTimerFunc ( 80, timer, 0); } int main ( int argc, char** argv ) { glutInit( &argc, argv ); //инициализация OpenGL Utility Toolkit glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); //режим окна(двойной буфер и RGB-палитра) glutInitWindowSize ( WIDTH, HEIGHT ); //установка размеров окна(ширина и высота в пикселях) glutInitWindowPosition ( 200, 30 );//положение окна относительно левого верхнего угла экрана glutCreateWindow ( "Spiral" ); //создание окна build_spiral(); //получение координат спирали glutReshapeFunc ( reshape ); //перерисовка окна glutDisplayFunc ( display );//инициализация функции, отвечающей за рисование в окне glutTimerFunc ( 80, timer, 0); //таймер, срабатывает каждые 80 мс glutMainLoop (); //вход в главный цикл return 0; }
Прикрепленный файл | Размер |
---|---|
kolesnikova_rotating_spiral.zip | 124.9 кб |