int main(){ unsigned int iX,iY, /* indices of 2D virtual array (image) = integer coordinate */ i; /* index of 1D array */ double Kx, Ky; // K is a coordinate from K-plane double Cx,Cy; // c is a coordinate from c-plane = parameter plane with Mandelbrot set int //LastIteration, period; /* color */ //unsigned char ColorList[]={255,230,180}; /* two dynamic 1D arrays for colors ( shades of gray ) */ unsigned char *data, *edge; data = malloc( iLength * sizeof(unsigned char) ); edge = malloc( iLength * sizeof(unsigned char) ); if (data == NULL || edge==NULL) { fprintf(stderr," Could not allocate memory"); return 1; } else printf(" memory is OK\n"); printf(" find components of Mandelbrot set and save them to the data array \n"); for(iY=0;iY<iYmax;++iY){ Ky=KyMin + iY*PixelHeight; /* */ if (fabs(Cy)<PixelHeight/2) Cy=0.0; /* use it for interior , not for boundary */ printf("Period row %u from %u \n",iY, iYmax); for(iX=0;iX<iXmax;++iX){ Kx=KxMin + iX*PixelWidth; Cx = GiveCx(Kx,Ky); Cy = GiveCy(Kx,Ky); period = GivePeriod(Cx,Cy, IterationMax, PixelWidth); i= f(iX,iY); /* compute index of 1D array from indices of 2D array */ if ( period == 0 ) data[i]=iExterior; else data[i]=period; /* interior */ /* if (Cx>0 && Cy>0) data[i]=255-data[i]; check the orientation of Z-plane by marking first quadrant */ } } printf(" find boundaries of components of Mandelbrot set in data array using Sobel filter and save to edge array \n"); unsigned char G, Gh, Gv; /* sobel filter */ for(iY=1;iY<iYmax-1;++iY){ for(iX=1;iX<iXmax-1;++iX){ Gv= data[f(iX-1,iY+1)] + 2*data[f(iX,iY+1)] + data[f(iX-1,iY+1)] - data[f(iX-1,iY-1)] - 2*data[f(iX-1,iY)] - data[f(iX+1,iY-1)]; Gh= data[f(iX+1,iY+1)] + 2*data[f(iX+1,iY)] + data[f(iX-1,iY-1)] - data[f(iX+1,iY-1)] - 2*data[f(iX-1,iY)] - data[f(iX-1,iY-1)]; G = sqrt(Gh*Gh + Gv*Gv); i= f(iX,iY); /* compute index of 1D array from indices of 2D array */ if (G==0) {edge[i]=255;} /* background */ else {edge[i]=iBoundary;} /* boundary */ } } printf(" find boundary of Mandelbrot set using DEM/M \n"); for(iY=0;iY<iYmax;++iY){ printf(" DEM row %u from %u \n",iY, iYmax); distanceMax=PixelWidth*iY/iYmax; for(iX=0;iX<iXmax;++iX){ i= f(iX,iY); /* compute index of 1D array from indices of 2D array */ if ( data[i]==iExterior ) { Ky=KyMin + iY*PixelHeight; //if (fabs(Cy)<PixelHeight/2) Cy=0.0; /* use it for interior , not for boundary */ Kx=KxMin + iX*PixelWidth; Cx = GiveCx(Kx,Ky); Cy = GiveCy(Kx,Ky); if (mDist(Cx,Cy,IterationMax+iY)<distanceMax) data[i]=iBoundary;} else data[i]= iInterior; /* if (Cx>0 && Cy>0) data[i]=255-data[i]; check the orientation of Z-plane by marking first quadrant */ } } printf(" copy components boundaries from edge to data array \n"); for(iY=1;iY<iYmax-1;++iY){ for(iX=1;iX<iXmax-1;++iX) {i= f(iX,iY); /* compute index of 1D array from indices of 2D array */ if (edge[i]==iBoundary) data[i]=iBoundary;}} /* ---------- file -------------------------------------*/ printf(" save data array to the pgm file \n"); FILE * fp; char name [10]; /* name of file */ i = sprintf(name,"a%um%u",m,iXmax); /* result (is saved in i) but is not used */ char *filename =strcat(name,".pgm"); char *comment="# ";/* comment should start with # */ const unsigned int MaxColorComponentValue=255; /* color component is coded from 0 to 255 ; it is 8 bit color file */ /* save image to the file */ fp = fopen(filename,"wb"); /*create new file,give it a name and open it in binary mode */ fprintf(fp,"P5\n %s\n %u\n %u\n %u\n",comment,iXmax,iYmax,MaxColorComponentValue); /*write header to the file*/ fwrite(data,iLength,1,fp); /*write image data bytes to the file in one step */ printf("File %s saved. \n", filename); fclose(fp); /* --------------free memory ---------------------*/ free(data); free(edge); return 0; }
Pt2d<Fonc_Num> cParamIFDistPolynXY::VirtualDist(Pt2d<Fonc_Num> aP,bool UsePC,int aKCam) { return mDist(aP); }