Среда программирования:
Geany
Статья по теме:
При запуске исполняемого файла открывается окно, в котором рисуется искомый фрактал.
Код программы:
#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; }
Прикрепленный файл | Размер |
---|---|
DurerStar.zip | 7.57 кб |
DurerStar_windows.zip | 164.98 кб |