首页 > 代码库 > 算法之美---由计算机生成的图像

算法之美---由计算机生成的图像

发几幅由计算机生成的图像,以展示算法之美.并提供生成图像的算法代码.代码中,一部分是由C++实现,另一部分是由一种我定义的脚本语言实现.

相关软件见:Why数学图像生成工具.

(1)树

 1 void            CPixelIFSTree::BuildPixelsMap() 2 { 3     float m[5][7];  4  5     //‘IFS码赋值 6     m[0][0] = 0.195f;  m[0][1] =-0.488f; m[0][2] = 0.344f; m[0][3] = 0.433f; m[0][4] = 0.4431f; m[0][5] = 0.2452f; m[0][6] = 0.25f; 7     m[1][0] = 0.462f;  m[1][1] = 0.414f; m[1][2] =-0.252f; m[1][3] = 0.361f; m[1][4] = 0.2511f; m[1][5] = 0.5692f; m[1][6] = 0.25f; 8     m[2][0] =-0.058f;  m[2][1] =-0.07f;  m[2][2] = 0.453f; m[2][3] =-0.111f; m[2][4] = 0.5976f; m[2][5] = 0.0969f; m[2][6] = 0.25f; 9     m[3][0] =-0.035f;  m[3][1] = 0.07f;  m[3][2] =-0.469f; m[3][3] =-0.022f; m[3][4] = 0.4884f; m[3][5] = 0.5069f; m[3][6] = 0.2f;10     m[4][0] =-0.637f;  m[4][1] = 0.0f;   m[4][2] = 0.0f;   m[4][3] = 0.501f; m[4][4] = 0.8562f; m[4][5] = 0.2513f; m[4][6] = 0.05f;11 12     float a, b, c, d, e, f;    //‘仿射变幻中的系数13 14     float x = 0.0f;15     float y = 0.0f;16     float t;17 18     for (int i = 0; i < 100000000; i++)19     {20         float R = (float)rand()/RAND_MAX;21 22         if (R <= m[0][6]) 23         {24             a = m[0][0]; b = m[0][1]; c = m[0][2]; d = m[0][3]; e = m[0][4]; f = m[0][5];25         } 26         else if (R <= m[0][6] + m[1][6]) 27         {28             a = m[1][0]; b = m[1][1]; c = m[1][2]; d = m[1][3]; e = m[1][4]; f = m[1][5];29         } 30         else if (R <= m[0][6] + m[1][6] + m[2][6]) 31         {32             a = m[2][0]; b = m[2][1]; c = m[2][2]; d = m[2][3]; e = m[2][4]; f = m[2][5];33         } 34         else if (R <= m[0][6] + m[1][6] + m[2][6] + m[3][6]) 35         {36             a = m[3][0]; b = m[3][1]; c = m[3][2]; d = m[3][3]; e = m[3][4]; f = m[3][5];37         } 38         else 39         {40             a = m[4][0]; b = m[4][1]; c = m[4][2]; d = m[4][3]; e = m[4][4]; f = m[4][5];41         }42 43         t = a*x + b*y + e;44         y = c*x + d*y + f;45         x = t;46 47         int ix = ((int)(x*1024.0f))&0x3ff;48         int iy = 1024 - ((int)(y*1024.0f))&0x3ff;49         m_pixels_map[iy][ix]+=1;50     }51 52     if (!m_pixels_map[0][0])53     {54         m_pixels_map[0][0] = 1;55     }56 }57 58 unsigned int    CPixelIFSTree::CalculatePixel(unsigned int x, unsigned int y)59 {60     if (!m_pixels_map[0][0])61     {62         BuildPixelsMap();63     }64 65     float fr = logf((float)m_pixels_map[y][x])*32.0f;66     unsigned int r = FLOAT_255_TO_BYTE(fr);67     float fg = logf((float)m_pixels_map[y][x]*1.2f)*56.0f;68     unsigned int g = FLOAT_255_TO_BYTE(fg);69 70     unsigned b = m_pixels_map[y][x] & 0xff;71 72     return MAKE_RGB(r,g,b);73 }
View Code

 

(2)晕

这是由Sin函数生成的图像,让人看着眼花

pixels = W:1024 H:1024x = from (-8*PI) to (8*PI) Wy = from (-8*PI) to (8*PI) Hr = sin(x+y)g = sin(x-y)b = sin(x*y)r = r*0.5 + 0.5g = g*0.5 + 0.5b = b*0.5 + 0.5
View Code

 

(3)格

这是由Tan函数生成的图像,密集恐惧症者可以拿它来练胆.

pixels = W:1024 H:1024x = from 0 to 1023 Wy = from 0 to 1023 Hr = tan(x*y)g = r*0.5b = r*0.2

 

(4)JuliaSets

 1 unsigned int    CPixelJuliaSets3::CalculatePixel(unsigned int x, unsigned int y) 2 {     3     int K=100; 4     int m=500; 5     float xs = -1.5f;  6     float xl = 1.5f;  7     float ys = -1.5f;  8     float yl = 1.5f; 9     float p = 0.32f; 10     float q = 0.043f;11     float xb = (xl - xs) / m_width;12     float yb = (yl - ys) / m_height;13 14     float x0=xs+x*xb;15     float y0=ys+y*yb;16     int k=0;17     int H;18 loop1:19     float xk=x0*x0-y0*y0+p;20     float yk=2*x0*y0+q;21     k=k+1;22     float r=xk*xk+yk*yk;23     x0=xk;24     y0=yk;25     if(r>m)26     {27         H=k;28         goto loop2;29     }30     if(k==K)31     {32         H=int(r*10);33         goto loop2;34     }35     if(r<=m && k<K) 36     {37         goto loop1;38     }39 loop2:40 41     float fr = logf((float)H)*256.0f;42     unsigned int br = (unsigned char)fr;43 44     float fg = logf((float)H)*128.0f;45     unsigned int bg = (unsigned char)fg;46 47     unsigned int bb = (H*100)&0xff;48 49     return MAKE_RGB(br,bg,bb);50 }
View Code

 

(5)Mandlbrot

 1 unsigned int    CPixelMandlbrot1::CalculatePixel(unsigned int x, unsigned int y) 2 {     3     int K=100; 4     int m=500; 5     float pl=0.9f;  6     float ps=-2.3f; 7     float ql=1.2f;  8     float qs=-1.2f; 9 10     float p=(pl-ps)/m_width;11     float q=(ql-qs)/m_height;12 13     float p0=ps+x*p;14     float q0=qs+y*q;15     int k=0;16     float x0=0.0f;17     float y0=0.0f;18     int H;19 20     float xk;21     float yk;22     float r;23 24 loop1:25     xk=x0*x0-y0*y0+p0;26     yk=2*x0*y0+q0;27     k=k+1;28     r=xk*xk+yk*yk;29     x0=xk;30     y0=yk;31     if(r>m)32     {33         H=k;34         goto loop2;35     }36     if(k==K)37     {38         H=int(r*1);39         goto loop2;40     }41     if(r<=m && k<K) 42     {43         goto loop1;44     }45 46 loop2:47     float fr = logf((float)H)*256.0f;48     unsigned int br = (unsigned char)fr;49 50     float fg = logf((float)H)*128.0f;51     unsigned int bg = (unsigned char)fg;52 53     unsigned int bb = (H*100)&0xff;54 55     return MAKE_RGB(br,bg,bb);56 }
View Code

 

(6)棋盘

pixels = W:1024 H:1024u = from 0 to 16 Wv = from 0 to 16 Hm = floor(u%2)n = floor(v%2)r = if(xor_bool(m,n), 0.0, 1.0)g = rb = r
View Code

 

算法之美---由计算机生成的图像