Kwwiker

звёздочка

Dec 23rd, 2020
807
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define GL_GLEXT_PROTOTYPES
  2.     #include <GL/gl.h>
  3.     #include <GL/glut.h>
  4.     #include <GL/glu.h>
  5.     #include <math.h>
  6.     using namespace std;
  7.  
  8.     /* Обьявление функции, которая будет рисовать фрактал */
  9.     void func(double x, double y, double radius,double angle,int deep);
  10.  
  11.     /* Функция, прорисовывающая изображение в окне */
  12.     void display(void){
  13.  
  14.       /* Очистка экрана цветом по-умолчанию */
  15.       glClear (GL_COLOR_BUFFER_BIT);
  16.  
  17.       /* Задание цвета для рисования */
  18.       glColor3f(1.0f,0.2f,0.5f);
  19.  
  20.       /* Начало рисования. Вершины 2n и 2n+1 будут обьединены в линию*/
  21.       glBegin(GL_LINES);
  22.  
  23.       /* Вызов функции, рисующей фрактал. В функции передаются вершины в буфер */
  24.       func(55,50,20,0,7);
  25.  
  26.       /* Функция, выгружающая буфер в сцену */
  27.       glEnd();
  28.  
  29.       /*  Прорисовка текущего буфера */
  30.       glFlush ();
  31.     }
  32.  
  33.     /* Функция, определённая выше */
  34.     void func(double x, double y, double radius,double angle,int deep){
  35.  
  36.       /* Для уменьшения кода в строках вводятся эти переменные
  37.         pi5 равна Пи, делённой на 5
  38.         h равна расстоянию от центра большего пятиугольника к центрам меньших      
  39.       */
  40.       double pi5=3.141596/5;
  41.       double h=2*radius*cos(pi5);
  42.  
  43.       for(int i=0;i<5;i++){
  44.         /*
  45.           Вычисление некоторых параметров для рисования их на экране
  46.           ang2 Поворот относительно центрального пятиугольника на 360/5 градусов
  47.           x2 центр меньшего пятиугольника
  48.           y2 центр меньшего пятиугольника
  49.           ang3 уголь, на который нужно повернуть вершину изначально
  50.           rad расстояние до каждого из углов меньшего пятиугольника от его центра          
  51.         */
  52.         double ang2=angle+pi5*i*2,
  53.         x2=x-h*cos(ang2),
  54.         y2=y-h*sin(ang2),
  55.         rad2=radius/(2*cos(pi5)+1),
  56.         ang3=angle+3.141596+(2*i+1)*pi5;
  57.         for(int j=0;j<4;j++){
  58.           /* В буфер записываются вершины. Эти две вершины будут соединены в прямые между собой*/
  59.           glVertex2f(x+rad2*cos(ang3+j*pi5*2),y+rad2*sin(ang3+j*pi5*2));
  60.           glVertex2f(x+rad2*cos(ang3+(j+1)*pi5*2),y+rad2*sin(ang3+(j+1)*pi5*2));
  61.         }
  62.         /* Условие выхода из рекурсии. Из максимальной глубины рекурсии не строятся меньшие пятиугольники*/
  63.         if(deep>0)func(x2,y2,radius/(2*cos(pi5)+1),angle+3.141596+(2*i+1)*pi5,deep-1);
  64.       }
  65.     }
  66.  
  67.     void init (void){
  68.       /* Установка цвета по-умолчанию */
  69.       glClearColor (0.0, 0.0, 0.0, 0.0);
  70.       /* Задаются параметры сцены. Матрица преобразований для проекции, координаты сдвигаются в 0 и границы экрана устанавливаются в заданные*/
  71.       glMatrixMode(GL_PROJECTION);
  72.       glLoadIdentity();
  73.       glOrtho(0.0, 100.0, 0.0, 100.0, -100.0, 100.0);
  74.     }
  75.     /* Позволяет закрыть программу нажатием клавиши "эскейп" */
  76.     void processNormalKeys(unsigned char key, int x, int y) {
  77.       if (key == 27)
  78.         exit(0);
  79.     }
  80.  
  81.  
  82.     int main(int argc, char** argv){
  83.     /* Инициализируются буферы для glut-a*/
  84.       glutInit(&argc, argv);
  85.     /* Задаются режимы смешивания цветов и количество буферов*/
  86.       glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
  87.     /* Задаётся размер окна 500 на 500*/  
  88.       glutInitWindowSize (500, 500);
  89.     /* Окно сдвигается на 100 единиц по икс и по игрек */
  90.       glutInitWindowPosition (100, 100);
  91.     /* Создаётся окно с названием, размером и смещениями, которые были указаны */  
  92.       glutCreateWindow ("Fractal");
  93.     /* Вызывается функция инициализации, задания начальных параметров */  
  94.       init ();
  95.     /* Устанвливается фукция прорисовки, переданная как параметр */  
  96.       glutDisplayFunc(display);
  97.     /* Задаётся функция, которая будет обрабатывать нажатия клавиш*/  
  98.       glutKeyboardFunc(processNormalKeys);
  99.     /* Начинается выполнение прорисовки и обработка клавиш*/  
  100.       glutMainLoop();
  101.       return 0;
  102.     }
RAW Paste Data