`
kidneyball
  • 浏览: 326941 次
  • 性别: 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

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

    这个是关于分形制图方面的一些资料,希望对大家有所帮助。呵呵

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

    从半坡彩陶的纹饰说到唐代铜镜纹饰的分形制图思想,模式识别方向

    tree_python_分形树叶_分形树_

    画一棵分形树,其中定义了树枝、树叶和花,使用海龟绘图

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

    Delphi绘图程序实例:绘制大树Tree节点,采用递归分形算法画一个树,点击一次画一次,画出支杆,代码有参考性。

    二维IFS迭代函数系统分形绘图

    内容索引:VC/C++源码,算法相关,二维,分形绘图,函数 二维IFS迭代函数系统分形绘图,看似树叶,实际上运用了很多算法才生成的图形。程序功能:改变视图、颜色设置、绘制命令、参数设置等,可以绘图进行一些自定义。

    Fractal Producer 分形图像生成器6.06版——含源代码

    在我的博客有说明,研究这方面的别错过了 ...6月6日更新 最新添加“高精度Julia”和“高精度Mand”算法,突破10的27次方放大倍数极限,现在很轻松到50次方倍,只是运算速度很慢,所以一般情况建议用 普通的算法,只是...

    基于C#的分形树.zip

    C#窗体应用程序的图形化界面设计以及GDI+绘图的一些基本指示,通过制作各种类型的分形树增强对于递归的理解,在创造分形图形的过程中感受编程的快乐 1.制作不同类型的分形图形(本次演示的是两种不同类型的分形树) 2....

    大家一起来玩分形——SimpleFractal0.01发布

    大家一起来玩分形,本程序为基于图片的分形程序,让分形创作变为一种游戏! <br>简单来说程序有两大特色: <br> 一、引入SQFormula复数计算引擎 <br> 利用该引擎,本程序实现了迭代公式、终止条件公式和...

    Fractal:Java分形绘图仪

    Java分形绘图仪曼德布罗特集Julia·塞特(Julia Set) 点击鼠标放大

    分形制图工具

    可制作五彩缤纷的图画

    分形和基于C++的分形参数化绘图 (2005年)

    对分形图形技术进行了一些研究.在分析分形图形形成的理论上,研究了分形图形的几种生成方法:基于L-系统的分形...通过研究各种方法的基本思想和生成过程,归纳筛选出决定其形态的参数,用Delphi语言实现分形绘图系统.

    java_lsys.rar_Lindermay_java 分形_分形 L系统_电脑中的花园

    Lindermayer系统(简称L系统)是另外一种分形图形生成的方法,其主要原理是设定基本简单的绘图规则,然后让计算机根据这些规则进行反复跌代,就可以生成各种各样的图形来。用L系统可以非常逼真的模拟植物的生长过程...

    基于C++ 实现 L 系统分形树【100010858】

    L-system 是一种分形图形生成的方法,其主要原理是设定基本简单的绘图规则,然后让计算机根据这些规则进行反复迭代,就可以生成各种各样的图形来。在我们的 L-system 生成树中,通过设定初始字符串,迭代数次将字符...

    基于C#窗体应用(GDI+)绘图实现分形树【100010176】

    详情介绍:https://www.yuque.com/sxbn/ks/100010176 通过C#窗体应用程序的图形化界面设计以及GDI+绘图的一些基本指示,通过制作各种类型的分形树增强对于递归的理解

    分形迭代系统(IFS)

    此程序完全使用html5的canvas特性,纯javascript开发。最适合的浏览器是opera和chrome,其他支持html5的浏览器:firefox4, ie9,... 程序是一个分形迭代系统的展示,画面非常好看。 请关注我的微博t.sina.com.cn/wjjnova

    Matlab分形植物模拟

    它来绘图。 对于L 系统可以用较复杂的图形解释,在除了模拟植物分支拓扑结构外,还要加上线段长度和转角等 几何形状。L 系统的符号串也称“龟行图”(turtle), 即设想一只乌龟在平面上爬行,乌龟的状态用三元组 (X...

    分形软件FMF

    用来制作分形图像的软件。由国内艺术家开发

    fractal:分形画家

    早期大一时候写的分形绘图程序,当时仅仅觉得分形好玩,写着玩玩。。代码比较烂,仅供参考学习。。。 主要功能 利用逃逸迭代法绘制Mandelbrot、Julia、Newton集 支持无限局部放大 支持颜色、常数因子等参数设置 支持...

    fractals:分形主要使用javascript和html5 canvas实现。 图的深度优先遍历和宽度优先遍历的示例。 面向对象的设计

    分形 该项目旨在实施和调查树木/图形/分形。 执行 当前,所有代码都是在jQuery库的帮助下使用javascript完成的。 渲染是使用HTML5和Canvas元素完成的。 程序是使用面向对象的设计和MVC模式的变体来实现的,以将模型...

Global site tag (gtag.js) - Google Analytics