Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define GL_GLEXT_PROTOTYPES
- #include <GL/gl.h>
- #include <GL/glut.h>
- #include <GL/glu.h>
- #include <math.h>
- using namespace std;
- /* Обьявление функции, которая будет рисовать фрактал */
- void func(double x, double y, double radius,double angle,int deep);
- /* Функция, прорисовывающая изображение в окне */
- void display(void){
- /* Очистка экрана цветом по-умолчанию */
- glClear (GL_COLOR_BUFFER_BIT);
- /* Задание цвета для рисования */
- glColor3f(1.0f,0.2f,0.5f);
- /* Начало рисования. Вершины 2n и 2n+1 будут обьединены в линию*/
- glBegin(GL_LINES);
- /* Вызов функции, рисующей фрактал. В функции передаются вершины в буфер */
- func(55,50,20,0,7);
- /* Функция, выгружающая буфер в сцену */
- glEnd();
- /* Прорисовка текущего буфера */
- glFlush ();
- }
- /* Функция, определённая выше */
- void func(double x, double y, double radius,double angle,int deep){
- /* Для уменьшения кода в строках вводятся эти переменные
- pi5 равна Пи, делённой на 5
- h равна расстоянию от центра большего пятиугольника к центрам меньших
- */
- double pi5=3.141596/5;
- double h=2*radius*cos(pi5);
- for(int i=0;i<5;i++){
- /*
- Вычисление некоторых параметров для рисования их на экране
- ang2 Поворот относительно центрального пятиугольника на 360/5 градусов
- x2 центр меньшего пятиугольника
- y2 центр меньшего пятиугольника
- ang3 уголь, на который нужно повернуть вершину изначально
- rad расстояние до каждого из углов меньшего пятиугольника от его центра
- */
- double ang2=angle+pi5*i*2,
- x2=x-h*cos(ang2),
- y2=y-h*sin(ang2),
- rad2=radius/(2*cos(pi5)+1),
- ang3=angle+3.141596+(2*i+1)*pi5;
- for(int j=0;j<4;j++){
- /* В буфер записываются вершины. Эти две вершины будут соединены в прямые между собой*/
- glVertex2f(x+rad2*cos(ang3+j*pi5*2),y+rad2*sin(ang3+j*pi5*2));
- glVertex2f(x+rad2*cos(ang3+(j+1)*pi5*2),y+rad2*sin(ang3+(j+1)*pi5*2));
- }
- /* Условие выхода из рекурсии. Из максимальной глубины рекурсии не строятся меньшие пятиугольники*/
- if(deep>0)func(x2,y2,radius/(2*cos(pi5)+1),angle+3.141596+(2*i+1)*pi5,deep-1);
- }
- }
- void init (void){
- /* Установка цвета по-умолчанию */
- glClearColor (0.0, 0.0, 0.0, 0.0);
- /* Задаются параметры сцены. Матрица преобразований для проекции, координаты сдвигаются в 0 и границы экрана устанавливаются в заданные*/
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0, 100.0, 0.0, 100.0, -100.0, 100.0);
- }
- /* Позволяет закрыть программу нажатием клавиши "эскейп" */
- void processNormalKeys(unsigned char key, int x, int y) {
- if (key == 27)
- exit(0);
- }
- int main(int argc, char** argv){
- /* Инициализируются буферы для glut-a*/
- glutInit(&argc, argv);
- /* Задаются режимы смешивания цветов и количество буферов*/
- glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
- /* Задаётся размер окна 500 на 500*/
- glutInitWindowSize (500, 500);
- /* Окно сдвигается на 100 единиц по икс и по игрек */
- glutInitWindowPosition (100, 100);
- /* Создаётся окно с названием, размером и смещениями, которые были указаны */
- glutCreateWindow ("Fractal");
- /* Вызывается функция инициализации, задания начальных параметров */
- init ();
- /* Устанвливается фукция прорисовки, переданная как параметр */
- glutDisplayFunc(display);
- /* Задаётся функция, которая будет обрабатывать нажатия клавиш*/
- glutKeyboardFunc(processNormalKeys);
- /* Начинается выполнение прорисовки и обработка клавиш*/
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement