Súbor:Color complex plot.jpg

z Wikipédie, slobodnej encyklopédie
Skočit na navigaci Skočit na vyhledávání
Pôvodný súbor(800 × 800 pixelov, veľkosť súboru: 203 KB, MIME typ: image/jpeg)

Tento zdieľaný súbor je z Wikimedia Commons a je možné ho používať na iných projektoch. Nižšie sú zobrazené informácie z popisnej stránky súboru.

Opis súboru[upraviť]

Popis

Color 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

Dátum
Zdroj Vlastné dielo
Autor Claudio Rocchini
Povolenie
(Využívanie tohto súboru)

CC-BY 2.5

Ďalšie verzie
Color complex plot2.jpg

Source Code[upraviť]

C++[upraviť]

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 <complex>
#include <fstream>

using namespace std;
 
const double PI = 3.1415926535897932384626433832795;
const double E  = 2.7182818284590452353602874713527;
 
void SetHSV(double h, double s, double v, unsigned char color[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; color[0] = c;
    c = int(256*g); if(c>255) c = 255; color[1] = c;
    c = int(256*b); if(c>255) c = 255; color[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 color[3];
            SetHSV(a,sat,val,color);
            f.write((const char*)color,3);
        }
    }
    return 0;
}

C[upraviť]

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>// 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;
}

Licencovanie[upraviť]

Ja, držiteľ autorských práv k tomuto dielu ho týmto zverejňujem za podmienok nasledovných licencií:
GNU head Bolo udelené povolenie kopírovať, širiť a/alebo meniť tento dokument za podmienok GNU Free Documentation License, verzie 1.2 alebo ktorejkoľvek neskoršej verzie publikovanej Free Software Foundation; bez Nemenných častí, bez Textov na prednej obálke a bez Textov na zadnej obálke. Kópia tejto licencie je zahrnutá v časti nazvanej GNU Free Documentation License.
w:sk:Creative Commons
uvedenie autorov meniť za rovnakých podmienok
Tento súbor podlieha licencii Creative Commons Attribution-Share Alike 3.0 Unported
Môžete slobodne:
  • zdieľať – kopírovať, šíriť a prenášať dielo
  • meniť ho – upravovať dielo
Za nasledovných podmienok:
  • uvedenie autorov – Musíte uviesť autorov diela spôsobom, aký požaduje autor alebo držiteľ licencie (ale nie žiadnym spôsobom, ktorý by naznačoval, že podporujú vás alebo vaše využitie diela)
  • meniť za rovnakých podmienok – Ak toto dielo zmeníte, prevediete do inej formy alebo použijete ako základ iného diela, môžete výsledné odvodené dielo šíriť iba pod rovnakou alebo podobnou licenciou ako je táto.
Táto šablóna licencie bola pridaná k tomuto súboru počas aktualizácie licencovania GFDL.
w:sk:Creative Commons
uvedenie autorov
Tento súbor podlieha licencii Creative Commons Attribution 2.5 Generic
Môžete slobodne:
  • zdieľať – kopírovať, šíriť a prenášať dielo
  • meniť ho – upravovať dielo
Za nasledovných podmienok:
  • uvedenie autorov – Musíte uviesť autorov diela spôsobom, aký požaduje autor alebo držiteľ licencie (ale nie žiadnym spôsobom, ktorý by naznačoval, že podporujú vás alebo vaše využitie diela)

Môžete si zvoliť ľubovolnú z týchto licencií.

História súboru

Po kliknutí na dátum/čas uvidíte súbor ako vyzeral vtedy.

dátum/časNáhľadrozmerypoužívateľkomentár
aktuálna23:06, 22. marec 2013Náhľad verzie z 23:06, 22. marec 2013800 × 800 (203 KB)YourmomblahHigher quality
09:46, 7. august 2007Náhľad verzie z 09:46, 7. august 2007800 × 800 (59 KB)Rocchini{{Information |Description=Color plot of complex function (x^2-1) * (x-2-I)^2 / (x^2+2+2I), hue represents the argument, sat and value represents the modulo |Source=Own work |Date=2007-08-07 |Author=Claudio Rocchini |Permission=CC-BY 2.5 }}

Globálne využitie súborov

Nasledovné ďalšie wiki používajú tento súbor: