• Open Source Computer Vision Library

分形 fractal 演示

Wikipedia,自由的百科全书

分形之美

看到有的网站搞分形艺术,才知道这个Z=Z*Z+C 如此的奇妙。 于是干脆在opencv下写出来,看看。效果还不错。呵呵。 这个小例子只能修改C的值,有兴趣的朋友可以自己改改代码,看能不能做出些美妙的图形。

代码提示:要获得高质量的图像,可以增加image_w,不过性能很低。


目录

运行结果

程序运行结果
Enlarge
程序运行结果
程序运行结果
Enlarge
程序运行结果
程序运行结果
Enlarge
程序运行结果


参考链接

http://blog.csdn.net/spanzhang/

http://www.fractal.net.cn/


代码

  1. #include "stdafx.h"
  2. #include "cv.h"
  3. #include "highgui.h"
  4.  
  5. const int image_w = 100;
  6. const double a =0.0;
  7. const double b =0.0;
  8. const long Nmax = 255; //Z值衰减(趋向于零) 的临界
  9. const double Rmax = 20; // Z值没有界限地增加(趋向无穷)的临界
  10.  
  11. IplImage* image =0;
  12. int c_r_value = 60;
  13. int c_i_value = 40;
  14.  
  15. //返回迭代的次数
  16. int getnum(int i,int j)
  17. {
  18. double C_RealPart = (double)(c_r_value-50)/100*2*2; //-2 到 +2 //Julia 集合 常数C
  19. double C_ImagPart = (double)(c_i_value-50)/100*2*2; // -2 到 +2 //Julia 集合 常数C
  20. double RealPart = (double)i/image_w+a;
  21. double ImagPart = (double)j/image_w+b;
  22. int n=0;
  23. while(n<Nmax)
  24. {
  25. //Z=Z*Z+C;
  26. double ZM = RealPart*RealPart + ImagPart*ImagPart;
  27. if(ZM>Rmax) break;
  28. double temp_RealPart = RealPart*RealPart - ImagPart*ImagPart+C_RealPart;
  29. double temp_ImagPart = 2*ImagPart*RealPart+C_ImagPart;
  30. RealPart= temp_RealPart;
  31. ImagPart= temp_ImagPart;
  32. n++;
  33. }
  34. return n;
  35. }
  36. void onChangeimg(int pos)
  37. {
  38. cvZero(image);
  39. for(int i =0;i<image_w;i++)
  40. for(int j =0;j<image_w;j++)
  41. {
  42. int n1 = getnum(i,j);
  43. int n2 = getnum(j,i);
  44. int n3 = getnum(j,i/2);
  45. //printf("%d,",n);
  46.  
  47. CvScalar sc1;
  48. if(n1>Nmax-2) n1=0;
  49. if(n2>Nmax-2) n2=0;
  50. if(n3>Nmax-2) n3=0;
  51.  
  52. sc1.val[0] = (int)abs(255*(float)n1/Nmax);
  53. sc1.val[1] = (int)abs(255*(float)n2/Nmax);
  54. sc1.val[2] = (int)abs(255*(float)n3/Nmax);
  55. cvSet2D(image,i,j,sc1);
  56.  
  57. }
  58.  
  59. double nvalue = cvNorm(image,0,CV_C);
  60.  
  61. for(int i =0;i<image_w;i++)
  62. for(int j =0;j<image_w;j++)
  63. {
  64. CvScalar sc1;
  65. CvScalar sc2 =cvGet2D(image,i,j);
  66. sc1.val[0] = (int)abs(255*sc2.val[0]/nvalue);
  67. sc1.val[1] = (int)abs(255*sc2.val[1]/nvalue);;
  68. sc1.val[2] = (int)abs(255*sc2.val[2]/nvalue);;
  69. cvSet2D(image,i,j,sc1);
  70. }
  71.  
  72. }
  73. int main( int argc, char** argv )
  74. {
  75.  
  76.  
  77. cvNamedWindow( "WIN", 0 );
  78. cvCreateTrackbar( "C real", "WIN", &c_r_value, 100, onChangeimg );
  79. cvCreateTrackbar( "C imag", "WIN", &c_i_value, 100, onChangeimg );
  80.  
  81. image = cvCreateImage( cvSize(image_w,image_w), 8, 3 );
  82. onChangeimg(0);
  83.  
  84.  
  85. for(;;)
  86. {
  87.  
  88. cvShowImage("WIN",image);
  89. if(cvWaitKey(40)==27) break;
  90. }
  91. return 0;
  92.  
  93. }
  94.  

代码和程序下载

代码和程序

Views
Personal tools