Исходный файл (2000 × 2000 пикселей, размер файла: 454 КБ, тип MIME: image/png )
ОписаниеLCMJ кролик.png | Русский: Кривые уровня времени спасения (внешнего) и времени притяжения (внутреннего) для c = -0,122561166876654 +0,7448617666197448*I, параметр функции fc(z)=z^2 + c Сама граница множества Жюлиа не нарисована: мы видим ее как геометрическое место точек, где границы кривых уровня особенно близки друг к другу. |
Дата | |
Источник | Собственная работа |
Автор | Адам Маевский |
Другие версии |
|
Смотрите также:
полином 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 ; }
/* Адам Маевски 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 ; }