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

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

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


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


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



效果图一

0_13264336830Yl9.png



效果图二

0_1326433720trJj.png


效果图三:

0_1326433741CvL6.png


产生原理


基于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


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

private void getPoint() {
 
    la = a;
    lb = b;
    lc = c;
    ld = d; 
    
    // Add Noise to Coefficients for Smoothness
    if (noise) {
      la += getRandom();
      lb += getRandom();
      lc += getRandom();
      ld += getRandom();
    }
    
    // *************************************************
    // ** Update Temp Variables -- Magic
    xn = (float)(Math.sin(la * y) - Math.cos(lb * x)); 
    yn = (float)(Math.sin(lc * x) - Math.cos(ld * y)); 
    
    // color here
    zn = (float)(Math.sin(e * x) - Math.cos(f * z)); 
    
    // take current result as x0,y0,z0 in order to calculate next xn,yn,zn
    x = xn;
    y = yn;
    z = zn;
    
    // Convert to 2D Image Space for Plotting
    u = (int) ((x + 2.5) * K); 
    v = (int) ((y + 2.5) * K);
 
    tr = (float)(z * 0.9 + (1.0 - z) * 0.6); // Map Z-Coordinate to Color
    tg = (float)(z * 0.2 + (1.0 - z) * 0.4);
    tb = (float)(z * 0.5 + (1.0 - z) * 0.9);
    
      pList[u][v][0] += 1.0f; // alpha value, normalization factor, must have it
      pList[u][v][1] += tr; //Add New Point to Total
      pList[u][v][2] += tg;  
      pList[u][v][3] += tb;
  }

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

  private void renderPoints(int[] rgbData) {
    float max = -1.0f;
      for (int i=0; i < nSize; i++) {
        for (int j=0; j < nSize; j++) {
            if (pList[i][j][3] > max){
              max = pList[i][j][3];
              }
            }
        }
 
      //Adjust Values and Fill Image
      float logval, logmax = (float)Math.log(max);
      float M = (float)((logmax * logmax) / 255.0f);
      int[] color ={0,0,0,0};
      for (int i=0; i < nSize; i++) {
          for (int j=0; j < nSize; j++) {
            for (int k=0; k < 4; k++) {
              logval = (float)Math.log(pList[i][j][k]);
              color[k] = (int) (logval * logval / M);
            }
            // rgbData[j*nSize + i] = (color[0] << 24) | (color[1] << 16) | (color[2] << 8) | color[3];
            rgbData[j*nSize + i] = (255 << 24) | (color[1] << 16) | (color[2] << 8) | color[3];
        }
      }
  }















随机产生参数 a, b,c,d,e,f值区间在[-3,3]之间,可以得到你认为很cool的效果。




算是送给大家的2012新年礼物吧,程序完全是基于Java语言实现。






随机产生参数 a, b,c,d,e,f值区间在[-3,3]之间,可以得到你认为很cool的效果。

算是送给大家的2012新年礼物吧,程序完全是基于Java语言实现。


相关文章
|
C语言 C++ 开发者
软著申请流程详解
软著申请流程详解
4183 2
软著申请流程详解
|
存储 SQL 缓存
Hadoop入门(一篇就够了)
Hadoop入门(一篇就够了)
27171 4
Hadoop入门(一篇就够了)
|
10月前
|
数据库连接 数据库 DataX
数据接入方案
数仓平台可直连或通过从库、堡垒机、FTP/SFTP等方式接入业务数据库,需提供可读用户权限及相应连接方式。若无法直连,可通过提供数据文件或脚本处理实现数据导入。
483 7
数据接入方案
|
存储 关系型数据库 MySQL
MySQL 忘记root密码解决方案
【7月更文挑战第19天】
1777 4
|
前端开发 JavaScript 搜索推荐
计算机Java项目|基于SpringBoot的旅游网站的设计与实现
计算机Java项目|基于SpringBoot的旅游网站的设计与实现
973 0
软件著作权申请流程及费用_快速登记_软著材料及常见问题解答FAQ
阿里云软件著作权申请涉及账号注册、实名认证和选择服务。在阿里云官网注册账号,通过实名认证后,选择登记服务,如普通359.1元/件或加急1080元/件。在线填报申请表,阿里云初审后授权提交,打印申请表并邮寄材料。版权中心审查后,通过则领取证书,未通过需补正。整个过程约20天。详细步骤见阿里云百科相关教程。
543 3
|
JavaScript 前端开发 API
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
本文介绍了如何在Vue 3项目中使用v-md-editor组件库来创建markdown编辑器和预览组件。文章提供了安装步骤、如何在main.js中进行全局配置、以及如何在页面中使用VMdEditor和VMdPreview组件的示例代码。此外,还提供了一个完整示例的链接,包括编辑器和预览组件的使用效果和代码。
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
|
JavaScript IDE 开发工具
找不到模块“./App.vue”或其相应的类型声明。ts(2307)
这篇文章介绍了在Vue 3 + TypeScript + Vite开发环境中解决找不到`.vue`文件模块或其类型声明错误的两种方法:使用VSCode的TypeScript Vue Plugin (Volar)插件或手动在`env.d.ts`文件中声明`*.vue`模块类型。
2042 1
找不到模块“./App.vue”或其相应的类型声明。ts(2307)
|
机器学习/深度学习 算法 大数据
[ICLR 2024] 基于Pathways架构的自适应多尺度时间序列预测模型Pathformer
阿里云计算平台大数据基础工程技术团队主导,与华东师范大学数据科学与工程学院合作的论文《Pathformer: Multi-Scale Transformers With Adaptive Pathways For Time Series Forecasting》被ICLR 2024接收,该论文提出了基于Pathways架构的自适应多尺度时间序列预测模型Pathformer,它从时间分辨率和时间距离角度进行多尺度时序建模,同时进一步提出自适应Pathways来动态调整多尺度建模过程,基于两者,Pathformer在阿里云数据集和公开数据集上取得SOTA预测效果,并展现出不错的泛化性和迁移性。
|
Dart 开发工具 开发者
深入理解Flutter的热重载机制
【4月更文挑战第26天】Flutter的热重载机制借助Dart的JIT和Tree Shaking,允许开发者在不重启应用的情况下实时预览代码变更。通过增量编译和更新内存代码,热重载能快速显示UI变化并保持应用状态,提升开发效率。尽管有些情况需完全重启应用,热重载仍是强大的开发工具,促进了Flutter的高效开发和调试。理解其原理与限制将优化开发体验。