Файл:LCMJ rabbit.png

Исходный файл (2000 × 2000 пикселей, размер файла: 454 КБ, тип MIME: image/png )

Краткое содержание

ОписаниеLCMJ кролик.png
Русский: Кривые уровня времени спасения (внешнего) и времени притяжения (внутреннего) для c = -0,122561166876654 +0,7448617666197448*I, параметр функции fc(z)=z^2 + c Сама граница множества Жюлиа не нарисована: мы видим ее как геометрическое место точек, где границы кривых уровня особенно близки друг к другу.
Дата
ИсточникСобственная работа
АвторАдам Маевский
Другие версии

Лицензирование

Я, владелец авторских прав на данную работу, настоящим публикую ее на условиях следующей лицензии:
w:ru:Creative Commons
атрибуция доля одинаково
Этот файл лицензирован в соответствии с лицензией Creative Commons Attribution-Share Alike 4.0 International.
Вы свободны:
  • делиться – копировать, распространять и передавать работу
  • ремиксовать – адаптировать произведение
При следующих условиях:
  • атрибуция – Вы должны указать соответствующее авторство, предоставить ссылку на лицензию и указать, были ли внесены изменения. Вы можете сделать это любым разумным способом, но не таким образом, который подразумевает, что лицензиар одобряет вас или ваше использование.
  • распространяйте на равных условиях – если вы делаете ремиксы, преобразуете или дополняете материал, вы должны распространять свои вклады по той же или совместимой лицензии, что и оригинал.
https://creativecommons.org/licenses/by-sa/4.0CC BY-SA 4.0Creative Commons Attribution-Share Alike 4.0истинныйистинный

Сравнить с

Смотрите также:

  • Кривые уровня множества Мандельброта
  • Рисунок 39 на странице 189 из книги Дж. Милнора: Динамика в одной комплексной переменной (2006, третье издание). Рисунок Милнора показывает кривые уровня потенциала (не время выхода)
  • "Уши кролика" набор Джулия [1]

Краткое содержание

полином p(z)=(1+0i)*z^2+(-0,12256116687665399856+0,74486176661974401458i)Найдено 1 критических точекcp#0: 0,0. Его критическая орбита ограничена и входит в цикл #0 длиной = 3, а его устойчивость = |множитель|=4.3811e-15 =привлекательнаяцикл = {-0.12256116687665399856,0.74486176661974401458 ; -0.66235897862237291811,0.56227951206230053494 ; 3.0531133177191804862e-16,7.771561172376095783e-16 ; }

c исходный код

/* Адам Маевски  adammaj1 aaattt o2 dot pl // o как кислород, а не 0 как ноль  консольная программа на языке программирования C  ==================================================  Структура программы или как проанализировать программу  =============== Изображение X ==========================  DrawImageOfX -> DrawPointOfX -> ComputeColorOfX  первые 2 функции идентичны для каждого X,  проверьте только последнюю функцию = ComputeColorOfX  , которая вычисляет цвет одного пикселя!             =========================================  ---------------------------------  отступ dc  по умолчанию в стиле gnu  ------------------- c консольная программа экспорт OMP_DISPLAY_ENV="TRUE" 	gcc dc -lm -Wall -march=native -fopenmp 	время ./a.out > b.txt  gcc dc -lm -Wall -march=native -fopenmp время ./a.out время ./a.out >a.txt ----------------------*/#include <stdio.h> #include <stdlib.h> // malloc #include <string.h> // strcat #include <math.h> // M_PI; также требуется -lm #include <complex.h> #include <omp.h> // OpenMP      /* --------------------------------- глобальные переменные и константы ------------------------------------------------------------- */// виртуальный 2D-массив и целочисленная (экранная) координата // Индексы массива начинаются с 0, а не с 1 // unsigned int ix, iy; // var static unsigned int ixMin = 0 ; // Индексы массива начинаются с 0, а не с 1 static unsigned int ixMax ; // static unsigned int iWidth ; // горизонтальное измерение массива           static unsigned int iyMin = 0 ; // Индексы массива начинаются с 0, а не с 1 static unsigned int iyMax ; //        static unsigned int iHeight = 10000 ; // // Размер массива должен быть положительным постоянным целым числом static unsigned int iSize ; // = iWidth*iHeight;        // одномерный массив памяти unsigned char * data ; unsigned char * edge ; unsigned char * edge2 ;      // unsigned int i; // var = индекс одномерного массива //static unsigned int iMin = 0; // Индексы массива начинаются с 0, а не с 1 static unsigned int iMax ; // = i2Dsize-1 = // Размер массива должен быть положительным постоянным целым числом // unsigned int i1Dsize ; // = i2Dsize = (iMax -iMin + 1) = ; одномерный массив того же размера, что и двумерный массив   static const double ZxMin = -2.0 ; //-0.05; static const double ZxMax = 2.0 ; //0.75; static const double ZyMin = -2.0 ; //-0.1; static const double ZyMax = 2.0 ; //0.7; static double PixelWidth ; // =(ZxMax-ZxMin)/ixMax; static double PixelHeight ; // =(ZyMax-ZyMin)/iyMax; static double ratio ;                          // комплексные числа плоскости параметров double complex c = -0.122561166876654 + 0.7448617666197448 * I ; // период = 3; // параметр функции fc(z)=z^2 + c      целочисленный период = 3 ;   static unsigned long int iterMax = 1000000 ; //iHeight*100;      static double ER = 200.0 ; // EscapeRadius для теста аварийного выхода double ER2 ; double AR ; double AR2 ;        double BoundaryWidth = 3.0 ; double distanceMax ; //distanceMax = BoundaryWidth*PixelWidth;     /* цвета = оттенки серого от 0 до 255 */ unsigned char iColorOfExterior = 250 ; unsigned char iColorOfInterior = 200 ; unsigned char iColorOfInterior1 = 210 ; unsigned char iColorOfInterior2 = 180 ; unsigned char iColorOfBoundary = 0 ; unsigned char iColorOfUnknown = 30 ;                        /* ------------------------------------------ функции --------------------------------------------------------------*///------------------комплексные числа -----------------------------------------------------// из экранных в мировые координаты; линейное отображение // использует глобальные константы double GiveZx ( int ix ) { return ( ZxMin + ix * PixelWidth ); }          // использует глобальные константы double GiveZy ( int iy ) { return ( ZyMax - iy * PixelHeight ); } // обратная ось y          комплексный двойной GiveZ ( int ix , int iy ) { двойной Zx = GiveZx ( ix ); двойной Zy = GiveZy ( iy ); вернуть Zx + Zy * I ;                  }// ****************** ДИНАМИКА = тесты ловушек (целевые наборы) ****************************двойные кабины2 ( комплекс двойной z ){   вернуть creal ( z ) * creal ( z ) + cimag ( z ) * cimag ( z ); }// тест на спасение // z сбегает, когда // abs(z)> ER или cabs2(z)> ER2 // https://en.wikibooks.org/wiki/Fractals/Iterations_in_the_complex_plane/Julia_set#Boolean_Escape_timeint Escapes ( complex double z ){ // здесь целевое множество (ловушка) — это внешняя окружность с радиусом = ER ( EscapeRadius) // с центром = началом z= 0 // на сфере Римана это окружность с точкой на бесконечности в качестве центра if ( cabs2 ( z ) > ER2 ) return 1 ; return 0 ; }             int Sinks ( complex double z ){ // здесь целевое множество (ловушка) - это внутренняя часть круга с радиусом = AR ( AttractingRadius) // с ceter = origin z= 0 , здесь z=0 - это точка суперпритягивающего цикла if ( cabs2 ( z ) < AR2 ) return 1 ; return 0 ; }              /* ----------- функции массива = рисование -------------- *//* возвращает позицию 2D-точки (ix,iy) в 1D-массиве; также использует глобальную переменную iWidth */ unsigned int Give_i ( unsigned int ix , unsigned int iy ) { return ix + iy * iWidth ; }              // *********************************************************************************************** // ************************ обнаружение краев с помощью фильтра Собеля *************************************** // **********************************************************************************************// от источника к месту назначения int ComputeBoundaries ( unsigned char S [], unsigned char D []) { unsigned int iX , iY ; /* индексы двумерного виртуального массива (изображение) = целочисленная координата */ unsigned int i ; /* индекс одномерного массива */ /* фильтр Собеля */ unsigned char G , Gh , Gv ; // границы находятся в массиве D ( global var ) // очистить массив D memset ( D , iColorOfExterior , iSize * sizeof ( * D )); // для массивов, выделенных в куче, где N - количество элементов = FillArrayWithColor( D , iColorOfExterior); // printf(" найти границы в массиве S с помощью фильтра Собеля\n"); #pragma omp parallel for schedule(dynamic) private(i,iY,iX,Gv,Gh,G) shared(iyMax,ixMax) for ( iY = 1 ; iY < iyMax -1 ; ++ iY ){ for ( iX = 1 ; iX < ixMax -1 ; ++ iX ){ Gv = S [ Give_i ( iX -1 , iY + 1 )] + 2 * S [ Give_i ( iX , iY + 1 )] + S [ Give_i ( iX -1 , iY + 1 )] - S [ Give_i ( iX -1 , iY -1 )] - 2 * S [ Give_i ( iX -1 , iY )] - S [ Give_i ( iX + 1 , iY -1 )]; Gh = S [ Дать_i ( iX + 1 , iY + 1 )] +                                                   2 * S [ Give_i ( iX + 1 , iY )] + S [ Give_i ( iX -1 , iY -1 )] - S [ Give_i ( iX + 1 , iY -1 )] - 2 * S [ Give_i ( iX -1 , iY )] - S [ Give_i ( iX -1 , iY -1 )]; G = sqrt ( Gh * Gh + Gv * Gv ); i = Give_i ( iX , iY ); /* вычислить индекс одномерного массива из индексов двумерного массива */ if ( G == 0 ) { D [ i ] = 255 ;} /* фон */ else { D [ i ] = 0 ;} /* граница */ } } return 0 ; }                              // копирование из источника в назначение int CopyBoundaries ( unsigned char S [], unsigned char D []) { unsigned int iX , iY ; /* индексы двумерного виртуального массива (изображение) = целочисленная координата */ unsigned int i ; /* индекс одномерного массива */ //printf("копировать границы из массива S в массив D \n"); for ( iY = 1 ; iY < iyMax -1 ; ++ iY ) for ( iX = 1 ; iX < ixMax -1 ; ++ iX ) { i = Give_i ( iX , iY ); if ( S [ i ] == 0 ) D [ i ] = 0 ;} return 0 ; }                              // ************************************************* ************************************************* ************************* // ************************* *** DEM/J****************************************** // * ************************************************* ************************************************* ***********************unsigned char ComputeColorOfDEMJ ( комплексное двойное z ) { // https://en.wikibooks.org/wiki/Fractals/Iterations_in_the_complex_plane/Julia_set#DEM.2FJ      int nMax = iterMax ; complex double dz = 1.0 ; // первая производная по z. double distance ; double cabsz ; int n ;                for ( n = 0 ; n < nMax ; n ++ ){ //прямая итерация cabsz = cabs ( z ); if ( cabsz > 1e60 || cabs ( dz ) > 1e60 ) break ; // большие значения if ( cabsz < PixelWidth ) return iColorOfInterior ; // попадает в конечный аттрактор = interior dz = 2.0 * z * dz ; z = z * z + c ; /* прямая итерация: комплексный квадратичный полином */ } distance = 2.0 * cabsz * log ( cabsz ) / cabs ( dz ); if ( distance < distanceMax ) return iColorOfBoundary ; // distanceMax = BoundaryWidth*PixelWidth; // иначе return iColorOfExterior ;                                                          }// рисует растровую точку (ix,iy) int DrawPointOfDEMJ ( unsigned char A [], int ix , int iy ) { int i ; /* индекс одномерного массива */ unsigned char iColor ; complex double z ;                 i = Give_i ( ix , iy ); /* вычислить индекс одномерного массива из индексов двумерного массива */ z = GiveZ ( ix , iy ); iColor = ComputeColorOfDEMJ ( z ); A [ i ] = iColor ; // внутренний return 0 ; }                 // заполнение массива // использует глобальную переменную : ... // сканирование комплексной плоскости int DrawImagerOfDEMJ ( unsigned char A []) { unsigned int ix , iy ; // координата пикселя         //printf("вычислить изображение \n"); // для всех пикселей изображения #pragma omp parallel for schedule(dynamic) private(ix,iy) shared(A, ixMax , iyMax) for ( iy = iyMin ; iy <= iyMax ; ++ iy ){ printf ( " %d from %d \r " , iy , iyMax ); //информация for ( ix = ixMin ; ix <= ixMax ; ++ ix ) DrawPointOfDEMJ ( A , ix , iy ); // }                          вернуть 0 ; } // ***************************************************************************************************************************** // ************************** Неизвестно: граница и медленная динамика ***************************************** // ****************************************************************************************************************************беззнаковый символ ComputeColorOfUnknown ( комплексный двойной z ){      int nMax = 20 ; // очень низкое значение double cabsz ; int n ;          for ( n = 0 ; n < nMax ; n ++ ){ //прямая итерация cabsz = cabs ( z ); if ( cabsz > 10000000000 * ER ) return iColorOfExterior ; // большие значения if ( cabsz < ( PixelWidth / 100 )) return iColorOfInterior ; // попадает в конечный аттрактор = interior z = z * z + c ; /* прямая итерация: комплексный квадратичный полином */ } //printf("found \n"); return iColorOfUnknown ;                                         }// рисует растровую точку (ix,iy) int DrawPointOfUnknown ( unsigned char A [], int ix , int iy ) { int i ; /* индекс одномерного массива */ unsigned char iColor ; complex double z ;                 i = Give_i ( ix , iy ); /* вычислить индекс одномерного массива из индексов двумерного массива */ z = GiveZ ( ix , iy ); iColor = ComputeColorOfUnknown ( z ); A [ i ] = iColor ; // внутренний return 0 ; }                 // заполнить массив // использует глобальную переменную : ... // сканирование комплексной плоскости int DrawImagerOfUnknown ( unsigned char A []) { unsigned int ix , iy ; // координата пикселя         //printf("вычислить изображение \n"); // для всех пикселей изображения #pragma omp parallel for schedule(dynamic) private(ix,iy) shared(A, ixMax , iyMax) for ( iy = iyMin ; iy <= iyMax ; ++ iy ){ //printf (" %d from %d \r", iy, iyMax); //info for ( ix = ixMin ; ix <= ixMax ; ++ ix ) DrawPointOfUnknown ( A , ix , iy ); // }                       вернуть 0 ; } // ***************************************************************************************************************************** // ***************************************************************************************************************unsigned char ComputeColorOfLSM ( комплексное двойное z ){     int nMax = 255 ; double cabsz2 ; беззнаковый символ iColor ; int n ;           for ( n = 0 ; n < nMax ; n ++ ){ //прямая итерация cabsz2 = cabs2 ( z ); if ( cabsz2 > ER2 ) break ; // выход if ( cabsz2 < AR2 ) break ; // провал в конечный аттрактор = интерьер z = z * z + c ; /* прямая итерация: комплексный квадратичный полином */ } iColor = 255 - 255.0 * (( double ) n ) / 20 ; // nMax или меньшие значения в знаменателе return iColor ;                                          }// рисует растровую точку (ix,iy) int DrawPointOfLSM ( unsigned char A [], int ix , int iy ) { int i ; /* индекс одномерного массива */ unsigned char iColor ; complex double z ;                 i = Give_i ( ix , iy ); /* вычислить индекс одномерного массива из индексов двумерного массива */ z = GiveZ ( ix , iy ); iColor = ComputeColorOfLSM ( z ); A [ i ] = iColor ; // внутренний return 0 ; }                 // заполнить массив // использует глобальную переменную : ... // сканирование комплексной плоскости int DrawImagerOfLSM ( unsigned char A []) { unsigned int ix , iy ; // координата пикселя         //printf("вычислить изображение \n"); // для всех пикселей изображения #pragma omp parallel for schedule(dynamic) private(ix,iy) shared(A, ixMax , iyMax) for ( iy = iyMin ; iy <= iyMax ; ++ iy ){ printf ( " %d from %d \r " , iy , iyMax ); //информация for ( ix = ixMin ; ix <= ixMax ; ++ ix ) DrawPointOfLSM ( A , ix , iy ); // }                          вернуть 0 ; } // ***************************************************************************************************************************** // ***************************************************************************************************************беззнаковый символ ComputeColorOfBD ( комплексный двойной z ){     int nMax = 255 ; double cabsz ; беззнаковый символ iColor ; int n ;           for ( n = 0 ; n < nMax ; n ++ ){ //прямая итерация cabsz = cabs ( z ); if ( cabsz > ER ) break ; // выход if ( cabsz < PixelWidth ) break ; // провал в конечный аттрактор = интерьер z = z * z + c ; /* прямая итерация: комплексный квадратичный полином */ } if ( creal ( z ) > 0.0 ) iColor = 255 ; else iColor = 0 ; return iColor ;                                             }// рисует растровую точку (ix,iy) int DrawPointOfBD ( unsigned char A [], int ix , int iy ) { int i ; /* индекс одномерного массива */ unsigned char iColor ; complex double z ;                 i = Give_i ( ix , iy ); /* вычислить индекс одномерного массива из индексов двумерного массива */ z = GiveZ ( ix , iy ); iColor = ComputeColorOfBD ( z ); A [ i ] = iColor ; // внутренний return 0 ; }                 // заполнить массив // использует глобальную переменную : ... // сканирование комплексной плоскости int DrawImagerOfBD ( unsigned char A []) { unsigned int ix , iy ; // координата пикселя         //printf("вычислить изображение \n"); // для всех пикселей изображения #pragma omp parallel for schedule(dynamic) private(ix,iy) shared(A, ixMax , iyMax) for ( iy = iyMin ; iy <= iyMax ; ++ iy ){ printf ( " %d from %d \r " , iy , iyMax ); //информация for ( ix = ixMin ; ix <= ixMax ; ++ ix ) DrawPointOfBD ( A , ix , iy ); // }                          вернуть 0 ; }