发几幅由计算机生成的图像,以展示算法之美.并提供生成图像的算法代码.代码中,一部分是由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 }