`
kidneyball
  • 浏览: 328994 次
  • 性别: Icon_minigender_1
  • 来自: 南太平洋
社区版块
存档分类
最新评论

分形绘图简介(一) 什么是分形绘图

 
阅读更多
圣诞长假,把玩了一下分形绘图。我的初衷是想找点简单好玩漂亮的东西,以后用来哄骗小女儿学习数学和计算机。于是我找到了Kojo,一个用Scala来模拟Logo语言的小玩具,让我想起了小时候玩分形绘图的零星记忆。然后在网上东找西寻,终于让我找到了Apophysis 7X这个好东东。结果一发不可收拾,耗进去好几天。下面是这几天的一些学习心得。

什么是分形绘图

跑去网上某百科查“分形”,如果不是搞数学的话,基本上会不知所云。什么“分数维”,“混沌吸引子”之类的概念只能把你的小脑瓜变成大脑瓜。好在我们这些搞业余艺术的人不用去扯这些技术细节,其实只要知道,分形绘图就是“递归的几何”,就够了。如果你还想了解一些细节,可以继续阅读本节。如果你只想尽快开始作画,完全可以跳过本文。

下面用Kojo和一个经典的分形雪花图(Von Koch曲线)来说明什么是分形图案。

首先去 http://www.kogics.net/kojo-download 下载一个Kojo并安装。顺带一提,如果想哄小孩子学编程,这应该是个好东东,现在已经很难找到做得这么细致的Logo语言实现了,虽然是用Scala仿的。

Ok,现在运行Kojo,把下面代码复制到Script Editor中:

def lines(count: Int, length: Int) {
    if (count == 1) forward(length)  //前进length步
    else {
        lines(count-1, length)
        left(60)   //左转60度
        lines(count-1, length)
        right(120) //右转120度
        lines(count-1, length)
        left(60)   //左转60度
        lines(count-1, length)
    }
}

clear()  //清屏
setPenThickness(1)  //画笔宽度设为1
setPenColor(color(128, 128, 128))  //设置画笔颜色
setAnimationDelay(300)  //海龟每个动作的延迟(让我们这些小朋友可以看得清)

visible()  //显示小海龟
right(90)  //右转90度
//修改下面这行
lines(2, 5)

invisible()  //隐藏小海龟


这段代码是什么意思呢?我们看到Turtle Canvas上有一只小海龟,这段程序就是用来控制这只小海龟移动进行作画的(嗯,很幼稚,小孩子的玩具嘛)

其中的lines是个递归函数,如果count是1的时候,就画一段长度为length的直线。如果大于1,则分别递归调用自己4次,分别转3次弯。

现在来看count=2时的结果:


这个图案由4条直线加3个转弯组成。

count=3时 ( 把line(2, 5)这行改成line(3, 5) )


可以看出,这个图案是4个count=2时的图案再加3次转弯组成。

同理,count=4时,得到这个图案:


如此类推,通过对简单的图形进行递归,就能构造出非常复杂的图案来。这种图形的局部其实就是整体的一个复制,可能再加上一些变换,例如在这个简单的例子中,每个局部都稍微比整体简单(count少1)。用术语来说,叫做“自相似”。而这种带有“自相似”性质的图案,就是所谓的分形图案了。

最后,我们来完成这个例子:
把原来程序中的line(2, 5)改为

    lines(5, 5)
    right(120)
    lines(5, 5)
    right(120)
    lines(5, 5)

也就是,转两个弯,把3段lines(5,5)图像串起来,运行就得到了传说中雪花



附完整脚本:
def lines(count: Int, length: Int) {
    if (count == 1) forward(length)
    else {
        lines(count-1, length)
        left(60)
        lines(count-1, length)
        right(120)
        lines(count-1, length)
        left(60)
        lines(count-1, length)
    }
}

clear()
visible()
setPenThickness(1)  //设定画笔宽度
setPenColor(color(128, 128, 128))  //设定画笔颜色
setAnimationDelay(300)  //设定动画延迟(让你看到小海龟在跑)
right(90)
//修改此处
    lines(5, 5)
    right(120)
    lines(5, 5)
    right(120)
    lines(5, 5)
invisible()  //隐藏海龟


最后简单看一下另一段脚本 (Kojo自带示例):
def tree(distance: Double) {
    if (distance > 4) {
        setPenThickness(distance/7)
        setPenColor(color(distance.toInt, math.abs(255-distance*3).toInt, 125))
        forward(distance)
        right(25)
        tree(distance*0.8-2)
        left(45)
        tree(distance-10)
        right(20)
        back(distance)
    }
}

clear()
invisible()
setAnimationDelay(10)
penUp()
back(200)
penDown()
tree(90)


运行结果是:



而这棵分形树是由多个



组成的。

当然,本文说的都是一些哄小孩用的简单例子,但也基本上说明了什么是分形图。下一篇开始就开始动真格了。

下一篇 分形绘图简介(二) Apophysis 7X登场
  • 大小: 440 Bytes
  • 大小: 932 Bytes
  • 大小: 3.1 KB
  • 大小: 16.8 KB
  • 大小: 68 KB
  • 大小: 3.7 KB
0
1
分享到:
评论

相关推荐

    分形与混沌\分形制图软件和程序

    分形与混沌是数学、物理学和计算机科学领域中极具...总的来说,分形与混沌的研究为我们提供了一种新的视角来看待世界,而分形制图软件和程序则为我们打开了通向这一神秘领域的窗口,让我们得以窥见自然界的深邃之美。

    三角形分形绘图问题 C语言

    分形是以多种概念和方法相互冲击融合为特征的图形。分形所呈现的无穷玄机和...不再仅仅是揭示一类存在,而是一种 艺术创作,分形搭起了科学与艺术的桥梁。 在分形艺术中,蕴含着浓厚的递归思想。Sierpinski Triangle

    唐代铜镜纹饰的分形制图思想

    唐代铜镜纹饰的分形制图思想是古代工艺美术与现代数学理论的一次跨越时空的对话。在本文中,我们将深入探讨这一独特的艺术与科学的交汇点,以揭示中国古代艺术家们无意识中运用的复杂几何学原理。 “分形”一词源于...

    matlab代码实现分形维数计算,matlab绘制分形图形,matlab

    在MATLAB中,分形维数的计算是数学与计算机科学的一个重要领域,特别是在图像处理、几何形态学和复杂系统的研究中。分形维数是一种描述不规则形状复杂性的度量,它超越了传统的欧几里得几何维度,能够更好地刻画现实...

    openGL实现分形树

    L-系统由一组规则和一个初始字符串组成,通过不断应用这些规则生成新的字符串,然后将每个字符映射到一个图形操作,如移动、旋转或绘制线段,从而构建出分形结构。 在OpenGL中实现分形树,我们需要以下步骤: 1. *...

    分形算法 分形树 很炫的

    分形是一种在自然界中广泛存在的几何形态,它们具有自相似性,即在不同尺度上看起来相似的特性。分形算法是计算机科学中的一个重要概念,它用于生成这些复杂且精细的结构。在本案例中,我们将深入探讨如何使用VC...

    Delphi递归法绘图分形大树Tree及节点.rar

    这个实例项目 "Delphi递归法绘图分形大树Tree及节点" 提供了一种方法,让我们可以通过编程来生成逼真的树状结构。 首先,递归是编程中的一个重要概念,它是指在一个函数内部调用自身的过程。在绘制分形大树时,递归...

    推荐一个MATLAB的多重分形工具箱-Fraclab.rar

    Fraclab是一个专为MATLAB设计的多重分形分析工具箱,它提供了丰富的函数和算法,使得用户能够方便地在MATLAB环境中进行多重分形的研究和应用。多重分形是一种扩展了传统分形理论的概念,它能更好地描述具有不同尺度...

    一个基于VC++的简单分形树

    分形树是一种在计算机图形学中常见的几何形态,它展示了自然界中许多复杂结构的自相似性。在本项目中,我们使用Visual C++(VC++)编程环境,结合Microsoft Foundation Classes(MFC)库,来实现一个简单的分形树...

    MFC实现分形云层

    分形云层是一种在计算机图形学中广泛使用的技术,用于模拟自然界的云朵形态。MFC(Microsoft Foundation Classes)是微软提供的C++类库,用于构建Windows应用程序。本项目利用MFC实现分形云层,旨在帮助开发者理解和...

    分形的matlab程序

    分形是一种在自然界中广泛存在的几何形态,它们具有自相似性和复杂的细节,即使在放大后仍然保持相似的结构。在数学、计算机科学和图形学等领域,分形有着重要的研究价值。MATLAB作为一种强大的数值计算和可视化工具...

    matlab.zip_分形_分形插值_分形插值matlab_分形插值曲线

    分形是一种具有自相似性质的几何形态,它们在自然界中广泛存在,如海岸线、山脉、云朵等。在数学和计算机科学中,分形理论被用来理解和模拟这些复杂形状和结构。分形插值是一种特殊的插值方法,它不仅考虑了数据点...

    数据结构分形树

    5. **可视化**:最后,使用图形库或编程语言的绘图功能将构建好的分形树可视化展示出来。 源代码可能会使用诸如Python、C++或Java等编程语言,利用递归或迭代的方式来实现这个过程。递归方法通常更加直观,因为它...

    MFC VC++实现Sierpinski分形图像

    在计算机图形学领域,Sierpinski分形是一种经典的几何构造,它展示了分形理论的美妙之处。在VC++环境中,结合MFC(Microsoft Foundation Classes)框架和OpenGL库,我们可以创建一个程序来可视化Sierpinski分形图像...

    广义分形Matlab源程序—Word版

    广义分形是一种数学概念,它扩展了传统分形理论,涵盖了更广泛的自相似和统计规律性结构。在本资源中,“广义分形Matlab源程序—Word版”提供了用Matlab编程语言实现广义分形算法的详细示例。Matlab作为一种强大的...

    e语言-易语言画分形图案简化版

    《易语言画分形图案简化版》是一款基于易语言编程的源码实例,它通过集成易语言的位图操作支持库以及调用操作系统API函数,实现了绘制分形图案的功能。这个程序旨在帮助初学者理解分形图形的生成原理,并提供了一个...

    分形图像代码(matlab)

    分形图像是一种在数学、计算机科学以及艺术领域中广泛应用的图像类型,它们具有自相似性和无限细节特性。在MATLAB这种强大的数值计算和图形处理环境中,实现分形图像的生成是一项有趣的挑战。本压缩包“fractals_1.2...

    vc++实现分形树的绘制

    在探讨“vc++实现分形树的绘制”这一主题时,我们不仅触及了计算机图形学的核心概念,还深入到了分形几何学的迷人世界。本文将详细解析代码片段中的关键知识点,包括如何在Visual C++(vc++)环境中构建一个基于界面...

    分形图像生成方法的研究

    文法构图法基于语言学中的文法规则,通过定义一系列绘图步骤来构建分形图像。这种方法的核心在于文法的定义,包括字母表、生成规则和初始字母。例如,在一个简单的LS文法体系中,字母表可能包含“L”和“R”,生成...

    分形的 VB 源程序

    在计算机图形学领域,分形是一种具有自相似性的几何形状,它们在不同尺度上展示出相同的复杂性。在本项目中,我们聚焦于两个著名的分形集:Mandelbrot集和Julia集。这些都是通过复数运算生成的数学对象,具有迷人的...

Global site tag (gtag.js) - Google Analytics