Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
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.zip7.57 кб
DurerStar_windows.zip164.98 кб