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

Вход на сайт

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

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

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

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

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

Яндекс.Метрика Рейтинг@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 кб