^Back To Top
foto1 foto2 foto3 foto4 foto5 foto6 foto7 foto8 foto9 foto10 foto11 foto12 foto13 foto14 foto15 foto16 foto17 foto18 foto19 foto20 foto19

 

 

Фракталы в C++ для Ch--

 

 

Фракталы на простых числах.
Стохастические кривые Коха

 

..... Фракталы, при создании которых случайным образом изменяются какие-либо параметры, называются  стохастическими. Например, таким окажется геометрический фрактал, если в процессе его построения хаотично менять трафарет. Попробуем сконструировать стохастический фрактал из Кривой Коха.

........ Для имитации случайного процесса воспользуемся последовательностью простых чисел натурального ряда. Известно, что каждое последующее простое число предсказать невозможно. 

..... Построение Кривой Коха подробно рассмотрено в разделе «Кривая Коха». Кривая станет стохастической, если при её создании случайным образом направлять трафарет в разные стороны.

 

Создаём проект «stKoch» - «стохастическая Кривая Коха»


..... Способ создания проекта подробно описан в разделе «Совершенствуем ОС Windows».
На первом шаге подключаем к Visual Studio Графическую библиотеку OpenGL. Создаём проект «stKoch».
 Подключаем к нему библиотеку GLUT и в появившемся файле stKoch.cpp всё стираем.


..... В файл stKoch.cpp помещаем программу «fractal» для «Кривой Коха», делаем правку (отмечена зелёным цветом) и программа «stKoch» готова. Итак, ...

Программа «stKoch» - «Стохастическая кривая Коха»


  #include "stdafx.h"
  #include <glut.h>
  #include <cmath>


  int r, n=4, s, t=0;
  const int m=1100;  double knx[m], kny[m], num[m];
  void Traf(double xA,double yA,double xB,double yB, int k)
     {
       knx[k] = xA;  kny[k] = yA;
       knx[k+1] = (2*xA + xB)/3; kny[k+1] = (2*yA + yB)/3;
       knx[k+2] = (xB + xA)/2 + (yA - yB)/(2*sqrt(3.0));
       kny[k+2] = (yB + yA)/2 + (xB - xA)/(2*sqrt(3.0));
      if(s==1){ knx[k+2] = (xB + xA)/2 - (yA - yB)/(2*sqrt(3.0));
                    kny[k+2] = (yB + yA)/2 - (xB - xA)/(2*sqrt(3.0)); }
       knx[k+3] = (xA + 2*xB)/3; kny[k+3] = (yA + 2*yB)/3;
       knx[k+4] = xB;  kny[k+4] = yB;
     }

 void Fract()
    {
       Traf (-1.0, 0.0, 1.0, 0.0, 0);
       for (int j=0; j<n; j++)
       { double kn1x[m], kn1y[m]; r = pow(4.0, j+1);
       for (int i=0; i<=r; i++) { kn1x[i] = knx[i]; kn1y[i] = kny[i]; }
       for (int i=0; i<r;  i++)  { s = fmod(num[i + t], 3);
                 Traf (kn1x[i], kn1y[i], kn1x[i+1], kn1y[i+1], 4*i);} }
    }
 
 void simpl(int m)
    {
      num[0]=2;
      for (int i=0; i<m; i++) { num[i+1] = num[i] + 1;
      for (int k=0; k<i; k++)
      { double r = fmod(num[i],  num[k]);
      if (r==0) { num[i] = num[i] + 1; k = -1; } } }
    }

 void Draw()
    {
      glClear(GL_COLOR_BUFFER_BIT);
      glColor3d(0.0, 0.0, 1.0);
      glLineWidth(2.0);
      glBegin(GL_LINES);
        for (int i=0; i<4*r; i++)
          {
            glVertex2d(knx[i],  kny[i]);
            glVertex2d(knx[i+1],  kny[i+1]);
          }
      glEnd();
      glFinish();
    }

 void main(int argc, char ** argv)
    {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_RGB);
      glutInitWindowPosition(200, 200);
      glutInitWindowSize(400, 400);
      glutCreateWindow("Стохастическая Кривая Коха");
      glClearColor(0.82, 0.95, 0.98, 1.0);
     simpl(m); 
      Fract();
      glutDisplayFunc(Draw);
      glutMainLoop();
    }

 

..... 1. Шапку программы не трогаем.

..... 2. В строку объявления переменных вводим случайный параметр s, номер ячеек t и массив num[ ] для хранения простых чисел.

..... 3. В функцию создания трафарета Traf() для хаотичного изменения направления трафарета добавляем условный оператор.

..... 4. В функцию построения фрактала Fract() вставляем команду присвоения параметру s остатка от деления простого числа на 3, то-есть значения 1 или 2. Поскольку «пути господни в поведении простых чисел неисповедимы», единицы и двойки появятся «случайно».

..... 5. Для расчёта простых чисел используем готовую программу simple, которая описана в главе «Распределение простых чисел». Функция simpl() в данной программе содержит только те операторы, которые заполняют ячейки массива num[ ] простыми числами.

..... 6. Функция рисования Draw() не изменится.

..... 7. В основную функцию main() добавляем оператор обращения к функции вычисления простых чисел simpl(m).

..... Программа stKoch готова. Меняя значение в строке объявления переменных, получаем:

..... Параметр t представляет номер ячйки, в которой содержится простое число. На первой картинке Кривая Коха порождается числом 2. На второй кривая соответствует простому числу 5. Последняя картинка внизу - статистическая кривая для простого числа p = 23.