File:Colour complex plot.jpg
Size of this preview: 480 × 480 pixels.
This is a file from the Wikimedia Commons. Information from its description page there is shown below.
Commons is a freely licensed media file repository. You can help. |
Contents |
Summary
Description | Colour plot of complex function (x^2-1) * (x-2-I)^2 / (x^2+2+2I), hue represents the argument, sat and value represents the modulus |
Date | 7 August 2007 |
Source | Own work |
Author | Claudio Rocchini |
Permission ( Reusing this file) |
CC-BY 2.5 |
Source Code
C++
This is the complete C++ source code for image generation (you must change the fun funcion to plot another one). You need some complex class implementation.
#include#include using namespace std; const double PI = 3.1415926535897932384626433832795; const double E = 2.7182818284590452353602874713527; void SetHSV(double h, double s, double v, unsigned char colour[3]) { double r, g, b; if(s==0) r = g = b = v; else { if(h==1) h = 0; double z = floor(h*6); int i = int(z); double f = double(h*6 - z); double p = v*(1-s); double q = v*(1-s*f); double t = v*(1-s*(1-f)); switch(i){ case 0: r=v; g=t; b=p; break; case 1: r=q; g=v; b=p; break; case 2: r=p; g=v; b=t; break; case 3: r=p; g=q; b=v; break; case 4: r=t; g=p; b=v; break; case 5: r=v; g=p; b=q; break; } } int c; c = int(256*r); if(c>255) c = 255; colour[0] = c; c = int(256*g); if(c>255) c = 255; colour[1] = c; c = int(256*b); if(c>255) c = 255; colour[2] = c; } complex<double> fun(complex<double>& c ){ const complex<double> i(0., 1.); return (pow(c,2) -1.) *pow(c -2. -i, 2) /(pow(c,2) +2. +2. *i); } int main(){ const int dimx = 800; const int dimy = 800; const double rmi = -3; const double rma = 3; const double imi = -3; const double ima = 3; ofstream f("complex.ppm", ios::binary); f << "P6" << endl << dimx << " " << dimy << endl << "255" << endl; for(int j=0; j < dimy; ++j){ double im = ima - (ima -imi) *j /(dimy -1); for(int i=0; i < dimx; ++i){ double re = rma -(rma -rmi) *i /(dimx -1); complex<double> c(re, im); complex<double> v = fun(c); double a = arg(v); while(a<0) a += 2*PI; a /= 2*PI; double m = abs(v); double ranges = 0; double rangee = 1; while(m>rangee){ ranges = rangee; rangee *= E; } double k = (m-ranges)/(rangee-ranges); double sat = k < 0.5 ? k *2: 1 -(k -0.5) *2; sat = 1 - pow(1-sat, 3); sat = 0.4 + sat*0.6; double val = k < 0.5 ? k *2: 1 -(k -0.5) *2; val = 1 - val; val = 1 - pow(1-val, 3); val = 0.6 + val*0.4; unsigned char colour[3]; SetHSV(a,sat,val,colour); f.write((const char*)colour,3); } } return 0; }
C
#include#include #include #include // floor /* based on c++ program from : http://commons.wikimedia.org/wiki/File:Color_complex_plot.jpg by Claudio Rocchini gcc d.c -lm -Wall http://en.wikipedia.org/wiki/Domain_coloring */ const double PI = 3.1415926535897932384626433832795; const double E = 2.7182818284590452353602874713527; /* complex domain coloring Given a complex number z=re^{ i \theta}, hue represents the argument ( phase, theta ), sat and value represents the modulus */ int GiveHSV( double complex z, double HSVcolor[3] ) { //The HSV, or HSB, model describes colors in terms of hue, saturation, and value (brightness). // hue = f(argument(z)) //hue values range from .. to .. double a = carg(z); // while(a<0) a += 2*PI; a /= 2*PI; // radius of z double m = cabs(z); // double ranges = 0; double rangee = 1; while(m>rangee){ ranges = rangee; rangee *= E; } double k = (m-ranges)/(rangee-ranges); // saturation = g(abs(z)) double sat = k<0.5 ? k*2: 1 - (k-0.5)*2; sat = 1 - pow( (1-sat), 3); sat = 0.4 + sat*0.6; // value = h(abs(z)) double val = k<0.5 ? k*2: 1 - (k-0.5)*2; val = 1 - val; val = 1 - pow( (1-val), 3); val = 0.6 + val*0.4; HSVcolor[0]= a; HSVcolor[1]= sat; HSVcolor[2]= val; return 0; } int GiveRGBfromHSV( double HSVcolor[3], unsigned char RGBcolor[3] ) { double r,g,b; double h; double s; double v; h=HSVcolor[0]; // hue s=HSVcolor[1]; // saturation; v = HSVcolor[2]; // = value; if(s==0) r = g = b = v; else { if(h==1) h = 0; double z = floor(h*6); int i = (int)z; double f = (h*6 - z); double p = v*(1-s); double q = v*(1-s*f); double t = v*(1-s*(1-f)); switch(i){ case 0: r=v; g=t; b=p; break; case 1: r=q; g=v; b=p; break; case 2: r=p; g=v; b=t; break; case 3: r=p; g=q; b=v; break; case 4: r=t; g=p; b=v; break; case 5: r=v; g=p; b=q; break; } } int c; c = (int)(256*r); if(c>255) c = 255; RGBcolor[0] = c; c = (int)(256*g); if(c>255) c = 255; RGBcolor[1] = c; c = (int)(256*b); if(c>255) c = 255; RGBcolor[2] = c; return 0; } int GiveRGBColor( double complex z, unsigned char RGBcolor[3]) { static double HSVcolor[3]; GiveHSV( z, HSVcolor ); GiveRGBfromHSV(HSVcolor,RGBcolor); return 0; } // double complex fun(double complex c ){ return (cpow(c,2)-1)*cpow(c-2.0- I,2)/(cpow(c,2)+2+2*I);} // int main(){ // screen (integer ) coordinate const int dimx = 800; const int dimy = 800; // world ( double) coordinate const double reMin = -2; const double reMax = 2; const double imMin = -2; const double imMax = 2; static unsigned char RGBcolor[3]; FILE * fp; char *filename ="complex.ppm"; fp = fopen(filename,"wb"); fprintf(fp,"P6\n%d %d\n255\n",dimx,dimy); int i,j; for(j=0;j<dimy;++j){ double im = imMax - (imMax-imMin)*j/(dimy-1); for(i=0;i<dimx;++i){ double re = reMax - (reMax-reMin)*i/(dimx-1); double complex z= re + im*I; // double complex v = fun(z); // GiveRGBColor( v, RGBcolor); fwrite(RGBcolor,1,3,fp); } } fclose(fp); printf("OK - file %s saved\n", filename); return 0; }
Licensing
|
File usage
The following pages on Schools Wikipedia link to this image (list may be incomplete):
Find out about Schools Wikipedia
Schools Wikipedia was created by children's charity SOS Children's Villages. SOS Childrens Villages cares for children who have lost their parents. Our Children's Villages give these children a new home and a new family, while a high-quality education and the best of medical care ensures they will grow up with all they need to succeed in adult life. If you'd like to help, learn how to sponsor a child.