当前位置: 代码迷 >> 综合 >> 超纯超美的曲线(Peter De Jong Attractor)
  详细解决方案

超纯超美的曲线(Peter De Jong Attractor)

热度:73   发布时间:2023-12-12 10:36:31.0
from: http://blog.csdn.net/jia20003/article/details/7198612

无意之中在网上看到一篇基于HTML5 Demo的Peter De Jong 吸引子生成图像的Demo,没Hold住,

感觉太漂亮了。于是想研究一下,发现有个专业术语 - 分形。一位大师这样评价分形学科 - “it is not about 

math, it is about art” 显然有时候程序员也是有点艺术细胞。


效果图一


效果图二


效果图三:


产生原理

基于Peter De Jong公式:Peter De Jong的数学公式如下:

Xn+1 = sin(a*yn) - cos(b*xn)

Yn+1 = sin(c*xn) - cos(d*yn)

从一个随机的点P(x0, y0)开始得到下一个P(xn,yn)然后令 Xn = Xn+1, Yn = Yn+1

迭代产生更多数据。

 

算法实现

算法实现基于分形火焰算法,首先根据迭代的出来的数据点,使用直方图统计算法得到指定大小直方图数据点,

然后再根据直方图的结果实现像素绘制和颜色,透明度生产。关于分形火焰算法可以参考这里 :

 http://en.wikipedia.org/wiki/Fractal_flame

 完成随机点产生与直方图统计代码:

[java] view plain copy
  1. <span style="font-weight: normal;">private void getPoint() {  
  2.   
  3.         la = a;  
  4.         lb = b;  
  5.         lc = c;  
  6.         ld = d;   
  7.           
  8.         // Add Noise to Coefficients for Smoothness  
  9.         if (noise) {  
  10.             la += getRandom();  
  11.             lb += getRandom();  
  12.             lc += getRandom();  
  13.             ld += getRandom();  
  14.         }  
  15.           
  16.         // *************************************************  
  17.         // ** Update Temp Variables -- Magic  
  18.         xn = (float)(Math.sin(la * y) - Math.cos(lb * x));   
  19.         yn = (float)(Math.sin(lc * x) - Math.cos(ld * y));   
  20.           
  21.         // color here  
  22.         zn = (float)(Math.sin(e * x) - Math.cos(f * z));   
  23.           
  24.         // take current result as x0,y0,z0 in order to calculate next xn,yn,zn  
  25.         x = xn;  
  26.         y = yn;  
  27.         z = zn;  
  28.           
  29.         // Convert to 2D Image Space for Plotting  
  30.         u = (int) ((x + 2.5) * K);   
  31.         v = (int) ((y + 2.5) * K);  
  32.   
  33.         tr = (float)(z * 0.9 + (1.0 - z) * 0.6); // Map Z-Coordinate to Color  
  34.         tg = (float)(z * 0.2 + (1.0 - z) * 0.4);  
  35.         tb = (float)(z * 0.5 + (1.0 - z) * 0.9);  
  36.           
  37.         pList[u][v][0] += 1.0f; // alpha value, normalization factor, must have it  
  38.         pList[u][v][1] += tr; //Add New Point to Total  
  39.         pList[u][v][2] += tg;    
  40.         pList[u][v][3] += tb;  
  41.     }  
  42. </span>  

结果归一化与像素绘制代码:

[java] view plain copy
  1. <span style="font-family:Arial, Verdana, sans-serif;"><span style="white-space: normal;"><span style="font-family:monospace;"><span style="white-space: pre;"></span></span></span></span><pre name="code" class="java"><span style="font-weight: normal;"private void renderPoints(int[] rgbData) {  
  2.         float max = -1.0f;  
  3.         for (int i=0; i < nSize; i++) {  
  4.           for (int j=0; j < nSize; j++) {  
  5.               if (pList[i][j][3] > max){  
  6.                 max = pList[i][j][3];  
  7.                 }  
  8.               }  
  9.           }  
  10.   
  11.         //Adjust Values and Fill Image  
  12.         float logval, logmax = (float)Math.log(max);  
  13.         float M = (float)((logmax * logmax) / 255.0f);  
  14.         int[] color ={ 0,0,0,0};  
  15.         for (int i=0; i < nSize; i++) {  
  16.             for (int j=0; j < nSize; j++) {  
  17.               for (int k=0; k < 4; k++) {  
  18.                 logval = (float)Math.log(pList[i][j][k]);  
  19.                 color[k] = (int) (logval * logval / M);  
  20.               }  
  21.               // rgbData[j*nSize + i] = (color[0] << 24) | (color[1] << 16) | (color[2] << 8) | color[3];  
  22.               rgbData[j*nSize + i] = (255 << 24) | (color[1] << 16) | (color[2] << 8) | color[3];  
  23.           }  
  24.         }  
  25.     }</span></pre>  
  26. <pre></pre>  
  27. <p></p>  
  28. <pre></pre>  
  29. <br>  
  30. <p></p>  
  31. <p>随机产生参数 a, b,c,d,e,f值区间在[-3,3]之间,可以得到你认为很cool的效果。</p>  
  32. <p>算是送给大家的2012新年礼物吧,程序完全是基于Java语言实现。</p>  
  33. <br>  
  34. <pre></pre>  
  35.       
  36.         <div style="padding-top:20px">           
  37.             <p style="font-size:12px;">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>  
  38.         </div>