分形的奥秘!分形着色器!shader 编程入门实战 ! Cocos Creator!

极致的数学之美!

file

什么是分形?

“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”

简单来说,分形(fractal)就像这个doge表情包一样,放大一部分后和原来的图近似。

在这里插入图片描述

用分形着色器实现的效果如下,在编辑器内放大其中的一部分,会发现与整体非常相似!

在这里插入图片描述
如何实现这么优雅的图片?一切起源于简单的公式(julia set)

f(n) = f(n-1) * f(n-1) + c

通过迭代 n 次后可以实现分形效果。

起始值 f(0) 如何确定? 可以通过纹理坐标来确定。

当然这个起始值是个复数,有实数部分和虚数部

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算三维分形维数的盒计数法与计算二维分形维数的方法类似,只是需要将二维盒子扩展为三维盒子。以下是 MATLAB 的示例代码: 1. 生成三维分形图形 ```matlab % 生成三维分形图形 N = 100000; x = zeros(N,1); y = zeros(N,1); z = zeros(N,1); x(1) = 0; y(1) = 0; z(1) = 0; for i = 2:N r = rand; if r < 0.33 x(i) = 0.5 * x(i-1); y(i) = 0.5 * y(i-1); z(i) = 0.5 * z(i-1); elseif r < 0.67 x(i) = 0.5 * x(i-1) + 0.5; y(i) = 0.5 * y(i-1); z(i) = 0.5 * z(i-1); else x(i) = 0.5 * x(i-1) + 0.25; y(i) = 0.5 * y(i-1) + 0.5; z(i) = 0.5 * z(i-1); end end scatter3(x,y,z,'.','MarkerSize',1) axis equal ``` 2. 计算盒计数 ```matlab % 计算盒计数 L = 10; M = 100; counts = zeros(M,1); for i = 1:M N = 2^(i-1); boxes = zeros(N,N,N); for j = 1:length(x) ix = floor((x(j) + 0.5) * N / L); iy = floor((y(j) + 0.5) * N / L); iz = floor((z(j) + 0.5) * N / L); if ix > 0 && ix <= N && iy > 0 && iy <= N && iz > 0 && iz <= N boxes(iy,ix,iz) = 1; end end counts(i) = sum(sum(sum(boxes))) / (N*N*N); end ``` 3. 绘制盒计数图 ```matlab % 绘制盒计数图 log_counts = log(counts); log_scale = log(L./2.^(0:M-1)'); p = polyfit(log_scale,log_counts,1); D = p(1); hold on plot(log_scale,polyval(p,log_scale),'r') text(2,6,sprintf('D = %f',D)) ``` 其中,L 表示盒子的尺寸,M 表示盒子的数量。这段代码生成一个三维分形图形,然后计算不同尺寸的盒子所能覆盖的分形图形的体积比例,最后根据盒子的尺寸和体积比例计算分形维数 D。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值