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

Вход на сайт

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

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

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

Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...
Как реализовать в данном примере границы расчёта?

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

Рейтинг@Mail.ru Яндекс.Метрика

Вероятно, нельзя привести пример такого компьютерного эксперимента, который впечатлением от результатов превосходил бы то чувство удивления, и восхищения, которое вызывает графическое построение множеств Мандельброта и множества Жюлиа на плоскости. Эти множества относятся к хаотической динамике на комплексной плоскости.

Начнём с самого понятия. Множество Мальденброта – это множество комплексных чисел, которые удовлетворяют следующим условиям:

где: Z0=c
Zn+1=Z2n+c

Ниже я хочу вам продемонстрировать как будет выглядеть Множество Мальденброта в программном виде:

            double MinRe = -2.5;
            double MaxRe = 1.0;
            double MinIm = -1;
            double MaxIm = 1;
 
            double Re_factor = (MaxRe - MinRe);
            double Im_factor = (MaxIm - MinIm);
 
            int MaxIterations = 100;
 
            for (double y = 0; y < _ymax; y+=0.001)
            {
                double c_im = MaxIm - y * Im_factor;
 
                for (double x = 0; x < _xmax; x+=0.001)
                {
                    double c_re = MinRe + x * Re_factor;
 
                    double Z_re = c_re, Z_im = c_im;
 
                    bool isInside = true;
 
                    for (int n = 0; n < MaxIterations; ++n)
                    {
                        double Z_re2 = Z_re * Z_re, Z_im2 = Z_im * Z_im;
                        if (Z_re2 + Z_im2 > 4)
                        {
                            isInside = false;
                            break;
                        }
 
                        Z_im = 2 * Z_re * Z_im + c_im;
                        Z_re = Z_re2 - Z_im2 + c_re;
                    }
                    if (isInside) { _graph.SetPixel(Xs(x), Ys(y), Color.Black); }
                }
            }

Множество Жюлиа – это множество комплексных чисел, которые удовлетворяют следующим условиям:

где: Z0 = K
Zn+1=Z2n+K

Множество Жюлиа в програмном виде:

 double MinRe = -2.5;
            double MaxRe = 1.0;
            double MinIm = -1;
            double MaxIm = 1;
 
            double Re_factor = (MaxRe - MinRe);
            double Im_factor = (MaxIm - MinIm);
 
            //double c_re = -0.1;
            double c_re = 0;
            double c_im = -0.156;
            double _zp = 0.3;
            int MaxIterations = 100;
 
          for (_zp = 0; _zp <= 6; _zp += 0.5)
                {
                    c_re = -0.8;
                    for (double y = _ymin; y < _ymax; y += 0.001)
                    {
                        for (double x = _xmin; x < _xmax; x += 0.001)
                        {
                            double Z_re = x, Z_im = y;
 
                            bool isInside = true;
 
                            for (int n = 0; n < MaxIterations; ++n)
                            {
                                double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
                                if (Z_re2 + Z_im2 > 16)
                                {
                                    isInside = false;
                                    break;
                                }
 
                                Z_im = 2*Z_re*Z_im + c_im;
                                Z_re = Z_re2 - Z_im2 + c_re;
                            }
 
                            if (isInside)
                            {
                                if (((Graph3dX(x, _zp) > _xmin) && (Graph3dX(x, _zp) < _xmax) &&
                                     (Graph3dY(y, _zp) < _ymax) && Graph3dY(y, _zp) > _ymin))
                                {
                                    _graph.SetPixel(Xs(Graph3dX(x, _zp)), Ys(Graph3dY(y, _zp)), Color.Black);
                                }
 
                                //_graph.SetPixel(Xs(x), Ys(y), Color.Black);
                            }
                        }
                    }
                }

Отличие множества Жюлиа от множества Мальденброта состоит в том, что в данном случае мы изначально фиксируем некоторое комплексное число K и начинаем наши вычисления с постоянным K. При построении множества Мальденброта мы должны были просчитывать каждый раз новое c.