门格尔海绵分形

门格尔海绵是一种流行的分形,它推广了康托集和谢尔平斯基三角形。其分形维数在2 ~ 3之间。

内容

卡尔·门格尔

卡尔·门格尔(1902-1985)是20世纪奥地利裔美国数学家。他职业生涯的大部分时间都在芝加哥的伊利诺伊理工学院。他对几何学和博弈论做出了贡献。但他最著名的是被称为“海绵”的立方体形分形。

海绵

从一个大的实心立方体开始。这是零级。

把大方块分成3x3x3 = 27个小方块,就像没有标签的魔方一样。从六个面中取出中间的立方体和正中心的立方体。第一级剩下27 - 7 = 20个小方块。

在这20个立方体上重复这个过程,在第2级生成20x20 = 400个更小的立方体。

一次。这是第三层,有800个小方块和很多洞。

下一阶段呢?

在我们的电脑屏幕或印刷页面上都能看到分辨率的情况下,超过第三级的分辨率几乎没有什么好处。每个立方体只占据几个像素,第四级立方体将小20倍。

它们的数量是我们的20倍。这是16万个亚像素大小的立方体。尽管我不能看到它,但我在第四级完成了一次计算。它需要的主存比我笔记本电脑上32g的RAM还要多。它必须使用虚拟存储,并运行了近15分钟。

二维还是三维?

固体体积在每一级减少20/27倍。所以理论上,如果你继续超过三级或四级,体积接近于零。另一方面,表面积变成无限大。其结果是一个介于二维和三维之间的分形。1918年,Felix Hausdorff介绍分形维数.结果表明,门格尔海绵具有Hausdorff维数log(20)/log(3),约为2.727。

这个话题很轻松。

到目前为止,我们一直在黑暗中工作。让我们来解释一下这个问题。我们开始的大立方体实际上是纯金的(模拟)。

光线以不同的角度照射在不同的表面上,产生不同深浅的金色。我们现在可以很容易地看到这些洞。

在第二级,我们已经挖出了几乎一半的金子。

有了光照和阴影,第三关的计算和绘图大约需要5秒钟。它比其他图要暗一些,因为立方体的边缘开始占主导地位。

倾斜

如果你把海绵稍微倾斜一下,你可以看到这些洞都是贯穿其中的通道。

动画

我试着在我所有的博客文章中使用gif动画。

门格尔

这是我的代码。这个函数门格尔让事情开始。有两个输入参数。第一个指定所需的细化级别。一个立方体是水平= 0。增加水平将多维数据集的数量乘以1,因此执行时间和所需的内存都乘以20。任何水平大于3是不切实际的。

第二个输入参数为true或false。True在一个camlight所以你可以看到更多细节。有虚假就没有光明。照明需要更多的时间,特别是如果你希望在计算完之后操作海绵。

8 × 3数组V提供半宽为3的立方体的顶点。从这个宽度开始意味着后续的许多计算都没有舍入错误。当多维数据集的大小接近图形分辨率时,这很重要。

函数门格尔(水平,点燃)分形立方,门格尔海绵。% menger(level)生成20^level的立方体。% menger(等级,为真)显示。% menger(level,false)不亮,所以更快。
V = [-3 -3 -3;-3 -3 3;-3 3 3;-3 3 3;3 -3 -3;3 -3 3;3 3 3;3 3 3];init_fig(lit)海绵(V,level)结束

海绵

这是所有动作发生的地方。这个函数海绵是递归的。它反复调用自身,传递数组v表示小立方体的顶点。的v数组从原始数组中获得V用3的逆幂进行缩放然后用向量进行平移[x y z]由所有可能的组合-2+ 2而且0.一个典型的v

[-3 -3 -3;-3 -3 3;-3 3 3;-3 3 3 3 3 -3;3 -3 3;3 3 3;3 3 3]/9 + [0 -2 2]

向量[x y z]的坐标立方体中心.向数组中添加向量是MATLAB的一个例子单例扩张.翻译后的v也许不在附近,但它是的某个地方在海绵里。和所有通过递归得到海绵中的立方体。

现在有一个关键点。这个函数nnz在最里面的循环中,计数向量中非零分量的数量。通过平移得到的立方体Nnz ([x y z])等于01被跳过,因为它们正是分形中提供孔的立方体。

函数海绵(v,水平,点燃)如果电平> 0 v = v/3;X = [-2 0 2]Y = [-2 0 2]Z = [-2 0 2]如果Nnz ([x y z]) > 1海绵(v+[x y z],level-1,点亮)结束结束结束结束其他的多维数据集(v,点燃)结束结束

多维数据集

此函数使用补丁画出一个金立方体的六个面。如果照明是必需的一些镜面反射率参数设置材料

函数立方体(v,点燃)f = [1 5 7 3 3 7 8 4 1 3 4 2 2 4 8 6 1 2 6 5 5 6 8 7];黄金= [1 .85 .60];p = patch(顶点= v,...Faces = f,...FaceColor =金色,...LineWidth = 0.5);如果亮金色= [0.7,0.5,0.3,1.0,0.2];材料(p,金色)结束结束

init_fig

初始化图形、轴,如果需要,初始化一个从观察位置指向立方体的光。这个名字windowbuttonmotionfcn是MATLAB中最长的标识符,也是一个非常方便的函数。我们这里需要一个这样当我们旋转海绵时,光就会跟着旋转。

函数Init_fig (lit)轴(4*[-1 1 -1 1 -1 1])轴平等的vis3drotate3d视图(60,15)如果点燃camlight (-45, 10);集(gcf,“windowbuttonmotionfcn”, @wbmf);结束结束

wbmf

函数Wbmf (~,~) a = gca;L = findobj(a,“类型”“光”);camlight (l, -45, 10);结束

软件

我的代码可用在这里

了解更多

网上有很多关于门格尔海绵的信息。人们已经建造了一个你可以通过的通道。人们用3D打印机打印了它们。谷歌“门格尔海绵图片”,点击“查看全部”。

维基百科上有一篇好文章。https://en.wikipedia.org/wiki/Menger_sponge

我特别喜欢这个视频。https://www.youtube.com/watch?v=fWsmq9E4YC0

《纽约时报》甚至还有一篇文章。https://www.nytimes.com/2011/06/28/science/28math-menger.html

谢谢

感谢Ed Angel向我介绍了Menger的作品,感谢Bob Blaine在图像方面提供了非常必要的帮助。




发布与MATLAB®R2021a

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。